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

