问题描述
seaborn.heatmap
的默认设置为
与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])