Oto nieco więcej szczegółów, aby rozwinąć odpowiedź Hookeda . Kiedy po raz pierwszy przeczytałem tę odpowiedź, przegapiłem instrukcję, aby zadzwonić clf() zamiast tworzyć nową figurę . clf()samo w sobie nie pomoże, jeśli potem pójdziesz i stworzysz kolejną figurę.
Oto trywialny przykład, który powoduje ostrzeżenie:
from matplotlib import pyplot as plt, patches
import os
def main():
path = 'figures'
for i in range(21):
_fig, ax = plt.subplots()
x = range(3*i)
y = [n*n for n in x]
ax.add_patch(patches.Rectangle(xy=(i, 1), width=i, height=10))
plt.step(x, y, linewidth=2, where='mid')
figname = 'fig_{}.png'.format(i)
dest = os.path.join(path, figname)
plt.savefig(dest) # write image to file
plt.clf()
print('Done.')
main()
Aby uniknąć ostrzeżenia, muszę wyciągnąć połączenie subplots()poza pętlę. Aby nadal widzieć prostokąty, muszę przełączyć się clf()na cla(). To czyści oś bez usuwania samej osi.
from matplotlib import pyplot as plt, patches
import os
def main():
path = 'figures'
_fig, ax = plt.subplots()
for i in range(21):
x = range(3*i)
y = [n*n for n in x]
ax.add_patch(patches.Rectangle(xy=(i, 1), width=i, height=10))
plt.step(x, y, linewidth=2, where='mid')
figname = 'fig_{}.png'.format(i)
dest = os.path.join(path, figname)
plt.savefig(dest) # write image to file
plt.cla()
print('Done.')
main()
Jeśli generujesz wykresy partiami, może być konieczne użycie obu cla()i close(). Napotkałem problem polegający na tym, że partia mogła mieć więcej niż 20 działek bez narzekania, ale po 20 partiach narzekała. Naprawiłem to, używając cla()po każdym wykresie i close()po każdej partii.
from matplotlib import pyplot as plt, patches
import os
def main():
for i in range(21):
print('Batch {}'.format(i))
make_plots('figures')
print('Done.')
def make_plots(path):
fig, ax = plt.subplots()
for i in range(21):
x = range(3 * i)
y = [n * n for n in x]
ax.add_patch(patches.Rectangle(xy=(i, 1), width=i, height=10))
plt.step(x, y, linewidth=2, where='mid')
figname = 'fig_{}.png'.format(i)
dest = os.path.join(path, figname)
plt.savefig(dest) # write image to file
plt.cla()
plt.close(fig)
main()
Zmierzyłem wydajność, aby sprawdzić, czy warto ponownie użyć liczby w partii, a ten mały przykładowy program zwolnił z 41 s do 49 s (20% wolniej), gdy dzwoniłem close()po każdym wykresie.
pltcałkowicie pominiesz. Np. Stackoverflow.com/a/16337909/325565 (Nie chcę podłączać jednej z moich odpowiedzi, ale to ta, którą znalazłem najszybciej ...)