Seaborn diverging_palette()调色板颜色与预期不符问题咨询
问题原因
你的代码存在两处核心配置错误,直接导致显示效果不符合预期:
sep参数使用错误:sns.diverging_palette()中的sep参数控制色板中间无彩色(饱和度为0)区域的占比,取值越大,中间灰度区域越宽,两端高饱和彩色区域越窄。你设置sep=100时,纯红色仅出现在色板最两端的极窄范围内,相关系数的极值根本映射不到纯红位置,只能落在靠近中间的低饱和红色区间,也就是你看到的粉色。- 映射范围未固定、中间色亮度不符合要求:你仅在
heatmap()中传入了center=0,没有显式指定vmin=-1、vmax=1,seaborn会自动根据输入数据的实际极值拉伸色板映射关系,进一步偏移颜色对应的数值位置;同时默认配置下diverging_palette()生成的中间无彩色亮度约为85%,达不到100%纯白的要求,因此显示为浅灰色。
修正代码
要实现「±1极值为100%纯红色、0中心为100%纯白色」的效果,最稳妥的方案是直接自定义对称色板,同时固定色值映射范围,修改后的代码如下:
import numpy as np import seaborn as sns import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap corr_matrix = ames_train_cleaned.select_dtypes(include=[np.number]).corr() fig, ax = plt.subplots(figsize=(15, 15)) # 构建两端纯红、中间纯白的对称发散色板 my_palette = LinearSegmentedColormap.from_list("red_white_red", ["#ff0000", "#ffffff", "#ff0000"]) _ = sns.heatmap( data=corr_matrix, ax=ax, mask=np.triu(corr_matrix, k=1), cmap=my_palette, vmin=-1, # 强制色板最小值匹配相关系数理论下限-1 vmax=1, # 强制色板最大值匹配相关系数理论上限1 center=0 )
如果你坚持使用diverging_palette()生成色板,需要将sep参数调小,注意该方式生成的中间色为接近白色的浅灰色,无法达到100%纯白效果:
my_palette = sns.diverging_palette(h_neg=0, h_pos=0, s=100, l=50, sep=1, center='light', as_cmap=True)
内容的提问来源于stack exchange,提问作者luukburger
相关产品推荐
相关产品推荐

