【问题标题】:How to stop plots printing twice in jupyter when using subplots?使用子图时如何在jupyter中停止打印两次?
【发布时间】:2020-05-19 09:15:20
【问题描述】:

我正在处理泰坦尼克号数据,我正在尝试使用 pyplot 和 seaborn 的组合来生成一些子图。 我编写了以下代码以在 3x2 网格中创建 6 个子图;

plt.rcParams['figure.figsize'] = [12, 8]
fig, axes = plt.subplots(nrows=3, ncols=2)
plt.tight_layout()

_ = sns.catplot(x='Pclass', y='Age', data=train_df, kind='box', height=8, palette=col_pal, ax=axes[0, 0])
_ = sns.catplot(x='Embarked', y='Age', data=train_df, kind='box', height=8, palette=col_pal, ax=axes[0, 1])
_ = sns.catplot(x='Sex', y='Age', data=train_df, kind='box', height=8, palette=col_pal, ax=axes[1, 0])
_ = sns.catplot(x='Sex', y='Age', hue='Pclass', data=train_df, kind='box', height=8, palette=col_pal, ax=axes[1, 1])
_ = sns.catplot(x='SibSp', y='Age', data=train_df, kind='box', height=8, palette=col_pal, ax=axes[2, 0])
_ = sns.catplot(x='Parch', y='Age', data=train_df, kind='box', height=8, palette=col_pal, ax=axes[2, 1])
plt.show()

当我在笔记本中运行它时,它成功地创建了所需的图,但是,之后它还会打印出 6 个空白图。

如何禁止这些空图打印到我的输出中?

【问题讨论】:

    标签: python matplotlib jupyter seaborn


    【解决方案1】:

    将每个图分配给g 等变量,并使用plt.close(g.fig) 删除不需要的子图。或者遍历所有 sns.axisgrid.FacetGrid 类型变量并像这样关闭它们:

    for p in plots_names:
        plt.close(vars()[p].fig)
    

    下面的完整 sn-p 就是这样做的。请注意,我正在使用 train_df = sns.load_dataset("titanic") 加载泰坦尼克号数据集。在这里,与您的示例不同,所有列名都是小写的。我还删除了 palette=col_pal 参数,因为您的 sn-p 中没有定义 col_pal

    剧情:

    代码:

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    plt.rcParams['figure.figsize'] = [12, 8]
    fig, axes = plt.subplots(nrows=3, ncols=2)
    plt.tight_layout()
    
    train_df = sns.load_dataset("titanic")
    
    g = sns.catplot(x='pclass', y='age', data=train_df, kind='box', height=8, ax=axes[0, 0])
    h = sns.catplot(x='embarked', y='age', data=train_df, kind='box', height=8, ax=axes[0, 1])
    i = sns.catplot(x='sex', y='age', data=train_df, kind='box', height=8, ax=axes[1, 0])
    j = sns.catplot(x='sex', y='age', hue='pclass', data=train_df, kind='box', height=8, ax=axes[1, 1])
    k = sns.catplot(x='sibsp', y='age', data=train_df, kind='box', height=8, ax=axes[2, 0])
    l = sns.catplot(x='parch', y='age', data=train_df, kind='box', height=8, ax=axes[2, 1])
    
    # iterate over plots and run
    # plt.close() to prevent duplicate
    # subplot setup
    var_dict = vars().copy()
    var_keys = var_dict.keys()
    plots_names = [x for x in var_keys if isinstance(var_dict[x], sns.axisgrid.FacetGrid)]
    for p in plots_names:
        plt.close(vars()[p].fig)
    

    请注意,您必须将您的图分配给变量名称才能使其工作。如果您只是将关闭图的 sn-p 添加到原始 sn-p 的末尾,则重复的子图设置将保持不变。

    代码 2:

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    plt.rcParams['figure.figsize'] = [12, 8]
    fig, axes = plt.subplots(nrows=3, ncols=2)
    plt.tight_layout()
    
    train_df = sns.load_dataset("titanic")
    
    _ = sns.catplot(x='pclass', y='age', data=train_df, kind='box', height=8, ax=axes[0, 0])
    _ = sns.catplot(x='embarked', y='age', data=train_df, kind='box', height=8, ax=axes[0, 1])
    _ = sns.catplot(x='sex', y='age', data=train_df, kind='box', height=8, ax=axes[1, 0])
    _ = sns.catplot(x='sex', y='age', hue='pclass', data=train_df, kind='box', height=8, ax=axes[1, 1])
    _ = sns.catplot(x='sibsp', y='age', data=train_df, kind='box', height=8, ax=axes[2, 0])
    _ = sns.catplot(x='parch', y='age', data=train_df, kind='box', height=8, ax=axes[2, 1])
    
    # iterate over plots and run
    # plt.close() to prevent duplicate
    # subplot setup
    var_dict = vars().copy()
    var_keys = var_dict.keys()
    plots_names = [x for x in var_keys if isinstance(var_dict[x], sns.axisgrid.FacetGrid)]
    for p in plots_names:
        plt.close(vars()[p].fig)
    

    情节 2:

    【讨论】:

      【解决方案2】:

      与其他 sns 图不同,catplot 生成的是 fig 而不是轴。这就是为什么要修复这种奇怪的行为,您需要在每次执行 catplot 后使用 plt.close()

      fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(8, 12))
      fig.tight_layout()
      
      sns.catplot(x='pclass', y='age', data=data, kind='box', ax=axes[0, 0])
      plt.close()
      sns.catplot(x='embarked', y='age', data=data, kind='box', ax=axes[0, 1])
      plt.close()
      sns.catplot(x='sex', y='age', data=data, kind='box', ax=axes[1, 0])
      plt.close()
      sns.catplot(x='sex', y='age', hue='pclass', data=data, kind='box', ax=axes[1, 1])
      plt.close()
      sns.catplot(x='sibsp', y='age', data=data, kind='box', ax=axes[2, 0])
      plt.close()
      sns.catplot(x='parch', y='age', data=data, kind='box', ax=axes[2, 1]);
      plt.close()
      
      plt.show()
      

      输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-20
        • 2012-12-03
        • 2021-09-12
        • 2020-05-19
        • 1970-01-01
        • 2014-05-02
        • 1970-01-01
        • 2022-12-05
        相关资源
        最近更新 更多