Aqui está um pouco mais detalhadamente para expandir a resposta de Hooked . Quando li a resposta pela primeira vez, perdi a instrução para ligar em clf() vez de criar uma nova figura . clf()por si só não ajuda se você for criar outra figura.
Aqui está um exemplo trivial que causa o aviso:
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 o aviso, tenho que puxar a chamada para subplots()fora do loop. Para continuar vendo os retângulos, preciso mudar clf()para cla(). Isso limpa o eixo sem remover o próprio eixo.
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 você estiver gerando plotagens em lotes, poderá usar ambos cla()e close(). Encontrei um problema em que um lote podia ter mais de 20 parcelas sem reclamar, mas ele reclamava após 20 lotes. Corrigi isso usando cla()depois de cada plot e close()depois 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()
Eu medi o desempenho para ver se valia a pena reutilizar a figura dentro de um lote, e esse pequeno programa de amostra diminuiu de 41s para 49s (20% mais lento) quando acabei de ligar para close()cada plotagem.
pltcompletamente. Por exemplo stackoverflow.com/a/16337909/325565 (Não para ligar uma das minhas próprias respostas, mas é o que eu poderia encontrar mais rápido ...)