Выбор фигур для показа на экране и сохранение в файл с помощью Python matplotlib

Я хотел бы создать разные цифры в Python, используя matplotlib.pyplot. Затем я хотел бы сохранить некоторые из них в файле, в то время как другие должны отображаться на экране с помощью команды show().

Однако show() отображает все созданные цифры. Я могу избежать этого, вызвав close() после создания графиков, которые я не хочу показывать на экране, например, в следующем коде:

import matplotlib.pyplot as plt

y1 = [4, 2, 7, 3]
y2 = [-7, 0, -1, -3]

plt.figure()
plt.plot(y1)
plt.savefig('figure1.png')
plt.close()

plt.figure()
plt.plot(y2)

plt.show()
plt.close('all')

Это сохраняет первый рисунок и показывает второй. Однако я получаю сообщение об ошибке:

не может вызывать команду "событие": приложение было уничтожено при выполнении

Можно ли выбрать более элегантный способ отображения фигур?

Кроме того, является ли первая команда figure() излишней? Кажется, это не отличается от того, отдаю ли я это или нет.

Большое спасибо заранее.

Ответ 1

Лучше всего использовать plt.clf() вместо plt.close(). Более того, plt.figure() создает новый график, тогда как вы можете просто удалить предыдущий с помощью plt.clf():

import matplotlib.pyplot as plt

y1 = [4, 2, 7, 3]
y2 = [-7, 0, -1, -3]

plt.figure()
plt.plot(y1)
plt.savefig('figure1.png')
plt.clf()

plt.plot(y2)

plt.show()
plt.clf()

Этот код не будет генерировать ошибки или предупреждения, которые не могут вызвать команду "event"...

Ответ 2

Вообще говоря, вы можете просто закрыть фигуру. В качестве краткого примера:

import matplotlib.pyplot as plt

fig1 = plt.figure()
plt.plot(range(10), 'ro-')
plt.title('This figure will be saved but not shown')
fig1.savefig('fig1.png')
plt.close(fig1)

fig2 = plt.figure()
plt.plot(range(10), 'bo')
plt.title('This figure will be shown')

plt.show()

Что касается того, является ли первый вызов plt.figure() первостепенным, это зависит от того, что вы делаете. Обычно вы хотите висеть на возвращаемом объекте фигуры и работать с ним вместо использования интерфейса matplablib matlab-ish.

Когда вы делаете более сложные сюжеты, часто становится лишней строкой кода, чтобы сделать что-то вроде этого:

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(range(10))

Преимущество состоит в том, что вам не нужно беспокоиться о том, какая фигура или ось активна, вы просто ссылаетесь на конкретную ось или объект фигуры.