【问题标题】:Seaborn heatmap - logarithmic color scale not appliedSeaborn 热图 - 未应用对数色标
【发布时间】:2020-06-23 06:26:20
【问题描述】:

我尝试使用来自 pandas 数据帧的 seaborn 绘制四个子图。我的数据帧包含 1 到 9 及其倒数之间的整数值,因此 1/9、1/8 等...因此我尝试使用从 this question #36898008 获得的对数色标。 我使用以下方法创建 lognorm:

from matplotlib.colors import LogNorm

lognorm = LogNorm(vmin=1.0/9.0,vmax=9.0)

并将其应用于我的轴:

axes[i] = sns.heatmap(ldf, ax=axes[i], annot=True, mask=mask, linewidths=.5, norm=lognorm, cbar=None) 

效果很好,除非我的数据框中的所有值都是1.0,我的格式只是被抛到了海里。 我正在使用 python 3.6.9、seaborn0.10.1、matplotlib3.2.2 和pandas1.0.5。这张图很好地说明了这个问题: 我尝试过包含 center=1.0 关键字,它会关闭所有其他颜色方案。 奇怪的是,当我省略 cbar=None 关键字时,颜色方案会正确应用。但是,我在每个子图旁边都有一个颜色条,无法整齐地摆脱它(因此不会出现丑陋的空白)。

任何帮助将不胜感激。

干杯

【问题讨论】:

    标签: python matplotlib seaborn heatmap color-scheme


    【解决方案1】:

    似乎要使其与 Seaborn 的热图一起使用,vminvmax 需要明确设置为 sns.heatmap 的参数。同样对于其他热图,seaborn 似乎从数据中重新计算 vminvmax。绘制颜色条时,还会重新计算这些限制,在这种情况下,当 vmin 和 vmax 相等时,它会偶然给出所需的结果。

    from matplotlib import pyplot as plt
    from matplotlib.colors import LogNorm
    import seaborn as sns
    import numpy as np
    
    lognorm = LogNorm(vmin=1.0 / 9.0, vmax=9.0)
    
    fig, axs = plt.subplots(ncols=4, figsize=(12,4))
    for i, ldf in enumerate([np.eye(4), np.random.uniform(0, 2, (4, 4))]):
        sns.heatmap(ldf, annot=True, mask=ldf < 1 / 9, linewidths=.5,
                    norm=lognorm, cbar=None,
                    xticklabels=list('abcd'), yticklabels=list('abcd'), ax=axs[2*i])
        axs[2*i].set_title('without vmin, vmax')
        sns.heatmap(ldf, annot=True, mask=ldf < 1 / 9, linewidths=.5,
                    norm=lognorm, vmin=1.0 / 9.0, vmax=9.0, cbar=None,
                    xticklabels=list('abcd'), yticklabels=list('abcd'), ax=axs[2*i+1])
        axs[2*i+1].set_title('setting vmin, vmax')
    plt.show()
    

    添加颜色条时,如果未再次明确设置 LogNorm 的限制,也会重新计算:

    【讨论】:

    • 完美修复。非常感谢。
    猜你喜欢
    • 2021-04-14
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多