Вот немного подробнее, чтобы расширить ответ Хукеда . Когда я впервые прочитал этот ответ, я пропустил инструкцию для вызова clf() вместо создания новой фигуры . clf()сам по себе не поможет, если вы тогда пойдете и создадите другую фигуру.
Вот тривиальный пример, который вызывает предупреждение:
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()
Чтобы избежать предупреждения, я должен вытащить вызов за subplots()пределы цикла. Чтобы продолжать видеть прямоугольники, мне нужно переключиться clf()на cla(). Это очищает ось без удаления самой оси.
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()
Если вы генерируете графики в пакетном режиме, вам, возможно, придется использовать оба варианта cla()и close(). Я столкнулся с проблемой, когда партия может иметь более 20 участков без жалоб, но она будет жаловаться после 20 партий. Я исправил это, используя cla()после каждого графика и close()после каждой партии.
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()
Я измерил производительность, чтобы увидеть, стоит ли повторно использовать цифру в пакете, и эта небольшая программа-пример замедлилась с 41 до 49 с (на 20% медленнее), когда я только что звонил close()после каждого графика.
pltвообще обойти стороной. Например, stackoverflow.com/a/16337909/325565 (Не включать один из моих собственных ответов, но это тот, который я мог бы найти быстрее всего ...)