Выбор фигур для показа на экране и сохранение в файл с помощью 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))
Преимущество состоит в том, что вам не нужно беспокоиться о том, какая фигура или ось активна, вы просто ссылаетесь на конкретную ось или объект фигуры.