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

