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.
plt
completamente. 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 ...)