Seaborn 热图 - 未应用对数色标

Seaborn heatmap - logarithmic color scale not applied

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

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、seaborn 0.10.1、matplotlib 3.2.2 和 pandas 1.0.5。该图很好地显示了这个问题: 我试过包含 center=1.0 关键字,它会关闭所有其他颜色方案。 奇怪的是,当我省略 cbar=None 关键字时,配色方案应用正确。但是,我在每个子图旁边都有一个颜色条,无法整齐地摆脱它(这样就不会出现丑陋的空白区域)。

如有任何帮助,我们将不胜感激。

干杯

似乎为了与 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 的限制: