Matplotlib多子图混淆矩阵:共享统一坐标轴标签、自定义标签尺寸及隐藏子图标签问题求助
Matplotlib多子图混淆矩阵:共享统一坐标轴标签、自定义标签尺寸及隐藏子图标签问题求助
我完全理解你遇到的困扰——用ConfusionMatrixDisplay在共享轴的子图上绘图时,它自带的样式会覆盖全局rc参数,还会自动给每个子图添加重复的坐标轴标签,导致你想要的统一全局标签和自定义尺寸设置失效。下面是调整后的完整代码,完美解决这些问题:
解决思路
- 清除每个子图由
ConfusionMatrixDisplay自动生成的坐标轴标签,改用全局统一的共享标签 - 手动重置刻度标签大小,覆盖
ConfusionMatrixDisplay的默认样式 - 使用
fig.supxlabel和fig.supylabel添加底部和右侧的全局坐标轴标签 - 优化布局,避免标题和标签重叠
完整修改代码
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
相关产品推荐
相关产品推荐

