Seaborn热图上的次级x轴

Secondary x-axis on a seaborn heatmap

提问人:maciek 提问时间:6/15/2020 最后编辑:ppperymaciek 更新时间:6/16/2020 访问量:2580

问:

我有一个以下 DataFrame(称为):hehe

    11  22  33  44  55  66  77
s1  -3  5   7   8   -9  4   7
s2  4   3   8   1   4   4   -12
s3  1   -2  1   -4  8   8   -8
s4  -6  4   -4  9   -4  2   -6

然后是以下代码:

fig, (ax1, ax2) = plt.subplots(1,2, figsize=(6,4), gridspec_kw={'width_ratios':(1,15)})
sns.heatmap(hehe, ax=ax2, cbar=False, cmap="coolwarm", linewidth=1, vmin=-25, vmax=25)
ax2.set_aspect("equal")
ax2.set_title("A", fontsize=20, pad=30)

plt.colorbar(plt.cm.ScalarMappable(cmap="coolwarm", norm=mpl.colors.Normalize(vmin=-25, vmax=25)), cax=ax1)
ax1.yaxis.set_ticks_position('left')

生成一个图:
enter image description here

我想在热图的顶部添加一个额外的 x 轴,这将帮助我用星号标记列(用于统计显着性)。假设它是:
我不知道如何实现这一目标......我一直在玩复制轴,但由于某种原因它对我不起作用:整个热图都超出了界限。
new_annotation = ["","","","","*","*",""]twiny()

python matplotlib 数据可视化 seaborn

评论


答:

2赞 Anwarvic 6/15/2020 #1

你可以做这样的事情:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# hehe = pd.read_clipboard()
fig, (ax1, ax2) = plt.subplots(1,2, figsize=(6,4), gridspec_kw={'width_ratios':(1,15)})
sns.heatmap(hehe, ax=ax2, cbar=False, cmap="coolwarm", linewidth=1, vmin=-25, vmax=25)
# ax2.set_aspect("equal")
ax2.set_title("A", fontsize=20, pad=40)

ax3 = ax2.twiny()
# ax3.set_aspect("equal")
ax3.set_xlim([0,ax2.get_xlim()[1]])
ax3.set_xticks(ax2.get_xticks())
ax3.set_xticklabels(["","","","","*","*",""], fontsize=16)
ax3.tick_params(top=False)
ax3.spines['top'].set_visible(False)
ax3.spines['right'].set_visible(False)
ax3.spines['bottom'].set_visible(False)
ax3.spines['left'].set_visible(False)

plt.colorbar(plt.cm.ScalarMappable(cmap="coolwarm", norm=plt.Normalize(vmin=-25, vmax=25)), cax=ax1)
ax1.yaxis.set_ticks_position('left')

# plt.tight_layout()
# plt.show()

这将产生此图像:

enter image description here

评论

0赞 maciek 6/15/2020
这样更好,但有三个问题:(1)删除热图周围的黑色边框(2)将每个单元格的星星居中 - 这可以通过以下方式完成:(3)删除星星下方的刻度ax3.set_xlim([0,ax2.get_xlim()[1]])ax3.tick_params(left=False, top=False)
0赞 Anwarvic 6/15/2020
那么,你能用这些修改来编辑我的答案吗?对于其他用户来说会更容易。另外,如果您不介意,请不要忘记添加生成的图像
0赞 maciek 6/15/2020
好的,这很好,但是,我希望有人可以发布单元格纵横比相等的答案。如果没有 - 我会接受这个答案。
0赞 JohanC 6/16/2020
@maciek 您可以同时为 和 .最后打电话,让一切都适合。set_aspect("equal")ax2ax3plt.tight_layout()
0赞 Bob McBobson 10/13/2022
出于好奇,有没有办法保存这个图形,包括辅助 x 轴?我一直在尝试在制作辅助 x 轴后使用该标准,但在保存后,该图不包括辅助 x 轴。fig.savefig()