如何制作方形热图(总体图,而不是单元格)

How to make a square heatmap (overal plot, not the cells)

sns.heatmap 中的 square 属性以奇怪的方式工作。当我使用随机数绘制热图并使用 square 属性时,它工作正常。

当我用矩阵绘制热图时,它会正确创建热图。

但是,当我使用 square 属性时,绘图变成了一个小正方形。

我不知道这里出了什么问题。

好吧,square=True 的意思是:“将所有单元格显示为正方形”。将 7x560 个正方形放入绘图区域的唯一方法是将高度降低约 80 倍。换句话说:对于水平和垂直方向差异如此大的数据,强烈建议使用square=False。 Seaborn 在这里没有做错任何事,它只是给你想要的东西。

如果您希望热图是方形的(而不是单元格),您可以使用 ax = sns.heatmap(data, square=False) 然后 ax.set_aspect(data.shape[1] / data.shape[0])

这是一个例子:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

data = np.random.randn(7, 560).cumsum(axis=1).cumsum(axis=0)
data -= data.min(axis=1, keepdims=True)
data /= data.max(axis=1, keepdims=True)

ax = sns.heatmap(data, cmap='turbo', cbar=True, xticklabels=50,
                 yticklabels=['Grumpy', 'Dopey', 'Doc', 'Happy', 'Bashful', 'Sneezy', 'Sleepy'])
ax.set_aspect(data.shape[1] / data.shape[0])
ax.tick_params(labelrotation=0)
plt.tight_layout()
plt.show()