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

如何增大Matplotlib中Y轴刻度标签与混淆矩阵的间距?

解决Matplotlib混淆矩阵Y轴刻度标签与矩阵间距问题

你遇到的问题我很熟悉——用labelpad或者全局的ytick.major.pad设置后没效果,主要是因为最后调用的plt.tight_layout()会自动收紧布局,覆盖了你手动设置的间距参数。另外,直接全局配置有时候不如针对坐标轴对象精准控制来得可靠。

这里有两个可行的解决方法,你可以根据需求选择:


方法一:针对坐标轴对象设置刻度标签间距

直接获取当前绘图的坐标轴对象,用tick_params()方法单独设置Y轴刻度标签的间距,这个设置不会被tight_layout轻易覆盖:

修改你的代码,在设置plt.yticks(...)之后添加以下内容:

# 获取当前坐标轴
ax = plt.gca()
# 设置Y轴刻度标签与矩阵边缘的间距,pad值按需调整
ax.tick_params(axis='y', pad=25)

同时,你可以保留plt.tight_layout(),但可以给它加一个pad参数,让整体布局留出更多空间:

plt.tight_layout(pad=3)

方法二:调整tight_layout参数并配合全局设置

如果你更习惯用全局配置,可以保留plt.rcParams['ytick.major.pad']的设置,但需要调整tight_layout的参数,避免它挤压空间:

把原来的plt.tight_layout()改成:

plt.tight_layout(pad=5)  # pad值越大,整体布局的留白越多

不过这种方法的可控性不如方法一,因为全局设置会影响所有绘图元素。


修改后的完整代码

这里是整合了方法一的完整代码,你可以直接运行测试:

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import itertools

def plot_confusion_matrix(cm, classes, normalize=False, title='Confusion matrix', cmap=plt.cm.Blues):
    """
    This function prints and plots the confusion matrix.
    Normalization can be applied by setting `normalize=True`.
    """
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')

    plt.close()
    plt.rcParams['figure.dpi'] = 300
    plt.rcParams['figure.figsize'] = 9, 9
    mpl.rcParams['font.family'] = 'Avenir'
    plt.rcParams['font.size'] = 18
    plt.rcParams['axes.linewidth'] = 2

    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title, pad = 25)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)

    # 新增:获取坐标轴并设置Y轴刻度标签间距
    ax = plt.gca()
    ax.tick_params(axis='y', pad=25)  # 调整这个pad值来控制间距大小

    plt.ylabel('True label', labelpad=10)
    plt.xlabel('Predicted label', labelpad=10)

    fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")
    plt.tight_layout(pad=3)

myarray = np.array([[ 6, 4, 2, 0],
                    [ 4, 57, 3, 0],
                    [ 4, 3, 12, 0],
                    [ 4, 3, 0, 0]])
plot_confusion_matrix(myarray, ["a","b","c","d"])

你可以根据需要调整ax.tick_params(axis='y', pad=XX)里的pad数值,直到得到你想要的间距效果。

内容的提问来源于stack exchange,提问作者Johnny Tam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:28:13