【问题标题】:How to add already created figures to a subplot figure如何将已创建的图形添加到子图图形?
【发布时间】:2022-01-13 12:48:44
【问题描述】:

我创建了这个生成 ROC_AUC 的函数,然后我将创建的图形返回给一个变量。

from sklearn.metrics import roc_curve, auc
from sklearn.preprocessing import label_binarize
import matplotlib.pyplot as plt

def plot_multiclass_roc(clf, X_test, y_test, n_classes, figsize=(17, 6)):
    y_score = clf.decision_function(X_test)

    # structures
    fpr = dict()
    tpr = dict()
    roc_auc = dict()

    # calculate dummies once
    y_test_dummies = pd.get_dummies(y_test, drop_first=False).values
    for i in range(n_classes):
        fpr[i], tpr[i], _ = roc_curve(y_test_dummies[:, i], y_score[:, i])
        roc_auc[i] = auc(fpr[i], tpr[i])

    # roc for each class
    fig, ax = plt.subplots(figsize=figsize)
    ax.plot([0, 1], [0, 1], 'k--')
    ax.set_xlim([0.0, 1.0])
    ax.set_ylim([0.0, 1.05])
    ax.set_xlabel('False Positive Rate')
    ax.set_ylabel('True Positive Rate')
    ax.set_title('Receiver operating characteristic for Optimized SVC model')
    for i in range(n_classes):
        ax.plot(fpr[i], tpr[i], label='ROC curve (area = %0.2f) for label %i' % (roc_auc[i], i+1))
    ax.legend(loc="best")
    ax.grid(alpha=.4)
    sns.despine()
    plt.show()
    return fig

svc_model_optimized_roc_auc_curve = plot_multiclass_roc(svc_model_optimized, X_test, y_test, n_classes=3, figsize=(16, 10))

生成的图形如下所示: ROC curve for SVC model

我使用相同的函数为 5 个不同的模型创建了 5 条不同的 ROC 曲线,但将它们的图形重新用于分离变量。

然后我创建了一个子图图形,我认为它会显示所有这些图形。代码是:

将 matplotlib.pyplot 导入为 plt %matplotlib 内联

figs, ax = plt.subplots(nrows = 3,
                       ncols = 2,
                       figsize= (20, 20)
                       )

ax[0,0] = logmodel_roc_auc_curve
ax[0,1] = RandomForestModel_optimized_roc_auc_cruve
ax[1,0] = decisiontree_model_optimized_roc_auc_curve
ax[1,1] = best_clf_knn_roc_auc_curve
ax[2,0] = svc_model_optimized_roc_auc_curve

但是生成的结果是这样的: empty subplots

这个here也有类似的问题 但通过再次执行功能解决了。但如果可能的话,我想找到一种方法,将我已经拥有的数字简单地“粘贴”到子图中。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您需要与linked solution 中的完全相同。您不能存储绘图以供以后使用。请注意,在 matplotlib 中,figure 是带有一个或多个子图的周围图。每个子图都通过ax 引用。

    函数plot_multiclass_roc 需要修改:

    • 它需要一个ax as 参数,并且应该在该ax 上创建绘图。
    • fig, ax = plt.subplots(figsize=figsize) 应该被删除; fig 应该在函数外部之前创建
    • 还应从函数中删除plt.show()
    • 没有必要返回任何东西

    在函数之外,您可以创建无花果和坐标轴。在 matplotlib 中,有一个 not-well-followed convention 可以使用 axs 表示 ax 的复数形式(当指代子图时)。所以:

    fig, axs = plt.subplots(nrows = 3,
                            ncols = 2,
                            figsize= (20, 20)
                           )
    plot_multiclass_roc(...., ax=axs[0,0]) # use parameters for logmodel
    plot_multiclass_roc(...., ax=axs[0,1]) # use parameters for Random Forest
    plot_multiclass_roc(...., ax=axs[1,0]) # ...
    plot_multiclass_roc(...., ax=axs[1,1]) # ...
    plot_multiclass_roc(...., ax=axs[2,0]) # ...
    axs[2,1].remove() # remove the unused last ax
    plt.tight_layout()  # makes that labels etc. fit nicely
    plt.show()
    

    【讨论】:

    • 谢谢!我想这将是唯一的方法。我使用与我链接的替代解决方案相同的代码结构来完成此操作。谢谢您的意见。我会将 2 添加到您键入的最后一行代码中,以删除多余的未使用的子图并使标签非常适合。再次感谢您的回复!
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多