如何让Seaborn热力图的标注文本完全适配显示在单元格内
解决方案
标注显示不全的问题主要由配置顺序错误、数值格式化不合理两个核心原因导致,按以下修改即可解决:
核心改动点
- 调整字体配置顺序:seaborn的全局字体配置需要放在绘图代码之前才能生效,你之前将配置放在热力图绘制之后,缩放设置完全没有生效
- 修正百分比计算逻辑:原有代码直接用0~1区间的比例拼接%符号,会多占用2位字符宽度,乘以100后输出正常百分比即可减少无效字符占用
- 显式控制标注字体大小:在
annot_kws中添加size参数直接调整单元格内标注的字体大小,比全局缩放控制更精准 - 保存图片时添加
bbox_inches='tight'参数,避免边缘内容被画布截断
修正后可运行代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns def cm_analysis(cm, labels, figsize=(22,18)): # 可根据需求微调画布大小 cm_sum = np.sum(cm, axis=1, keepdims=True) cm_perc = cm / cm_sum.astype(float) * 100 # 乘以100得到正常百分比 annot = np.empty_like(cm).astype(str) nrows, ncols = cm.shape for i in range(nrows): for j in range(ncols): c = cm[i, j] p = cm_perc[i, j] if i == j: s = cm_sum[i][0] annot[i, j] = '%.2f%%\n%d/%d' % (p, c, s) elif c == 0: annot[i, j] = '' else: annot[i, j] = '%.2f%%\n%d' % (p, c) cm = pd.DataFrame(cm, index=labels, columns=labels) cm.index.name = 'Groundtruth labels' cm.columns.name = 'Predicted labels' # 字体配置移到绘图前,可根据需求调整缩放比例 sns.set(font_scale=1.0) fig, ax = plt.subplots(figsize=figsize) g = sns.heatmap( cm, cmap="BuPu", # 显式设置标注字体大小、字重、垂直居中 annot_kws={"weight": "bold", "size":9, "va":"center"}, annot=annot, fmt='', ax=ax, cbar_kws={'label': 'Number of samples'}, linewidths=0.1, linecolor='black' ) g.set_xticklabels(g.get_xticklabels(), rotation = 45, ha='right') # 加ha='right'让x轴标签对齐更美观 # 保存时添加bbox_inches避免截断 plt.savefig("filename.png", bbox_inches='tight', dpi=300) plt.show() normalised_confusion_matrix = np.array( [[186,3,0,1,2,0,3,3,7,1,2,0,0], [5,9,1,0,3,0,0,0,0,0,0,0,1], [0,0,49,3,0,0,0,0,1,0,0,0,6], [1,0,6,89,0,0,0,0,1,1,1,0,1], [3,7,0,0,50,0,0,0,6,0,1,0,0], [1,0,0,0,0,9,0,1,0,0,0,0,0], [3,0,1,0,0,0,54,0,0,0,3,0,0], [2,0,0,0,0,0,2,7,0,0,0,0,0], [3,0,0,0,2,1,2,0,53,2,4,0,0], [0,0,0,1,0,1,0,0,1,7,0,1,0], [1,1,0,0,1,0,1,0,3,0,52,0,0], [1,0,0,0,0,0,0,0,1,0,0,5,0], [0,0,11,2,0,0,0,0,0,0,0,0,26]] ) classes = ['Assemble system','Consult sheets','Picking in front','Picking left','Put down component','Put down measuring rod','Put down screwdriver','Put down subsystem','Take component','Take measuring rod','Take screwdriver','Take subsystem','Turn sheets'] cm_analysis(cm= normalised_confusion_matrix, labels = classes)
如果还是觉得显示拥挤,可以继续调小annot_kws里的size参数,或者进一步放大figsize的数值即可。
内容的提问来源于stack exchange,提问作者Mejdi Dallel
相关产品推荐
相关产品推荐

