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()
、すべてのプロットの後に呼び出したときに41秒から49秒(20%遅く)に遅くなりました。
plt
完全にバイパスする方がよいでしょう。例えば、stackoverflow.com / a / 16337909/325565(自分の答えの1つを差し込むのではなく、私が最も早く見つけられるものです...)