我正在用Python编写一个应用程序,它从串行端口收集数据,并绘制所收集数据与到达时间的关系图。数据的到达时间是不确定的。我希望在收到数据时更新图。我搜索了如何做到这一点,发现了两种方法:
1.清除该图,然后重新绘制包含所有点的图。
1.通过在特定间隔后更改图来设置图的动画。
我不喜欢第一个,因为程序运行和收集数据很长一段时间(例如一天),重绘图将非常慢。第二个也不是最好的,因为数据到达的时间是不确定的,我希望只有当数据被接收时,图才更新。
有没有一种方法可以让我只在接收到数据时添加更多的点来更新图?
4条答案
按热度按时间nue99wik1#
在matplotlib中有很多方法来动画数据,这取决于你的版本。你看过matplotlib文档中的动画示例吗?animation API定义了一个函数FuncAnimation,它可以在时间上动画一个函数。这个函数可能只是你用来获取数据的函数。
每个方法基本上都设置了被绘制对象的
data
属性,所以不需要清除屏幕或图形。data
属性可以简单地扩展,所以你可以保留以前的点,然后继续添加到你的线条(或图像或任何你正在绘制的东西)。假设你说你的数据到达时间是不确定的,你最好的选择可能是这样做:
然后,当您从串行端口接收数据时,只需调用
update_line
。cgh8pdjw2#
为了在没有FuncAnimation的情况下实现这一点(例如,你想在生成图的同时执行代码的其他部分,或者你想同时更新几个图),单独调用
draw
不会生成图(至少在qt后端)。以下是我的工作:
kyxcudwk3#
以下是一种允许在绘制一定数量的点后删除点的方法:
mepcadol4#
我知道我回答这个问题已经晚了,但是对于你的问题,你可以看看“操纵杆”软件包。我设计它是为了从串行端口绘制数据流,但它适用于任何数据流。它还允许交互式文本记录或图像绘制(除了图形绘制之外)。不需要在单独的线程中执行自己的循环,包会处理它,只要给予你想要的更新频率。加上终端在绘图时仍然可以用于监视命令。参见http://www.github.com/ceyzeriat/joystick/或https://pypi.python.org/pypi/joystick(使用pip install操纵杆安装)
只需将np.random.random()替换为从以下代码中的串行端口读取的真实的数据点: