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

如何为Seaborn热力图添加自定义异常数据图例

给热力图添加外部异常图例的实现方法

你基于现有代码绘制了热力图,其中值为20的单元格用RGB(1.0000, 0.2716, 0.0000)(橙色)标记为实验异常,以下是添加外部图例的具体实现方案:

修改后的完整代码

import matplotlib
import seaborn as sns
import numpy as np
from matplotlib.colors import ListedColormap
from matplotlib.patches import Patch

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.cm.get_cmap('viridis').copy()

# 设置低于vmin和高于vmax的颜色
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')

# 给颜色条添加边框
cbar_ax = g.figure.axes[-1]
for spine in cbar_ax.spines.values():
    spine.set(visible=True)

# 标记值为20的异常单元格(修正原代码mask逻辑错误)
special_data = np.ma.masked_where(A!=20, A)
sns.heatmap(special_data, cmap=ListedColormap([(1.0000, 0.2716, 0.0000)]), 
            mask=(special_data != 20), cbar=False)

# 创建自定义图例并设置外部位置
legend_elements = [Patch(facecolor=(1.0000, 0.2716, 0.0000), label='异常(broken)')]
g.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(1.2, 1))

# 调整布局防止元素截断
g.figure.tight_layout()

# 显示图像
matplotlib.pyplot.show()

关键实现细节

  • 修正异常值标记逻辑:原代码中mask=(special_data != 1)是错误的,改为mask=(special_data != 20)后,才能准确标记值为20的单元格。
  • 自定义图例元素:使用Patch创建与异常颜色一致的方块,搭配对应文字标签。
  • 外部图例定位:通过bbox_to_anchor=(1.2, 1)将图例放在热力图右侧外部,loc='upper left'保证图例与热力图顶部对齐,完全避免遮挡主图。
  • 布局调整:tight_layout()自动适配图形元素位置,防止图例或颜色条被画布截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:42:38