如何将已创建的图形添加到子图形中

7
我创建了一个生成 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))

最终的图形大致如下:

SVC模型的ROC曲线

我使用同一函数创建了5个不同模型的ROC曲线,并将它们的图形分别存储到不同的变量中。

然后,我创建了一个subplot图形,用于显示所有这些曲线。代码如下:

import matplotlib.pyplot as plt
%matplotlib inline

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

这里有一个类似的问题链接,但是它通过再次执行函数来解决。但如果可能的话,我想找到一种方法,仅仅“粘贴”我已经有的图形到子图中。

1个回答

7
您需要的与链接解决方案中完全相同。您无法将绘图保存以供以后使用。请注意,在matplotlib中,figure是具有一个或多个子图的周围图。每个子图通过ax引用。

函数plot_multiclass_roc 需要进行一些更改:

  • 它需要一个ax参数,并且绘图应在该ax上创建。
  • fig, ax = plt.subplots(figsize=figsize)应该被删除;fig应在函数外部先前创建
  • plt.show()也应从函数中删除
  • 不需要返回任何内容

在函数外部,您可以创建fig和axes。在matplotlib中有一个很少遵循的约定,即在引用子图时将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”,以删除多余的subplot并使标签更加美观。再次感谢您的回复! - JOHN EDWARD BINAY
这对我很有帮助。但现在我想要一个子图的子图 - 这可能吗? - yeliabsalohcin
1
@yeliabsalohcin 请参考 https://dev59.com/vFsW5IYBdhLWcg3wfXJa - JohanC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接