You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Seaborn diverging_palette()调色板颜色与预期不符问题咨询

问题原因

你的代码存在两处核心配置错误,直接导致显示效果不符合预期:

  1. sep参数使用错误:sns.diverging_palette()中的sep参数控制色板中间无彩色(饱和度为0)区域的占比,取值越大,中间灰度区域越宽,两端高饱和彩色区域越窄。你设置sep=100时,纯红色仅出现在色板最两端的极窄范围内,相关系数的极值根本映射不到纯红位置,只能落在靠近中间的低饱和红色区间,也就是你看到的粉色。
  2. 映射范围未固定、中间色亮度不符合要求:你仅在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:09:25