Вот немного подробнее, чтобы расширить ответ Хукеда . Когда я впервые прочитал этот ответ, я пропустил инструкцию для вызова 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 (Не включать один из моих собственных ответов, но это тот, который я мог бы найти быстрее всего ...)