Hier ist ein bisschen mehr Detail, um die Antwort von Hooked zu erweitern . Als ich diese Antwort zum ersten Mal las, habe ich die Anweisung zum Anrufen verpasst, clf()
anstatt eine neue Figur zu erstellen . clf()
allein hilft nicht, wenn Sie dann gehen und eine andere Figur erstellen.
Hier ist ein triviales Beispiel, das die Warnung verursacht:
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()
Um die Warnung zu vermeiden, muss ich den Anruf subplots()
außerhalb der Schleife ziehen. Um die Rechtecke zu halten sehen, muss ich Schalter clf()
auf cla()
. Dadurch wird die Achse gelöscht, ohne die Achse selbst zu entfernen.
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()
Wenn Sie Diagramme in Stapeln erstellen, müssen Sie möglicherweise beide cla()
und verwenden close()
. Ich stieß auf ein Problem, bei dem eine Charge mehr als 20 Parzellen haben konnte, ohne sich zu beschweren, aber sie beschwerte sich nach 20 Chargen. Ich habe das behoben, indem ich cla()
nach jedem Plot und close()
nach jeder Charge verwendet habe.
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()
Ich habe die Leistung gemessen, um festzustellen, ob es sich lohnt, die Zahl innerhalb eines Stapels wiederzuverwenden, und dieses kleine Beispielprogramm verlangsamte sich von 41 auf 49 Sekunden (20% langsamer), als ich gerade close()
nach jedem Plot anrief.
plt
. ZB stackoverflow.com/a/16337909/325565 (Nicht um eine meiner eigenen Antworten zu stecken , aber es ist die, die ich am schnellsten finden konnte ...)