我在python中使用matplotlib迭代绘图。我正在设置绘图的轴,以便显示例如一次只有50行。下面给出一个伪代码作为例子:
x = 0
y = 1
line_plot = 50
axis.set_ylim(0 , line_plot)
while True:
plot(x,y)
y = y+1
if y > line_plot :
axis.set_ylim(y , y+line_plot)
此代码将无限期运行,并且最终绘图所需的内存将变得非常大,即使图形上仅存在50行(因为所有数据点都保存在内存中)。我想知道python中是否有命令删除所有超出轴限制的数据,释放一些内存空间。
谢谢你, Gaelle
答案 0 :(得分:1)
这将取决于您的脚本的确切程度。您需要一些方法来确定每一行的y坐标,并根据某些标准删除它们。但是,如果你做了类似的事情:
x = np.arange(1)
y = np.ones(1)
pl.figure()
l1 = pl.plot(x,y)[0]
y[:] += 1
l2 = pl.plot(x,y)[0]
并在两行上调用get_ydata()
,它们将具有相同的y值,因此get_ydata()
似乎返回原始数组,不一定是绘制在绘图中的值(这显然是一个bug ,见:this matplotlib issue)。如果您使用y[:] += 1
而不是y = y.copy()+1
来制作数组的实际副本(get_ydata()
),则可以使用import matplotlib
import matplotlib.pylab as pl
import numpy as np
pl.close('all')
x = np.arange(100000)
y = np.ones(x.size)
pl.figure()
ax = pl.gca()
line_plot = 50
ax.set_ylim(0, line_plot)
for i in range(200):
pl.plot(x, y)
y = y.copy() + 1
if y[0] > line_plot:
ax.set_ylim(y[0]-line_plot, y[0])
for l in ax.get_lines():
yval = l.get_ydata()[0]
if(yval < ax.get_ylim()[0]):
l.remove()
。如果您的实际问题就是这种情况,那么这样的解决方案可能有效:
for l in ax.get_lines
如果删除i
部分,则内存使用量会随i
缩放,包含此部分的内存使用率保持不变,即使对于非常大的{{1}}
答案 1 :(得分:0)
# make a figure and axes object
fig, ax = plt.subplots()
# make a Line2D artist
ln, = ax.plot([], [], linestyle='', marker='o')
# local version of the data
xdata, ydata = [], []
for j in range(200):
# update your copy of the data
xdata.append(j)
ydata.append(j*j)
xdata = xdata[-50:]
ydata = ydata[-50:]
# update the Line2D objects copy of the data
ln.set_data(xdata, ydata)
# autoscale limits to new data
ax.relim()
ax.autoscale()
# needed in non-interactive mode and/or mpl < 1.5
# fig.canvas.draw_idle()
# sleep, but run the GUI event loop
plt.pause(.1)