【问题标题】:How to rotate Seaborn heatmap in python?如何在 python 中旋转 Seaborn 热图?
【发布时间】:2021-01-01 15:35:27
【问题描述】:

seaborn.heatmap 的默认设置给出

  • x 轴从 0 的原点开始,然后向 对
  • y 轴从原点 9 开始,然后向 向上

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

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

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

【问题讨论】:

    标签: python seaborn heatmap axis-labels yaxis


    【解决方案1】:

    你可以使用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],因此它提供的热图具有与将数组打印到控制台相同的布局。

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

    【讨论】:

    • 知道为什么plt.pcolormesh 是默认设置,而seaborn.heatmap() 给出了pcolormesh 默认设置的倒置转置吗?还是相反,pcolormesh 的方向错误,而heatmap 是正确的?两者谁做对了?
    • 答案已更新——它们都适用于不同的坐标系!
    【解决方案2】:

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

    【讨论】:

    • 这只是y轴刻度标签的翻转,与实际数据不对应,由于矩阵颜色与之前相同,因此您可以看到。我想在热图中旋转整个数据矩阵,真正纠正 y 轴
    • 我想我误解了这个问题的意图。
    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 2020-08-10
    • 2017-07-19
    • 2015-01-18
    • 1970-01-01
    • 2015-09-27
    • 2019-07-11
    • 2020-06-07
    相关资源
    最近更新 更多