Python matplotlib - 删除轴限制以外的数据

时间:2016-05-30 13:12:51

标签: python matplotlib axis

我在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

2 个答案:

答案 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)

您想查看animation examples

# 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)