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.
plt
całkowicie pominiesz. Np. Stackoverflow.com/a/16337909/325565 (Nie chcę podłączać jednej z moich odpowiedzi, ale to ta, którą znalazłem najszybciej ...)