如何增大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
相关产品推荐
相关产品推荐

