Voici un peu plus de détails pour développer la réponse de Hooked . Quand j'ai lu cette réponse pour la première fois, j'ai manqué l'instruction d'appeler clf()
au lieu de créer une nouvelle figure . clf()
à lui seul, cela n'aide pas si vous allez ensuite créer une autre figure.
Voici un exemple trivial qui provoque l'avertissement:
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()
Pour éviter l'avertissement, je dois tirer l'appel à l' subplots()
extérieur de la boucle. Pour continuer à voir les rectangles, je dois passer clf()
à cla()
. Cela efface l'axe sans supprimer l'axe lui-même.
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 vous générez des graphiques par lots, vous devrez peut-être utiliser à la fois cla()
et close()
. J'ai rencontré un problème où un lot pouvait avoir plus de 20 parcelles sans se plaindre, mais il se plaindrait après 20 lots. J'ai corrigé cela en utilisant cla()
après chaque parcelle et close()
après chaque lot.
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()
J'ai mesuré les performances pour voir s'il valait la peine de réutiliser la figure dans un lot, et ce petit programme d'exemple a ralenti de 41s à 49s (20% plus lent) lorsque je viens d'appeler close()
après chaque tracé.
plt
complètement. Par exemple, stackoverflow.com/a/16337909/325565 (Ne pas brancher une de mes propres réponses, mais c'est celle que j'ai pu trouver le plus rapidement ...)