Ecco un po 'più di dettaglio per espandere la risposta di Hooked . Quando ho letto per la prima volta quella risposta, ho perso l'istruzione di chiamare clf() invece di creare una nuova figura . clf()da solo non aiuta se poi vai a creare un'altra figura.
Ecco un esempio banale che provoca l'avvertimento:
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()
Per evitare l'avvertimento, devo trasferire la chiamata subplots()all'esterno del loop. Per continuare a vedere i rettangoli, devo passare clf()a cla(). Ciò cancella l'asse senza rimuovere l'asse stesso.
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()
Se stai generando grafici in lotti, potresti dover utilizzare sia cla()e close(). Ho riscontrato un problema in cui un batch poteva avere più di 20 grafici senza lamentarsi, ma si sarebbe lamentato dopo 20 batch. L'ho risolto usando cla()dopo ogni trama e close()dopo ogni partita.
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()
Ho misurato le prestazioni per vedere se valeva la pena riutilizzare la cifra all'interno di un batch, e questo piccolo programma di esempio è rallentato da 41 a 49 secondi (20% più lento) quando ho appena chiamato close()dopo ogni trama.
plttutto. Ad esempio stackoverflow.com/a/16337909/325565 (Non inserire una delle mie risposte, ma è quella che ho trovato più rapidamente ...)