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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:45:03