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

求助:如何按指定区间自定义Seaborn相关矩阵的颜色?

自定义Seaborn相关矩阵热力图的区间颜色

需要给Seaborn绘制的相关矩阵热力图按指定区间设置色块颜色:

  • (-1, -0.6):深蓝色
  • (-0.6, -0.2):蓝色
  • (-0.2, 0.2):白色
  • (0.2, 0.6):红色
  • (0.6, 1):深红色

现有代码尝试用线性渐变的自定义色卡,但无法实现离散区间的精准颜色映射,调整方案如下:

实现思路

要绑定离散区间和对应颜色,需使用matplotlib.colors.BoundaryNorm将区间边界与颜色列表一一对应,替代默认的线性颜色渐变逻辑。

修改后的完整代码

import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap, BoundaryNorm
import seaborn as sns
import pandas as pd

# 假设df_corr是你的相关矩阵DataFrame
corr = df_corr
corr = corr.fillna(0)

f, ax = plt.subplots(figsize=(15, 9))
f.set_facecolor('#061ab1')

# 定义对应区间的颜色
my_colors = [
    (0.0, 0.0, 0.5, 1.0),   # 深蓝色 (-1,-0.6)
    (0.0, 0.0, 1, 1),       # 蓝色 (-0.6,-0.2)
    (1, 1, 1, 1),           # 白色 (-0.2,0.2)
    (1, 0.0, 0.0, 1.0),     # 红色 (0.2,0.6)
    (0.5, 0.0, 0.0, 1.0)    # 深红色 (0.6,1)
]
# 定义区间边界(5种颜色对应6个边界点)
boundaries = [-1, -0.6, -0.2, 0.2, 0.6, 1]
# 创建离散颜色映射和归一化器
cmap = LinearSegmentedColormap.from_list('Custom', my_colors, len(my_colors))
norm = BoundaryNorm(boundaries, cmap.N)

# 绘制热力图,传入norm实现区间颜色映射
ax = sns.heatmap(
    corr, 
    cmap=cmap, 
    norm=norm,  # 关键:绑定区间与颜色的核心参数
    linewidths=.5, 
    linecolor='lightgray',
    annot=True, 
    fmt=".2f",
    annot_kws={'fontsize': 12, 'fontstyle': 'italic', 'color':'white'}  # 修正:将注释样式参数移至heatmap调用内
)

# 设置轴刻度样式
plt.xticks(rotation=20, color='white', size=10)
plt.yticks(rotation=0, color='white', size=10)
_, labels = plt.yticks()
plt.setp(labels, rotation=0)

# 调整颜色条:刻度设为区间中点,标签匹配区间含义
colorbar = ax.collections[0].colorbar
# 计算每个区间的中点作为刻度位置
tick_positions = [(-1 + (-0.6))/2, (-0.6 + (-0.2))/2, (-0.2 + 0.2)/2, (0.2 + 0.6)/2, (0.6 + 1)/2]
colorbar.set_ticks(tick_positions)
colorbar.set_ticklabels(
    ['Forte corrélation \n négative', 'Correlation négative', 'Corrélation faible','Corrélation positive','Forte corrélation \n positive'], 
    color='white'
)

plt.show()

关键修改说明

  1. 新增区间边界定义:boundaries列表明确划分了每个颜色对应的数值范围
  2. 使用BoundaryNorm:替代默认的线性归一化,确保每个区间严格对应指定颜色
  3. 修正注释样式参数:将annot_kws移至sns.heatmap的参数内,确保注释样式生效
  4. 调整颜色条刻度:用区间中点作为刻度位置,让标签与颜色区间对应更准确

内容的提问来源于stack exchange,提问作者Adrien Savoye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:55:41