Как остановить печать графиков дважды в jupyter при использовании вспомогательных участков? - PullRequest
3 голосов
/ 03 февраля 2020

Я работаю с данными Titani c и пытаюсь использовать комбинацию pyplot и seaborn для получения некоторых вспомогательных участков. Я написал следующий код для создания 6 вспомогательных участков в сетке 3x2:

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 пустых графиков , enter image description here

Как я могу запретить печать этих пустых графиков на моем выходе?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Присвойте каждый из ваших графиков такой переменной, как g, и используйте plt.close(g.fig), чтобы удалить ненужные субплоты. Или переберите все переменные типа sns.axisgrid.FacetGrid и закройте их следующим образом:

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

Полный фрагмент кода ниже делает именно это. Обратите внимание, что я загружаю набор данных titani c, используя train_df = sns.load_dataset("titanic"). Здесь все имена столбцов в нижнем регистре в отличие от вашего примера. Я также удалил аргумент palette=col_pal, поскольку col_pal не определен в вашем фрагменте.

Сюжет:

enter image description here

Код:

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)

Обратите внимание, что вам придется присвоить свои графики именам переменных для этого работать. Если вы просто добавите фрагмент, закрывающий графики, в конец исходного фрагмента, настройка дубликата вспомогательного участка останется нетронутой.

Код 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:

enter image description here

0 голосов
/ 03 февраля 2020

В отличие от других графиков sns catplot создает фиг, а не оси. Вот почему для исправления такого странного поведения необходимо использовать plt.close() после каждого catplot выполнения:

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

Out:

catplots

...