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

如何为Seaborn热力图创建符合特定颜色规则的自定义颜色映射?

自定义Seaborn热力图颜色映射方案

需求

为Seaborn绘制的热力图创建自定义颜色映射:

  • 数值0对应红色
  • 数值1对应粉色
  • 数值-3对应蓝色
  • 0到1区间:红色逐渐过渡为粉色(颜色变浅)
  • 0到-3区间:红色逐步过渡为蓝色

原始代码如下:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd  # 原代码遗漏pandas导入,需补充

test_data = {"a":{"a":1 , "b":0.5, "c":-0.2, "d":-2.7} , "b":{"a":0.2 , "b":0, "c":-1.3, "d":-2}, "c":{"a":0 , "b":1, "c":-2.2, "d":-0.005}, "d":{"a":-3 , "b":0.9, "c":0.01, "d":-1.15}}
test_data_df = pd.DataFrame.from_dict(test_data)

fig, ax = plt.subplots(figsize=(11,9))
_ = sns.heatmap(test_data_df, annot=True)

解决方案

使用matplotlib.colors.LinearSegmentedColormap自定义分段渐变的颜色映射,精准匹配你的数值-颜色对应要求:

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

# 定义自定义颜色映射:指定关键数值对应的颜色及过渡
# 归一化位置计算:数值范围是-3到1,总跨度为4,每个数值的位置=(val - (-3))/4
custom_cmap = LinearSegmentedColormap.from_list(
    "my_custom_cmap",
    [
        (0.0, "blue"),       # -3对应蓝色,归一化位置=(-3 +3)/4=0.0
        (0.75, "red"),       # 0对应红色,归一化位置=(0 +3)/4=0.75
        (1.0, "pink")        # 1对应粉色,归一化位置=(1 +3)/4=1.0
    ]
)

test_data = {"a":{"a":1 , "b":0.5, "c":-0.2, "d":-2.7} , "b":{"a":0.2 , "b":0, "c":-1.3, "d":-2}, "c":{"a":0 , "b":1, "c":-2.2, "d":-0.005}, "d":{"a":-3 , "b":0.9, "c":0.01, "d":-1.15}}
test_data_df = pd.DataFrame.from_dict(test_data)

fig, ax = plt.subplots(figsize=(11,9))
# 热力图中启用自定义色卡,并锁定数值范围确保颜色映射准确
sns.heatmap(
    test_data_df,
    annot=True,
    cmap=custom_cmap,
    vmin=-3,  # 最小数值匹配-3
    vmax=1    # 最大数值匹配1
)
plt.show()

关键说明

  • 颜色映射逻辑:通过归一化数值位置,让matplotlib自动生成区间内的平滑渐变:
    • -3到0:蓝色逐步过渡到红色
    • 0到1:红色逐步过渡到粉色
  • 锁定数值范围:设置vmin=-3和vmax=1是核心,避免Seaborn自动缩放颜色范围导致映射偏差
  • 颜色自定义:可以替换"blue"、"red"、"pink"为HEX色值(如#FF0000代表纯红),实现更精准的颜色控制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:35:18