python - 在混淆矩阵中从四面八方绘制标签
问题描述
我需要绘制从各个方面注释的混淆矩阵。我在右侧有问题,我想在底部打印相同的标签([...类名称...,'Total samples','Accuracy''mIoU'])。此外,顶部刻度似乎与底部刻度不对齐。
这是我尝试过的:
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
。尤其是原始的 y 轴被反转的事实ax
,导致新的 y 轴没有可见的刻度标签。不同的限制也阻止了 x 轴刻度的对齐。
ax_new.set_xlim(ax.get_xlim())
并且ax_new.set_ylim(ax.get_ylim())
应该解决问题。plt.tight_layout()
可以帮助将所有标签很好地定位在周围的图中。
右 y 刻度标签的旋转问题似乎有点困难。下面的代码通过分离轴twinx
和twiny
轴来解决它:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
fig, ax1 = plt.subplots()
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}, linewidths=2, ax=ax1,
cbar=False, linecolor='w', fmt='.2f')
ax_new1 = ax.twinx()
ax_new2 = ax_new1.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_new2.set_xticks(ticks)
ax_new1.set_yticks(ticks)
ax_new1.yaxis.set_label_position('right')
ax_new2.set_xticklabels([text.get_text() for text in ax.get_xticklabels()], fontsize=10, rotation=-45) # top
ax_new1.set_yticklabels(labels, fontsize=10, rotation=-45) # right
# set ticklabels
ax.set_xticklabels(labels, rotation=45, fontsize=10) # bottom
ax.set_yticklabels(ax.get_yticklabels(), rotation=25, fontsize=10) # left
ax_new2.set_xlim(ax.get_xlim())
ax_new1.set_ylim(ax.get_ylim())
plt.tight_layout()
plt.show()
推荐阅读
- javascript - 显示对象模板角度,计算重复单词的数量
- python - Python:处理重叠数据集
- amazon-web-services - PowerShell 7 和 AWS 模块 SSM:我如何实际连接?
- c# - 如何在 Visual Studio 上使用 Android 模拟器?
- java - java如何为其中的通用元素传递一个列表
- google-apps-script - 在 Google 表格中每 4 列重复一次的时间戳
- wpf - .net core WPF 依赖注入
- firebase - 调试 Firebase 云函数计时
- spring-boot - Camel Spring Boot 应用程序中是否有任何选项可以在处理完所有消息后关闭 JVM 进程?
- vue.js - 删除输入的边框并更改buefy中占位符的颜色