如何放大sklearn混淆矩阵的轴比例(非仅画布)适配多类别?
解决Sklearn混淆矩阵放大后仅画布变大的问题
我太懂这种烦恼了!20个类别的时候,光调figsize只会让画布空落落的,矩阵本身还是挤得看不清标签和数值。给你两个亲测有效的方案,直接解决这个问题:
方案1:用Seaborn热力图绘制(推荐)
Seaborn的heatmap比sklearn自带的绘图工具灵活得多,能单独控制矩阵元素、标签的大小,完美适配多类别场景:
import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import confusion_matrix # 替换成你的真实标签和预测结果 y_true = [你的真实标签列表] y_pred = [你的预测结果列表] class_labels = [f"类别{i}" for i in range(20)] # 替换成你的实际类别名称 # 生成混淆矩阵 cm = confusion_matrix(y_true, y_pred) # 设置足够大的画布(20个类别建议(15,12),可按需调整) plt.figure(figsize=(15, 12)) # 绘制混淆矩阵,重点调整这几个参数: sns.heatmap(cm, annot=True, # 显示每个格子的数值 fmt='d', # 数值格式(整数) cmap='Blues', # 配色方案 xticklabels=class_labels, yticklabels=class_labels, annot_kws={"size": 11}, # 控制数值的字体大小 linewidths=0.5) # 格子间的分隔线,让矩阵更清晰 # 调整坐标轴和标题的字体大小 plt.xlabel('预测类别', fontsize=13) plt.ylabel('真实类别', fontsize=13) plt.title('混淆矩阵', fontsize=15) # 自动调整布局,防止标签被截断 plt.tight_layout() plt.show()
方案2:用Sklearn官方的ConfusionMatrixDisplay
如果习惯用sklearn自带的工具,新版本可以用ConfusionMatrixDisplay,通过指定绘图轴来精准控制元素大小:
import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay y_true = [你的真实标签列表] y_pred = [你的预测结果列表] class_labels = [f"类别{i}" for i in range(20)] cm = confusion_matrix(y_true, y_pred) # 创建画布和轴对象,设置合适的尺寸 fig, ax = plt.subplots(figsize=(15, 12)) # 初始化并绘制混淆矩阵 disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=class_labels) disp.plot( ax=ax, cmap='Blues', values_format='d', xticks_rotation=45, # 旋转x轴标签,避免重叠 fontsize=11 # 控制标签和数值的字体大小 ) # 同样用tight_layout优化布局 plt.tight_layout() plt.show()
关键注意事项:
- 画布尺寸要匹配类别数:20个类别别用太小的
figsize,建议宽度≥12,高度≥10,根据标签长度再调整; - 单独控制字体大小:不管用哪种方法,一定要显式设置
fontsize或annot_kws,不然默认字体太小,放大画布也没用; - 旋转标签:如果类别名称较长,给x轴标签加个旋转(比如45度或垂直),防止重叠。
内容的提问来源于stack exchange,提问作者Akhan
相关产品推荐
相关产品推荐

