如何用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
相关产品推荐
相关产品推荐

