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

如何在matplotlib/seaborn热图中为每个单元格条件定义颜色

seaborn热图自定义单元格颜色实现方案

你的两个需求均可以实现,以下是具体代码实现:

1. 按条件为特定数值单元格染色

你可以通过坐标定位的方式,给满足条件的单元格单独设置颜色,比如将数值为60的单元格设为绿色:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

# 替换为你的实际数据
data = np.random.randint(0, 100, size=(15, 15)) 

# 绘制基础热图
ax = sns.heatmap(data, cmap="coolwarm", annot=True)

# 筛选所有数值等于60的单元格
mask = data == 60

# 批量为符合条件的单元格上色
for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        if mask[i, j]:
            ax.add_patch(plt.Rectangle((j, i), 1, 1, color="green", edgecolor="white"))

plt.show()

2. 传入与数据同形状的numpy颜色数组绘图

完全支持该操作,你可以提前生成和数据形状严格一致的RGBA颜色数组,绘图时直接传入即可:

from matplotlib.colors import ListedColormap

# 生成形状为(行数, 列数, 4)的颜色数组,最后一维对应RGBA四个通道(取值范围0~1)
color_arr = np.zeros(data.shape + (4,))

# 自定义颜色规则,可根据需求任意调整
for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        val = data[i, j]
        if val == 60:
            color_arr[i,j] = [0, 1, 0, 1] # 绿色,不透明
        elif val < 30:
            color_arr[i,j] = [0.8, 0.9, 1, 1] # 浅蓝
        elif val < 70:
            color_arr[i,j] = [0.2, 0.5, 0.9, 1] # 深蓝
        else:
            color_arr[i,j] = [0.9, 0.2, 0.2, 1] # 红色

# 传入自定义颜色数组绘图
ax = sns.heatmap(
    data, 
    annot=True, # 保留原始数值标注
    cmap=ListedColormap(color_arr.reshape(-1, 4)),
    cbar=False # 如果不需要色条可以关闭,需要的话建议自定义离散色阶匹配规则
)
plt.show()

效率优化提示

如果数据尺寸较大,不需要循环遍历生成颜色数组,可以批量操作:

from matplotlib.cm import get_cmap

# 用基础色阶生成默认颜色
norm = plt.Normalize(data.min(), data.max())
base_cmap = get_cmap("YlGnBu")
color_arr = base_cmap(norm(data))

# 批量替换符合条件的单元格颜色
color_arr[data == 60] = [0, 1, 0, 1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:36:04