我在Python中创建一个应用程序,它从串行端口收集数据,并根据到达时间绘制收集数据的图表 . 数据的到达时间不确定 . 我希望在收到数据时更新绘图 . 我搜索了如何做到这一点,并找到了两种方法:
-
清除绘图并重新绘制所有点的绘图 .
-
在特定间隔后更改图表的动画 .
我不喜欢第一个,因为程序运行并收集数据很长一段时间(例如一天),重绘绘图将非常慢 . 第二个也不是优选的,因为数据的到达时间是不确定的,并且我希望仅在接收到数据时更新图 .
有没有办法只通过在收到数据时添加更多的点来更新图表?
3 回答
在matplotlib中有很多种动画数据的方法,具体取决于您拥有的版本 . 你见过matplotlib cookbook的例子吗?另外,请查看matplotlib文档中更现代的animation examples . 最后,animation API定义了一个函数FuncAnimation,它可以及时激活一个函数 . 此功能可能只是您用于获取数据的功能 .
每种方法基本上都设置了绘制对象的
data
属性,因此不需要清除屏幕或图形 .data
属性可以简单地扩展,因此您可以保留以前的点并继续添加到您的线(或图像或您正在绘制的任何内容) .鉴于您说您的数据到达时间不确定,您最好的选择可能只是做以下事情:
然后,当您从串行端口接收数据时,只需调用
update_line
.为了在没有FuncAnimation的情况下执行此操作(例如,您希望在生成绘图时执行代码的其他部分,或者您希望同时更新多个绘图),单独调用
draw
不会产生绘图(至少与qt后端) .以下适用于我:
我知道我迟到了回答这个问题,但是对于你的问题,你可以查看"joystick"包 . 我设计它用于绘制来自串行端口的数据流,但它适用于任何流 . 它还允许交互式文本记录或图像绘图(除了图形绘图) . 无需在单独的线程中执行您自己的循环,包就可以处理它,只需提供您希望的更新频率 . 此外,终端在绘图时仍可用于监控命令 . 请参阅http://www.github.com/ceyzeriat/joystick/或https://pypi.python.org/pypi/joystick(使用pip install操纵杆进行安装)
只需用下面代码中从串口读取的实际数据点替换np.random.random():