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 的热图一起使用,vmin
和 vmax
需要明确设置为 sns.heatmap
的参数。同样对于其他热图,seaborn 似乎从数据中重新计算 vmin
和 vmax
。绘制颜色条时,这些限制也会重新计算,在这种情况下,当 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 的限制:
我尝试用 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 的热图一起使用,vmin
和 vmax
需要明确设置为 sns.heatmap
的参数。同样对于其他热图,seaborn 似乎从数据中重新计算 vmin
和 vmax
。绘制颜色条时,这些限制也会重新计算,在这种情况下,当 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 的限制: