Aquí hay un poco más de detalle para ampliar la respuesta de Hooked . Cuando leí esa respuesta por primera vez, me perdí las instrucciones para llamar en clf()
lugar de crear una nueva figura . clf()
por sí solo no ayuda si luego vas y creas otra figura.
Aquí hay un ejemplo trivial que causa la advertencia:
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()
Para evitar la advertencia, tengo que tirar de la llamada subplots()
fuera del bucle. Para seguir viendo los rectángulos, necesito cambiar clf()
a cla()
. Eso despeja el eje sin quitar el eje mismo.
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()
Si está generando gráficos en lotes, es posible que tenga que usar ambos cla()
y close()
. Me encontré con un problema en el que un lote podía tener más de 20 parcelas sin quejarse, pero se quejaría después de 20 lotes. Lo arreglé usando cla()
después de cada parcela y close()
después de cada lote.
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()
Medí el rendimiento para ver si valía la pena reutilizar la cifra dentro de un lote, y este pequeño programa de muestra disminuyó de 41 a 49 (20% más lento) cuando llamé close()
después de cada trama.
plt
completo. Por ejemplo stackoverflow.com/a/16337909/325565 (No para conectar una de mis propias respuestas, pero es la que pude encontrar más rápido ...)