如何在 python 中旋转 Seaborn 热图?

How to rotate Seaborn heatmap in python?

seaborn.heatmap 的默认设置给出

这与 matplotlib.pyplot.pcolormesh 相比很奇怪,它给出了一个从原点 0 开始向上移动的 y 轴,就像我们直觉上想要的那样,因为只有原点是 ( 0,0), 而不是 (0,9)!

如何让heatmap的y轴也从原点0开始向上移动,而不是从9开始? (当然相应地重新定位数据)

我尝试转置输入数据,但这看起来不对,轴也没有改变。我不认为需要围绕 y 轴翻转,而是热图的简单旋转。

您可以通过重置 yticklabels=[] 在左下角创建图表。这符合您的问题吗?

import seaborn as sns
import numpy as np
np.random.seed(0)

sns.set_theme()
uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data, yticklabels=[9,8,7,6,5,4,3,2,1,0])

您可以使用 ax.invert_yaxis():

翻转 y-axis
import seaborn as sns
import numpy as np
np.random.seed(0)

sns.set_theme()
uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data)
ax.invert_yaxis()

如果你想做你描述的旋转,你必须先转置矩阵:

import seaborn as sns
import numpy as np
np.random.seed(0)

sns.set_theme()
uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data.T)
ax.invert_yaxis()

不同的原因是它们采用了不同的坐标系。 pcolormesh 假设您想使用笛卡尔坐标访问元素,即 [x, y] 并以您期望的方式显示它们。 heatmap 假设您想使用数组坐标访问元素,即 [row, col],因此它提供的热图具有与将数组打印到控制台相同的布局。

为什么他们使用不同的坐标系?我会猜测,但我认为这是由于 2 个图书馆的年龄。 matplotlib,特别是它的旧命令是来自 Matlab 的端口,因此许多假设是相同的。 seaborn 是为 Python 开发的,专门针对统计可视化,并且在 pandas 已经存在之后。所以我猜 mwaskom 选择的布局是为了复制 DataFrame 打印到屏幕时的外观。