Dưới đây là một chút chi tiết để mở rộng câu trả lời của Hooked . Khi tôi lần đầu tiên đọc câu trả lời đó, tôi đã bỏ lỡ hướng dẫn để gọi clf()
thay vì tạo một hình mới . clf()
tự nó không giúp đỡ nếu bạn sau đó đi và tạo một hình khác.
Đây là một ví dụ tầm thường gây ra cảnh báo:
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()
Để tránh cảnh báo, tôi phải kéo cuộc gọi ra subplots()
bên ngoài vòng lặp. Để tiếp tục nhìn thấy các hình chữ nhật, tôi cần chuyển clf()
sang cla()
. Điều đó xóa trục mà không loại bỏ trục chính nó.
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()
Nếu bạn đang tạo các lô theo lô, bạn có thể phải sử dụng cả hai cla()
và close()
. Tôi gặp phải một vấn đề trong đó một lô có thể có hơn 20 lô mà không phàn nàn, nhưng nó sẽ khiếu nại sau 20 lô. Tôi đã sửa nó bằng cách sử dụng cla()
sau mỗi lô và close()
sau mỗi đợt.
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()
Tôi đã đo hiệu suất để xem liệu có đáng sử dụng lại con số trong một đợt hay không và chương trình mẫu nhỏ này đã chậm lại từ 41 đến 49 giây (chậm hơn 20%) khi tôi chỉ gọi close()
sau mỗi âm mưu.
plt
hoàn toàn. Ví dụ stackoverflow.com/a/16337909/325565 (Không để cắm một trong những câu trả lời của riêng tôi, nhưng đó là một trong tôi có thể tìm nhanh ...)