Ось трохи детальніше, щоб розкрити відповідь Хукеда . Коли я вперше прочитав цю відповідь, я пропустив інструкцію дзвонити, 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()
Я виміряв продуктивність, щоб побачити, чи варто повторно використовувати фігуру в рамках партії, і ця маленька вибіркова програма сповільнилася з 41s до 49s (на 20% повільніше), коли я щойно дзвонив close()після кожного сюжету.
plt. Напр. Stackoverflow.com/a/16337909/325565 (Не підключати жодної моєї відповіді, але це я, яку я міг би знайти найшвидше ...)