在流数据上绘制滑动时间窗口

时间:2018-06-20 17:57:05

标签: python-3.x matplotlib

我收到每秒10次左右的流式传感器结果作为成对的点(时间,值)。我想连续绘制结果的最后30秒(〜300点)。我执行以下操作:使用animation.FuncAnimation机制。每当FuncAnimation启动时,我都会从队列中读取最新结果,扔掉最旧的结果,并使用set_data(time_array,value_array)重绘该图。它运作良好,但有一个很大的缺点:我每次必须使用set_xlim()来使x轴适应新的时间值。有没有一种优雅的方法呢?我想在时间轴为[0,30]的情况下使用相对坐标,但是找不到一种完美的方法。我总是可以时移当前窗口中的所有300个点,以便它们从0开始并在30左右结束,但这效率很低,必须在添加新数据点而丢弃旧数据点时执行。

2 个答案:

答案 0 :(得分:0)

您可能应该使用

ax.autoscale()

将轴ax缩放到新内容。

答案 1 :(得分:0)

我将创建第二个仅包含最后300个点的数组。类似于以下内容:

import numpy as np

fullArray = (time, value)
tempArray = fullArray

while takingData:
    lastTake = (time, value)
    fullArray = np.vstack((fullArray, lastTake))
    try:
        tempArray = np.hstack((fullArray[ -299: ,1 ], lastTake[1]))
    except IndexError:
        tempArray = np.hstack((fullArray[:,1], lastTake[1]))

通过这种方式,您将所有数据保存在fullArray中,但是您还有一个一维数组,其中仅包含可以针对range(len(tempData))绘制的最后300个点 而不是与时间作图。