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

如何用Seaborn绘制区间分色热力图?指定范围用不同色系

实现区间依赖配色的Seaborn热力图

问题说明

给定如下DataFrame:

min      mean    max
ALU        -0.008   0.000   0.034
BRENT      -0.017   0.000   0.023
CU         -0.011   0.000   0.013
DTD_BRENT  -0.011   0.000   0.019
GASOIL     -0.009   0.000   0.035
GOLD       -0.008   0.000   0.009
HH         -0.033  -0.001   0.009
JET_CCN    -0.009   0.000   0.033

需要用Seaborn绘制热力图,要求**-0.03至0.03范围内的值呈现绿色系渐变,超出该区间的值呈现红色系渐变**。现有基础代码无法实现该效果:

plt.figure(figsize=(12, 8))
sns.heatmap(df, cmap=sns.color_palette(['red', 'green', 'red']), center= 0, annot=True)
plt.title("Heatmap")
plt.show()

解决方案

通过自定义颜色映射(Colormap)和区间归一化器(BoundaryNorm)可以实现需求,具体步骤如下:

1. 导入依赖库

import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.colors as mcolors

2. 自定义颜色规则与映射

设定数值区间及对应配色:

  • 数值 < -0.03:红色
  • -0.03 ≤ 数值 ≤ 0.03:绿色系平滑渐变
  • 数值 > 0.03:红色

代码实现:

# 定义数值区间边界
bounds = [-float('inf'), -0.03, 0.03, float('inf')]
# 定义对应颜色序列(深红-浅绿-深绿-深红)
colors = ['#ff4444', '#aaffaa', '#00cc00', '#ff4444']

# 创建自定义颜色映射和区间归一化器
cmap = mcolors.LinearSegmentedColormap.from_list('custom_green_red', colors, N=256)
norm = mcolors.BoundaryNorm(bounds, cmap.N)

3. 绘制热力图

调用sns.heatmap时传入自定义的cmap和norm:

plt.figure(figsize=(12, 8))
# fmt='.3f'确保标注保留三位小数,更清晰
sns.heatmap(df, cmap=cmap, norm=norm, annot=True, fmt='.3f', cbar=True)
plt.title("区间配色热力图")
plt.show()

优化绿色渐变效果

如果想要更自然的绿色系渐变,可以用Seaborn的调色板生成绿色过渡色:

# 生成128阶的绿色渐变调色板
green_gradient = sns.light_palette("green", as_cmap=False, n_colors=128)
# 拼接红色+绿色渐变+红色的颜色序列
colors = ['#ff4444'] + list(green_gradient) + ['#ff4444']
# 重新创建颜色映射
cmap = mcolors.LinearSegmentedColormap.from_list('custom_green_red', colors, N=256)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:53:30