【问题标题】:Plot labels from all sides in confusion matrix在混淆矩阵中从四面八方绘制标签
【发布时间】:2021-03-13 15:50:31
【问题描述】:

我需要绘制从各个方面进行注释的混淆矩阵。我在右侧遇到问题,我想在底部打印相同的标签([...类名称...,'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

我非常感谢任何帮助,因为我不知道我是否遗漏了代码中的某些内容或什么。

提前致谢。

【问题讨论】:

    标签: python matplotlib heatmap confusion-matrix


    【解决方案1】:

    问题在于新 ax 的限制。这些需要等于原始ax 的限制。特别是原始ax 的 y 轴被反转的事实导致新的 y 轴没有可见的刻度标签。不同的限制也会阻止 x 轴刻度的对齐。

    ax_new.set_xlim(ax.get_xlim())ax_new.set_ylim(ax.get_ylim()) 应该可以解决问题。 plt.tight_layout() 可以帮助将所有标签很好地定位在周围的图中。

    右 y 刻度标签的旋转问题似乎有点困难。下面的代码通过分离 twinxtwiny 轴来解决它:

    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()
    

    【讨论】:

    • 是的,我在几分钟前自己解决了这个问题,但现在我无法设置旋转,比如说右侧标签上的 45°。它似乎也出现在您的示例中。我不知道为什么它不起作用。
    • twinxtwiny 有点棘手。他们仍然是一种黑客行为。每个都在与前一个相同的位置创建一个新的子图。结合twinxtwiny 可能会导致一些冲突。另一种方法是在任何地方放置文本(使用ax1.text(... , transform=ax1.get_xaxis_transform()))。
    猜你喜欢
    • 2013-10-25
    • 2013-10-14
    • 2016-01-31
    • 2020-10-24
    • 1970-01-01
    • 2020-01-22
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多