Если вы хотите сохранить фигуру после ее отображения, вам нужно удержать экземпляр фигуры. Причина, по которой plt.savefig
не работает после вызова show
, заключается в том, что текущий показатель был сброшен.
pyplot
отслеживает, какие цифры, оси и т. Д. Являются «текущими» (т.е. имеют пока не отображается с show
) за кадром. gcf
и gca
получают текущие экземпляры фигур и текущих осей соответственно. plt.savefig
(и, по существу, любой другой метод pyplot
) просто выполняет plt.gcf().savefig(...)
. Другими словами, получите текущий экземпляр фигуры и вызовите его метод savefig
. Аналогично plt.plot
в основном выполняет plt.gca().plot(...)
.
После вызова show
список «текущих» фигур и осей пуст.
В общем, вы лучше прямое использование экземпляров фигур и осей для создания / сохранения / показа / etc, вместо использования plt.plot
и т. д., чтобы неявно получить текущую цифру / оси и график на ней. Нет ничего плохого в использовании pyplot
для всего (особенно в интерактивном режиме), но это облегчает стрельбу в ногу.
Используйте pyplot
для plt.show()
и для создания фигуры и объекта (ов) осей, но затем используйте методы с цифрами или осями напрямую. (например, ax.plot(x, y)
вместо plt.plot(x, y)
и т. д.) Основное преимущество этого заключается в том, что оно явное. Вы знаете, на каких объектах вы работаете, и не нужно рассуждать о том, что делает машина состояния pyplot (хотя и не так сложно понять интерфейс состояния и машины).
As пример «рекомендуемого» способа делать что-то вроде:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = x**2
fig, ax = plt.subplots()
ax.plot(x, y)
fig.savefig('fig1.pdf')
plt.show()
fig.savefig('fig2.pdf')
Если вы предпочитаете использовать интерфейс pyplot
для всего, то просто возьмите экземпляр фигуры, прежде чем вы вызовете show
. Например:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = x**2
plt.plot(x, y)
fig = plt.gcf()
fig.savefig('fig1.pdf')
plt.show()
fig.savefig('fig2.pdf')