首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对齐第二轴中心的热图y-滴答

如何对齐第二轴中心的热图y-滴答
EN

Stack Overflow用户
提问于 2022-09-14 16:41:04
回答 1查看 94关注 0票数 -1

我有这样一个数据框架:

代码语言:javascript
复制
l1 = ['A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B']
l2 = ['Name-1','Name-2','Name-3','Name-4','Name-5','Name-6','Name-7','Name-8','Name-9','Name-10','Name-11','Name-12','Name-13','Name-14','Name-15','Name-16','Name-17','Name-18','Name-19','Name-20']
v1 = [1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1]
v2 = [0,0,0,1,1,1,0,0,1,1,0,0,0,1,1,1,0,0,1,1]
v3 = [1,0,1,1,1,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0]
v4 = [0,0,0,0,1,1,1,0,0,1,0,0,0,0,1,1,1,0,0,1]
v5 = [1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,1]
v6 = [1,1,0,0,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,1]
v7 = [0,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,1,0,1]
v8 = [0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,1,1]
v9 = [1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,1,0,0,0,1]
v10 =[1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,0,1,1,0,1]
d = {'variable': l1, 'value': l2,'ID1': v1,'ID2': v2,'ID3': v3,'ID4': v4,'ID5': v5,'ID6': v6,'ID7': v7,'ID8': v8,'ID9': v9,'ID10': v10} 
df = pd.DataFrame(d)
df = df.set_index(['variable','value'])

sum_list = df.sum(axis=0)

我在左边和右边创建了一个带有Y字号标签的热图。看起来是这样的:

代码语言:javascript
复制
sns.set(rc={'figure.figsize': (10,10),'xtick.labelsize': 12,'ytick.labelsize': 12, 'axes.labelcolor': 'black',
           'ytick.left': True, 'ytick.right': True,'axes.grid': False,})
heat_map = sns.heatmap(df.reset_index(level='variable', col_level=0,drop=True),square=False,yticklabels=True,xticklabels=False,cmap=['#FFFFFF','#ff0303'],vmin=0,vmax=1,cbar=False,linewidths=1,linecolor='black', annot_kws={"fontsize":3})
heat_map.set_yticklabels(labels=heat_map.get_yticklabels(),weight='bold',color='black')
heat_map.set(xlabel=None,ylabel=None)
sec_axis=heat_map.twinx()
sec_axis.set_yticks(heat_map.get_yticks())
sec_axis.set_yticklabels(df.sum(axis=1).values[::-1], weight='bold', color='black', fontsize=12) ## Add tick labels which will be the sum
sec_axis.grid(False)

通过添加第二个y-滴答标签(右侧),我沿着四个边的边消失了,右边的边在中间不对齐。我想:

  1. Display热图和边缘visible
  2. Center-align在二次y-axis

上的细胞

我的热图是这样的:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-14 18:19:10

您可以使用tiwnx()添加第二轴。使用df.sum(axis=1).values[::-1]获取每行值的和,以便将和按正确的顺序设置,然后使用set_yticklabels()显示相同的值。将以下代码添加到现有代码中。

代码语言:javascript
复制
sec_axis=heat_map.twinx() ##sec_axis in the secondary axis (y axis on right)
sec_axis.set_yticks(heat_map.get_yticks()) ## Use same ticks as the primary axis
sec_axis.set_yticklabels(df.sum(axis=1).values[::-1], weight='bold', color='black', fontsize=12) ## Add tick labels which will be the sum
sec_axis.grid(False) ## Remove any grid lines for secondary axis if present

新REQ

我已经更新了代码以调整二级y-滴答。看起来边缘线在你最初的情节或请求中没有出现。不管怎么说,也添加了代码。

使用

  • 来调整y-ticks,使用get_ylim()并对其进行调整,使其调整为主要的y-滴答,并使用set_major_locator()来设置次要的y-滴答,但这似乎没有显示。用轴线和轴线代替。

代码语言:javascript
复制
l1 = ['A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B']
l2 = ['Name-1','Name-2','Name-3','Name-4','Name-5','Name-6','Name-7','Name-8','Name-9','Name-10','Name-11','Name-12','Name-13','Name-14','Name-15','Name-16','Name-17','Name-18','Name-19','Name-20']
v1 = [1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1]
v2 = [0,0,0,1,1,1,0,0,1,1,0,0,0,1,1,1,0,0,1,1]
v3 = [1,0,1,1,1,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0]
v4 = [0,0,0,0,1,1,1,0,0,1,0,0,0,0,1,1,1,0,0,1]
v5 = [1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,1]
v6 = [1,1,0,0,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,1]
v7 = [0,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,1,0,1]
v8 = [0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,1,1]
v9 = [1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,1,0,0,0,1]
v10 =[1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,0,1,1,0,1]
d = {'variable': l1, 'value': l2,'ID1': v1,'ID2': v2,'ID3': v3,'ID4': v4,'ID5': v5,'ID6': v6,'ID7': v7,'ID8': v8,'ID9': v9,'ID10': v10} 
df = pd.DataFrame(d)
df = df.set_index(['variable','value'])
sum_list = df.sum(axis=0)
sns.set(rc={'figure.figsize': (10,10),'xtick.labelsize': 12, 'ytick.labelsize': 12, 'axes.labelcolor': 'black', 'ytick.left': True, 'ytick.right': True})

heat_map = sns.heatmap(df.reset_index(level='variable', col_level=0, drop=True),square=False,yticklabels=True, xticklabels=False,cmap=['#FFFFFF','#ff0303'], vmin=0,vmax=1,cbar=False,linewidths=1, linecolor='black', annot_kws={"fontsize":3})
heat_map.set_yticklabels(labels=heat_map.get_yticklabels(),weight='bold',color='black')

sec_axis=heat_map.twinx()

import matplotlib.ticker
l = heat_map.get_ylim()
l2 = sec_axis.get_ylim()
f = lambda x : l2[0]+(x-l[0])/(l[1]-l[0])*(l2[1]-l2[0])
ticks = f(heat_map.get_yticks())
sec_axis.yaxis.set_major_locator(matplotlib.ticker.FixedLocator(ticks))

sec_axis.set_yticklabels(df.sum(axis=1).values, ha="center", weight='bold', color='black', fontsize=12, va="center")
sec_axis.grid(False)

heat_map.axhline(y = 0, color = 'k', linewidth = 5)
heat_map.axhline(y = 20, color = 'k', linewidth = 5)
heat_map.axvline(x = 0, color = 'k', linewidth = 5)
heat_map.axvline(x = 20, color = 'k', linewidth = 5)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73720441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档