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

Matplotlib多子图混淆矩阵:共享统一坐标轴标签、自定义标签尺寸及隐藏子图标签问题求助

Matplotlib多子图混淆矩阵:共享统一坐标轴标签、自定义标签尺寸及隐藏子图标签问题求助

我完全理解你遇到的困扰——用ConfusionMatrixDisplay在共享轴的子图上绘图时,它自带的样式会覆盖全局rc参数,还会自动给每个子图添加重复的坐标轴标签,导致你想要的统一全局标签和自定义尺寸设置失效。下面是调整后的完整代码,完美解决这些问题:

解决思路

  1. 清除每个子图由ConfusionMatrixDisplay自动生成的坐标轴标签,改用全局统一的共享标签
  2. 手动重置刻度标签大小,覆盖ConfusionMatrixDisplay的默认样式
  3. 使用fig.supxlabel和fig.supylabel添加底部和右侧的全局坐标轴标签
  4. 优化布局,避免标题和标签重叠

完整修改代码

import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib

# 全局刻度大小基础设置
matplotlib.rc('xtick', labelsize=6)
matplotlib.rc('ytick', labelsize=6)

# 创建2x2共享轴子图
fig, axs = plt.subplots(2, 2, figsize=(8, 8), sharex=True, sharey=True)
fig.suptitle('Confusion Matrix', fontsize=10)

# 设置每个子图的标题
axs[0,0].set_title("NS Flow", fontsize=8)
axs[0,1].set_title("Capacity", fontsize=8)
axs[1,0].set_title("Cost", fontsize=8)
axs[1,1].set_title("Efficiency", fontsize=8)

# 准备所有混淆矩阵的显示对象
cm_list = [
    # NS Flow 混淆矩阵
    ConfusionMatrixDisplay(
        confusion_matrix=confusion_matrix(y_test, y_pred_binary['NSflow']),
        display_labels=[False, True]
    ),
    # Capacity 混淆矩阵
    ConfusionMatrixDisplay(
        confusion_matrix=confusion_matrix(y_test, y_pred_binary['capacity']),
        display_labels=[False, True]
    ),
    # Cost 混淆矩阵
    ConfusionMatrixDisplay(
        confusion_matrix=confusion_matrix(y_test, y_pred_binary['cost']),
        display_labels=[False, True]
    ),
    # Efficiency 混淆矩阵
    ConfusionMatrixDisplay(
        confusion_matrix=confusion_matrix(y_test, y_pred_binary['efficiency']),
        display_labels=[False, True]
    )
]

# 遍历绘制每个混淆矩阵并调整样式
for ax, cm_display in zip(axs.flat, cm_list):
    # 绘制混淆矩阵,可通过text_kw调整矩阵内数字的字体大小
    cm_display.plot(ax=ax, text_kw={'fontsize': 6})
    # 清除子图自动生成的坐标轴标签(改用全局标签)
    ax.set_xlabel('')
    ax.set_ylabel('')
    # 强制设置刻度标签大小,覆盖ConfusionMatrixDisplay的默认样式
    ax.tick_params(axis='both', labelsize=6)

# 添加全局共享的坐标轴标签
fig.supxlabel('Predicted label', fontsize=8)
fig.supylabel('True label', fontsize=8)

# 调整布局,预留顶部标题空间,避免重叠
fig.tight_layout(rect=[0, 0, 1, 0.97])

plt.show()

关键细节说明

  • 清除重复标签:ConfusionMatrixDisplay.plot()会自动给每个子图添加Predicted label和True label,我们手动清空这些子图标签,改用全局的supxlabel/supylabel实现统一标签
  • 强制刻度大小:由于ConfusionMatrixDisplay会重置刻度样式,覆盖全局rc参数,因此在绘制后用tick_params手动指定刻度标签大小
  • 矩阵内数字调整:通过plot()方法的text_kw参数可以修改混淆矩阵内部数值的字体大小,适配你的小尺寸子图
  • 布局优化:tight_layout的rect参数预留了顶部标题的空间,防止主标题和子图标题重叠

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:19:29