matplotlib 如何在热图中设置中心颜色

moiiocjp  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(202)

我想在seaborn中绘制一个热图。我的代码如下:

plt.rcParams['font.size'] = 13
plt.rcParams['font.weight'] = 'bold'
my_dpi=96
fig, ax = plt.subplots(figsize=(800/my_dpi, 600/my_dpi), dpi=my_dpi, facecolor='black')
rdgn = sns.diverging_palette(h_neg=130, h_pos=10, s=99, l=55, sep=3)
sns.heatmap(df, cmap=rdgn, center=0.00, annot=True, fmt ='.2%', linewidths=1.3, linecolor='black', cbar=False, ax=ax)
plt.savefig('./image/image.png', dpi=96, facecolor='black')

其结果如下:

我希望0为白色,大于0的值为红色,小于0的值为绿色,但是热图的中心无效。
顺便说一下,如何设置颜色不对称。因为我的数据中的最小值是-0.34,最大值是1.31。我想设置0为白色,-0.34为最绿,1.31为最红。

0yg35tkg

0yg35tkg1#

center需要一些可以居中的东西。所以你需要一个颜色Map表来代替调色板,调色板是一个颜色列表。Seaborn为这种情况提供了as_cmap参数。

sns.diverging_palette(..., as_cmap=True)

当然,您也可以使用任何其他matplotlib色彩Map表,或者指定您的自定义色彩Map表。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

data = np.linspace(-0.34, 1.31, 100).reshape(10,10)

fig, ax = plt.subplots()
rdgn = sns.diverging_palette(h_neg=130, h_pos=10, s=99, l=55, sep=3, as_cmap=True)
sns.heatmap(data, cmap=rdgn, center=0.00, annot=True, fmt ='.0%', 
            linewidths=1.3, linecolor='black', cbar=True, ax=ax)

plt.show()

如果你不想让色彩Map表居中,而是想移动它的中间点,那么你不能使用center,而应该使用matplotlib.colors.DivergingNorm

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import DivergingNorm
import seaborn as sns

data = np.linspace(-0.34, 1.31, 100).reshape(10,10)

fig, ax = plt.subplots()
rdgn = sns.diverging_palette(h_neg=130, h_pos=10, s=99, l=55, sep=3, as_cmap=True)
divnorm = DivergingNorm(vmin=data.min(), vcenter=0, vmax=data.max())
sns.heatmap(data, cmap=rdgn, norm=divnorm, annot=True, fmt ='.0%', 
            linewidths=1.3, linecolor='black', cbar=True, ax=ax)

plt.show()

在这里,完整的色彩Map表将在绿色部分被压缩,在红色部分被拉伸。

laik7k3q

laik7k3q2#

它看起来像seaborn的vminvmaxparameters。热图可能会帮助您:

sns.heatmap(df, cmap=rdgn, annot=True, fmt ='.2%', linewidths=1.3,
            linecolor='black', cbar=False, ax=ax, 
            vmin=-0.34, vmax=1.31)

然而,似乎没有一种方法可以将非发散颜色贴图的中心也设置为0,所以如果这是一个必需的特性,那么你就不能使用seaborn.heatmap。你能做的最好的事情是设置vmin = -vmax,这至少会使中心为白色。
看起来您可能有分歧的数据(没有硬限制),在这种情况下,您可以考虑使用divergent color maps之一(在这种情况下,您需要使用center=0,而不是vmin/vmax)。

相关问题