Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在混淆矩阵中从四面打印标签_Python_Matplotlib_Heatmap_Confusion Matrix - Fatal编程技术网

Python 在混淆矩阵中从四面打印标签

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

我需要绘制混乱矩阵,从各个方面进行注释。我想在右侧打印与底部相同的标签时遇到问题([…类名…,“总样本数”,“精度”“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
的限制。尤其是原始
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())
)。