построение графиков с помощью matplotlib в jupyter: эффект разделения кода по ячейкам - PullRequest
0 голосов
/ 16 марта 2020

Я изучаю pandas и matplotlib, и я вижу это странное поведение, которое я не могу понять.

код следующий:

# plot the histograms for each feature
plt.figure(figsize=(15, 5))
for i, feature in enumerate(df.columns):
    plt.subplot(1, 4, i+1)
    df[feature].plot(kind='hist', title=feature)
    plt.xlabel(feature)

теперь результат выглядит следующим образом :

enter image description here

Все в порядке.

Теперь, если я разделю код на две ячейки, результат изменится:

enter image description here

Почему результат отличается?

1 Ответ

1 голос
/ 17 марта 2020

plt.figure() создает новый экземпляр Figure, plt.subplot добавит подзаговор к текущей фигуре - и создаст экземпляр, если в данный момент его не существует.

В первом случае plt.figure() создает экземпляр Figure с размером (15,5), и этот экземпляр теперь является «текущей фигурой», пока не выйдет из области видимости, не будет закрыт или создается новый Figure (или «текущая цифра» изменяется другими способами). plt.subplot затем добавит субплот к этому экземпляру Figure - в результате получится фигура размером (15,5) с 4 субплотами по желанию.

Во втором случае, когда вызов plt.figure() в другой ячейке он больше не будет «текущей фигурой» в другой ячейке. Это потому, что фигура закрывается в конце выполнения первой ячейки - поэтому вы видите вывод <Figure size 1080x360 with 0 Axes>.

Способ обойти это - сохранить возвращенную Figure экземпляр из plt.figure() и затем используйте Figure.add_subplot вместо plt.subplot. Тогда первая ячейка будет

fig = plt.figure(figsize=(15,5))

, а вторая будет

for i, feature in enumerate(df.columns):
    fig.add_subplot(1, 4, i+1)
    df[feature].plot(kind='hist', title=feature)
    plt.xlabel(feature)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...