我想在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设置为最红色。
答案 0 :(得分:1)
看起来seaborn.heatmap的vmin
和vmax
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()
如果要使颜色映射表居中而不是居中,则不能使用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()
在这里,完整的颜色图将被压缩为绿色部分,并被拉伸为红色部分。