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

如何在Seaborn热力图中为特定值(如20)分配指定颜色

如何在Seaborn热力图中将特定中间值映射为指定颜色且不改变色条外观?

你的场景是基于viridis色板绘制热力图,已经通过set_over和set_under分别将90以上、10以下的值设为黑/白色,掩码也正常生效,现在需要把中间值20单独映射为橙色,同时保留当前色条的外观(不破坏原有渐变和上下限颜色设置)。

直接修改colormap会改变整体渐变规律,进而影响色条样式,因此最优方案是先完成热力图的基础绘制,再单独定位值为20的单元格,手动修改其颜色,具体实现如下:

修改后的完整代码

import matplotlib
import seaborn as sns
import numpy as np

np.random.seed(7)
A = np.random.randint(0,100, size=(20,20))
mask_array = np.zeros((20, 20), dtype=bool)
mask_array[:, :5] = True

cmap = matplotlib.colormaps["viridis"]
cmap.set_under("white")
cmap.set_over("black")

# 绘制基础热力图
g = sns.heatmap(A, vmin=10, vmax=90, cmap=cmap, mask=mask_array)
g.set_facecolor('lightgrey')

# 定位所有值为20的单元格并修改颜色
for i in range(A.shape[0]):
    for j in range(A.shape[1]):
        # 跳过被掩码的区域
        if mask_array[i, j]:
            continue
        if A[i, j] == 20:
            # 获取对应位置的单元格patch
            patch = g.axes.patches[i * A.shape[1] + j]
            patch.set_facecolor('orange')

关键说明

  • 基础绘制部分完全保留原有设置,确保色条和上下限颜色不受影响;
  • 通过遍历数据数组A的每个元素,结合掩码判断跳过不需要修改的区域;
  • 利用g.axes.patches获取热力图的所有单元格图形对象,定位到值为20的单元格后,调用set_facecolor直接修改其填充色;
  • 这种方式不会改动colormap本身,因此色条的外观(包括viridis渐变、上下限标记)完全保持原样。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:17:16