如何处理Seaborn热力图长标签并添加标签-值映射图例
问题解决:Seaborn热力图长标签优化与缩写图例实现
问题背景
使用Seaborn绘制热力图时遇到长标签显示困境:
- 调用
ax.figure.tight_layout()时,轴标签出现严重重叠 - 不调用该方法时,长标签会被画布边缘裁剪
同时需要基于label_ind_by_names创建缩写图例,实现通过缩写快速查询完整长标签的需求。
解决方案
核心思路
- 将热力图的轴标签替换为短缩写(如取长标签首字符),从根源避免标签重叠或裁剪问题
- 手动创建自定义图例,建立缩写与完整长标签的对应关系
- 调整画布布局,预留足够空间放置图例,确保所有元素完整显示
完整代码实现
import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns from matplotlib.patches import Patch n_classes = 10 confusion = np.random.randint(low=0, high=100, size=(n_classes, n_classes)) label_length = 20 label_ind_by_names = { "A"*label_length: 0, "B"*label_length: 1, "C"*label_length: 2, "D"*label_length: 3, "E"*label_length: 4, "F"*label_length: 5, "G"*label_length: 6, "H"*label_length: 7, "I"*label_length: 8, "J"*label_length: 9, } # 构建缩写与完整标签的映射 abbr_full_map = {key[0]: key for key in label_ind_by_names.keys()} # 提取缩写列表作为热力图的轴标签 abbr_labels = list(abbr_full_map.keys()) # 生成带缩写标签的混淆矩阵DataFrame df_cm = pd.DataFrame( confusion, index=abbr_labels, columns=abbr_labels ) # 创建画布并设置合适尺寸 fig, ax = plt.subplots(figsize=(10, 8)) sns.set(font_scale=1.2) # 绘制热力图 ax = sns.heatmap(df_cm, annot=True, annot_kws={"size": 16}, fmt='d', ax=ax) # 创建自定义图例:用无填充色块作为图例标记 legend_elements = [Patch(facecolor='white', edgecolor='black', label=f"{abbr}: {full}") for abbr, full in abbr_full_map.items()] # 将图例放置在热力图右侧,避免遮挡图表内容 ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(1.2, 1), title="标签对应关系") # 调整布局,确保图例和图表都能完整显示 plt.subplots_adjust(right=0.8) plt.show()
关键代码说明
- 缩写映射:通过
abbr_full_map提取长标签首字符作为缩写,建立缩写与完整标签的对应关系 - 轴标签替换:将DataFrame的行、列标签替换为缩写,彻底解决长标签的显示问题
- 自定义图例:利用
matplotlib.patches.Patch创建无填充色块作为图例项,清晰展示缩写与完整标签的对应关系 - 布局优化:通过
figsize设置合适画布大小,subplots_adjust预留右侧空间放置图例,避免元素互相遮挡
内容的提问来源于stack exchange,提问作者Gulzar
相关产品推荐
相关产品推荐

