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