如何在使用scikit learn/matplotlib绘制的混淆矩阵中设置Xticklabel的格式?

如何在使用scikit learn/matplotlib绘制的混淆矩阵中设置Xticklabel的格式?,matplotlib,plot,scikit-learn,axis-labels,confusion-matrix,Matplotlib,Plot,Scikit Learn,Axis Labels,Confusion Matrix,由于在web上找到了不同的代码示例,我用scikit learn/matplotlib绘制了一个混淆矩阵,但我一直在寻找如何在Xticklabel和主标题之间添加空格。如下图所示,绘图标题和Xticklabel重叠(+删除了ylabel'True') 以下是我使用的函数: 从sklearn.metrics导入混淆矩阵 将matplotlib.pyplot作为plt导入 PLOTS='/PLOTS/'#输出文件夹 def plt_混淆矩阵(y_测试,y_pred,normalize=False,

由于在web上找到了不同的代码示例,我用scikit learn/matplotlib绘制了一个混淆矩阵,但我一直在寻找如何在Xticklabel和主标题之间添加空格。如下图所示,绘图标题和Xticklabel重叠(+删除了ylabel'True')

以下是我使用的函数:

从sklearn.metrics导入混淆矩阵
将matplotlib.pyplot作为plt导入
PLOTS='/PLOTS/'#输出文件夹
def plt_混淆矩阵(y_测试,y_pred,normalize=False,title=“混淆矩阵”):
"""
绘制一个很好的混淆矩阵。
:param y_test:预测标签列表
:param y_pred:应预测的标签列表。
:param normalize:boolean。如果为False,则绘图显示预测的句子数。
如果为True,则显示预测的句子百分比。
:param title:string。绘图的标题。
:return:只将绘图保存为PNG文件并显示。
"""
标签=列表(集合(y_pred))
cm=混淆矩阵(y_测试、y_预测、标签)
图=plt.图()
ax=图添加_子批次(111)
cax=ax.matshow(cm,cmap=plt.cm.binary,interpolation='nearest')
如果正常化:
cm=cm.astype('float')/cm.sum(axis=1)[:,np.newaxis]
图suptitle(title,fontsize=14,wrap=True)
图颜色条(cax)
最大设置标签(['']+标签,旋转=45)
ax.设置标签(['']+标签)
plt.xlabel('Predicted')
plt.ylabel('True'))
plt子批次调整(hspace=0.6)
fmt='.2f'如果规格化,则其他'd'
thresh=cm.max()/1.5如果规格化其他cm.max()/2
对于范围内的i(厘米形状[0]):
对于范围内的j(厘米形状[1]):
最大文本(j,i,格式(cm[i,j],fmt),
ha=“中心”,va=“中心”,
color=“白色”如果cm[i,j]>thresh-else“黑色”)
plt.savefig(绘图+标题)
plt.show()
我必须旋转Xticklabel,因为它们太长,并且在水平方向上相互重叠;我必须包装标题,因为标题也太长,无法完全显示在图像中

我在另一篇文章中看到,Xticklabel也可以放在图的下面(如中),因此它可能是一个解决方案,但我不知道如何制作它

如何解决问题?

  • 在标题和Xticklabel之间添加一些空格 (让它们看起来完全是顺带一提)
  • 或使ylabel“True”可见
  • 或移动图形下方的Xticklabel。
编辑:我尝试了geekzeus的两种解决方案,但都没有成功

  • geekzeus第一个解决方案的结果:
  • geekzeus第二个解决方案的结果:
    • 像这样做

      ax.set_xlabel('Predicted labels') 
      ax.set_ylabel('True labels')       
      ax.set_title('Confusion Matrix')   
      #xaxisticks
      ax.xaxis.set_ticklabels(['A', 'B']) 
      #yaxis ticks
      ax.yaxis.set_ticklabels(['B', 'A']) 
      
      或 使用seaborn和matplotlib,您还可以直接向ticks提供列表变量

      import seaborn as sns
      import matplotlib.pyplot as plt     
      
      cm = confusion_matrix(true_classes, predicted_classes)
      
      ax= plt.subplot()
      sns.heatmap(cm, annot=True, ax = ax); #annot=True to annotate cells
      
      # labels, title and ticks
      ax.set_xlabel('Predicted labels')
      ax.set_ylabel('True labels') 
      ax.set_title('Confusion Matrix')
      ax.xaxis.set_ticklabels(['A', 'B'])   
      ax.yaxis.set_ticklabels(['B', 'A'])
      

      您可以使用参数
      x
      y
      指定标题的位置。如果调整
      y
      的值,可以生成所需的绘图

      fig.suptitle(title, fontsize=14, wrap=True, y=1.2)
      

      我认为它可以工作,因为PyCharm预览显示了一个很好的结果,但保存的图像仍然是一样的:'(以下是我使用的代码:ax.set\u xlabel('Predicted')ax.set\u ylabel('True')ax.set\u title('n\n\n\n\n')ax.xaxis.set\u ticklebels(['']+标签,旋转=45)ax.yaxis.set\u ticklebels(['']+标签)我也用seaborn尝试了你的解决方案:xtick标签在下面,但仍然在保存的PNG文件中剪切(尽管预览中没有问题)。但是,ytick标签重叠,我找不到如何水平放置它们(旋转=90不起作用)。更糟糕的是:图中显示的数字是在科学模式下,如“1.9e+03”…我想你还没有解决它..不如提供数据和代码以及你需要的可复制示例和示例输出