Выбор фигур для отображения на экране и сохранения в файл с помощью Python's matplotlib - PullRequest
11 голосов
/ 23 мая 2011

Я бы хотел создать разные фигуры в 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() команда является излишней? Кажется, это не имеет значения, даю я это или нет.

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

Ответы [ 2 ]

4 голосов
/ 04 сентября 2013

Лучше использовать 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()

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

2 голосов
/ 24 мая 2011

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

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() вызов является излишним, зависит от того, что вы делаете.Обычно вы хотите удержать возвращаемый объект figure и работать с ним вместо использования интерфейса конечного автомата matlab-ish matplotlib.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...