如何在python中旋转Seaborn heatmap?

问题描述

seaborn.heatmap认设置为

enter image description here

  • x轴从0的原点开始,然后朝的方向增加
  • y轴从原点9开始,然后朝y方向增加 向上

matplotlib.pyplot.pcolormesh相比,这很奇怪,它给出的y轴从原点0开始向上移动,就像我们直观地希望的那样,因为它只对原点有意义(0, 0),而不是(0,9)!

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

我尝试转置输入数据,但这看起来不正确,并且轴没有变化。我认为这不是所需的y轴翻转,而是简单地旋转热图。

解决方法

您可以使用ax.invert_yaxis()翻转y轴:

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]访问元素,因此它给出的热图的布局与将数组打印到控制台的布局相同。

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

,

您可以通过重置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])

enter image description here