Python 在混淆矩阵中从四面打印标签
我需要绘制混乱矩阵,从各个方面进行注释。我想在右侧打印与底部相同的标签时遇到问题([…类名…,“总样本数”,“精度”“mIoU]”)。此外,似乎顶部刻度与底部刻度不对齐 以下是我尝试过的:Python 在混淆矩阵中从四面打印标签,python,matplotlib,heatmap,confusion-matrix,Python,Matplotlib,Heatmap,Confusion Matrix,我需要绘制混乱矩阵,从各个方面进行注释。我想在右侧打印与底部相同的标签时遇到问题([…类名…,“总样本数”,“精度”“mIoU]”)。此外,似乎顶部刻度与底部刻度不对齐 以下是我尝试过的: fig, ax1 = get_new_fig('Conf matrix default', figsize) ax = sn.heatmap(df_cm, annot=annot, annot_kws={"size": fz}, linewidths=lw, a
fig, ax1 = get_new_fig('Conf matrix default', figsize)
ax = sn.heatmap(df_cm, annot=annot, annot_kws={"size": fz}, linewidths=lw, ax=ax1,
cbar=cbar, cmap=cmap, linecolor='w', fmt=fmt)
ax_new = ax.twinx().twiny()
labels = ['' for _ in range(len(ax.get_xticklabels()))]
labels[-3] = 'Total samples'
labels[-2] = 'Accuracy'
labels[-1] = 'mIoU'
ticks = [tick for tick in ax.get_xticks()]
ax_new.set_xticks(ticks)
ax_new.set_yticks(ticks)
ax_new.yaxis.set_label_position('right')
ax_new.set_xticklabels([text.get_text() for text in ax.get_xticklabels()], fontsize=10, rotation=-45) # top
ax_new.set_yticklabels(labels, fontsize=10, rotation=-25) # right
# set ticklabels
ax.set_xticklabels(labels, rotation=45, fontsize=10) # bottom
ax.set_yticklabels(ax.get_yticklabels(), rotation=25, fontsize=10) # left
我非常感谢任何帮助,因为我不知道我是否在代码中遗漏了什么
提前感谢。问题在于新的
ax
的限制。这些需要等于原始ax
的限制。尤其是原始ax
的y轴被反转的事实,导致新的y轴没有可见的记号标签。不同的限制也会阻止x轴记号的对齐
ax\u new.set\u xlim(ax.get\u xlim())
和ax\u new.set\u ylim(ax.get\u ylim())
应该可以解决这个问题plt.tight_layout()
有助于在周围的绘图中很好地定位所有标签
右y记号标签的旋转问题似乎有点难。下面的代码通过分离twinx
和twiny
轴来解决此问题:
导入matplotlib.pyplot作为plt
导入seaborn作为sns
作为pd进口熊猫
将numpy作为np导入
图,ax1=plt.子批次()
ax1.set_title('Conf matrix default')
df_cm=pd.DataFrame(np.random.rand(9,9),columns=range(1,10),index=range(1,10))
ax=sns.heatmap(df_-cm,annot=True,annot_-kws={“size”:12},线宽=2,ax=ax1,
cbar=False,linecolor='w',fmt='.2f')
ax_new1=ax.twinx()
ax_new2=ax_new1.twny()
标签=[''表示范围内的(len(ax.getxticklabels())]
标签[-3]=“总样本”
标签[-2]=“准确度”
标签[-1]=“mIoU”
ticks=[在ax.getxticks()中为tick打勾]
ax_new2.set_xticks(刻度)
ax_new1.设置时钟(节拍)
ax_new1.yaxis.set_label_position('右')
ax_new2.set_xticklabels([text.get_text()表示ax.get_xticklabels()中的文本),fontsize=10,rotation=-45)顶部
ax_new1.设置_yticklabels(标签,fontsize=10,旋转=-45)#右
#设置标签
ax.set#xticklabels(标签,旋转=45,字体大小=10)#底部
ax.set_-yticklabels(ax.get_-yticklabels(),旋转=25,fontsize=10)#左
ax\u new2.set\u xlim(ax.get\u xlim())
ax\u new1.set\u ylim(ax.get\u ylim())
plt.紧_布局()
plt.show()
没错,几分钟前我自己解决了这个问题,但现在我无法在右侧标签上设置旋转角度,比如说45°。这似乎也出现在您的示例中。我不明白为什么它不工作。
twinx
和twiny
有点棘手。他们仍然是一种黑客。每一个都会在与上一个相同的位置上创建一个子地块。组合twinx
和twiny
可能会导致一些冲突。另一种方法是将文本放在任何地方(使用ax1.text(…,transform=ax1.get\u xaxis\u transform())
)。