[Matplotlib绘图小技巧]解决Matplotlib批量绘图时内存溢出、卡死,以及除了第一张图片其余全是空白的问题

问题描述

在用Matplotlib批量生成大量图片时,会出现内存逐渐起飞然后卡死的情况。一开始我查教程发现是循环生成新的fig,旧的fig又没有删除,导致内存爆炸。尝试使用plt.clf()去清楚所以的轴,希望能在一个fig上重复清空、绘制,但除了第一张其余都成了空白。

cla()   # Clear axis清除当前图形中的当前活动轴。其他轴不受影响。
clf()   # Clear figure清除所有轴,但是窗口打开,这样它可以被重复使用。
close() #关闭窗口

问题解决

把fig的生成放在for循环外部,在循环内生成新的坐标轴,在循环末尾再调用plt.clf()去清空即可。

import matplotlib.pyplot as plt
from matplotlib.figure import figaspect
from tqdm import tqdm  #用于显示进度
import numpy as np

ratio = 9/16 #设置图片比例 the ratio  = height / width).

w, h = figaspect(ratio)# return width,height 和ratio相反,非常神奇的脑回路
plt.rcParams['figure.figsize'] = (w, h) #按比例设置图片大小

fig = plt.figure(constrained_layout=True)
fig.set_constrained_layout_pads(hspace = 0)
gs = fig.add_gridspec(1, 1)#设置fig上要画多少行多少列的图片(即多张图画在一个fig上,如果只画一张图就(1,1)即可)
for i in tqdm(range(1000)):#生成1000张图
	t = np.arange(0.0, 2.0, 0.01)
	s = np.sin(2 * i*np.pi * t)
	ax1 = fig .add_subplot(gs[0, :]) #将fig的第一行全给坐标轴1 ax1
	ax1.plot(t,s, linewidth=0.75)
	ax1.grid(True, which='both')
	ax1.set_ylabel('y')
	ax1.set_xlabel('t')
	plt.savefig("./"+str(i)+".jpg",dpi= 200) #按i.jpg保存图片
	plt.clf()

版权声明:本文为q943413302原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。