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

时间:2019-06-11 04:19:52

标签: python matplotlib seaborn heatmap

我想在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')

结果如下: enter image description here

我希望集合0为白色,而值> 0为红色,而值<0为绿色。但是热图中的中心无效。

顺便说一句,如何设置颜色不对称。因为我数据中的最小值是-0.34,最大值是1.31。我想将0设置为白色,将-0.34设置为最绿色,将1.31设置为最红色。

2 个答案:

答案 0 :(得分:1)

看起来seaborn.heatmap的vminvmax parameters可能会帮助您:

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而不是{{ 1}})。

答案 1 :(得分:1)

center将需要使 居中的内容。因此,您需要一个色图,而不是调色板(它是颜色的列表)。 Seaborn在这种情况下提供了as_cmap参数

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

或者,您当然可以使用任何其他matplotlib颜色图,或指定您的自定义颜色图。

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()

enter image description here

如果要使颜色映射表居中而不是居中,则不能使用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()

在这里,完整的颜色图将被压缩为绿色部分,并被拉伸为红色部分。

enter image description here