Seaborn热图上的次要x轴

4

I have a following DataFrame (called 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() 复制轴,但由于某种原因它没有起作用:整个热图会超出界限。

1个回答

2
你可以像这样做:

你可以这样做:

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()

这将产生以下图像:

在此输入图片描述


这个已经好了,但是还有三个问题: (1)去掉热力图周围的黑色边框;(2)将星号居中放置在每个单元格中——可以使用 ax3.set_xlim([0,ax2.get_xlim()[1]]) 来实现;(3)用 ax3.tick_params(left=False, top=False) 去掉星号下面的刻度。 - maciek
所以,您可以使用这些修改来编辑我的答案吗?这样其他用户也会更容易阅读。另外,请不要忘记添加结果图像,如果您不介意的话。 - Anwarvic
好的,这很不错,但是我希望有人能够发布一个单元格具有相等纵横比的答案。如果没有 - 我会接受这个答案。 - maciek
@maciek,你可以为ax2ax3都设置set_aspect("equal")。最后调用plt.tight_layout()使所有内容适应。 - JohanC
出于好奇,有没有办法保存包括次要X轴在内的这个图形?我一直在尝试使用标准的 fig.savefig() 来创建次要x轴之后,但是保存之后,图形不包括次要 x 轴。 - Bob McBobson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接