这是Hooked的答案的更多细节。当我第一次阅读该答案时,我错过了致电说明,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()
我测量了性能以查看是否值得在一批中重复使用该图,并且当我close()
在每次绘图后都调用时,这个小示例程序从41s减至49s(慢20%)。
plt
完全绕开。例如stackoverflow.com/a/16337909/325565(不要插入我自己的答案之一,但这是我能最快找到的答案...)