简单实用的python动态可视化,非animation
语言&工具:python-matplotlib
以前在实现这个的时候,找了很多很多的文章,方法,都不能符合我实现动态可视化的需求
很多文章,要么不是动态,要么代码根本就调不通,要么就是些教程。下面的代码的数据源
是实时动态的,结果显示是动态折线图。
优点:实时接收数据,动态展示数据,频率:一秒10个数据,能够直观看出数据的波动情况
缺点:折线图看起来不那么流畅,不像心电图那种平滑,跟ROS自带的rqt工具效果是一样样的
上代码:
#!/usr/bin/env python2
# coding=utf-8
import matplotlib.pyplotas plt
import time
'''
data2image函数,从订阅器生成的文件中实时提取数据生matplotlib动态曲线图
'''
def image(list1,line1):
speed= map(float,line1[0].split())
time.sleep(0.1)
# 把数据放入list
list1.extend(speed)
# 设置子图1
ax1= plt.subplot(3,1,1)
plt.cla()
# 设置网格线-子标题-x-y轴的颜色; 类型; 粗细
ax1.grid(color='purple',linestyle='--',linewidth=1,alpha=0.3)
ax1.set_title('Speed Curve',fontsize=20,color='pink')
ax1.set_xlabel('time',fontsize=15,color='deepskyblue')
ax1.set_ylabel('speedValue',fontsize=15,color='g')
# 如果列表长度大于30,擦除前面的数据,只显示最新的30个
if len(list1)>= 100:
ax1.plot(range(100),list1[-100:],color='r',markerfacecolor='r',marker='o',markersize=1)
# ax1.plot(range(30), yy[-30:], color='orange', markerfacecolor='r', marker='o', markersize=2) # 有需要可以一图多曲线
else: # 否则显示当前的数据
ax1.plot(range(len(list1)),list1,color='r',markerfacecolor='r',marker='o')
# ax1.plot(range(len(yy)), yy, color='orange', markerfacecolor='r', marker='o')
# 设置子图或标题间的间距
#plt.tight_layout(pad=5.0, w_pad=5.0, h_pad=3.0)
plt.pause(0.01)
def data2image(Speed):
# 订阅器中生成的存储计算数据的文件
speed_data= open(Speed)
# 定义一个空列表
list1= []
# 设置图像的大小,图像曲线的粗细度
plt.rcParams['figure.figsize']= (12,15)
plt.rcParams['lines.linewidth']= 1.5
# 设置总图像的大标题文字,标题内容,字体颜色
plt.suptitle('Real Time Image',fontsize=20,color='teal')
while 1:
line1= speed_data.readlines()
# 读取dat文件内容,读取出来是[‘字符串’]的形式
if not line1: # 如果没有数据,等待6秒,6秒内回复产出数据,再次画图,否则down
print 'no data output,wait for 6secs'
time.sleep(6)
if line1:
image(list1, line1)
else: # 如果长时间没有数据,判断为程序停止,输出最终的计算结果
plt.close()
break
else: # 有数据,处理数据并实时画图
image(list1, line1)
if __name__== '__main__':
# 这里的文件是从订阅器接收数据,订阅器是个loop所以不能直接可视化,中间转储到.dat文件,再从.dat文件实时读取
Speed= '~/opt/data/speed.dat'
data2image(Speed)
#Tips:本人的环境是ROS开发平台,所以自带的是python2,有需要可以换成3,方法如上,具体放自己环境调整下就能用
如果觉得对大家有帮助,我很开心!如果大神们有更好的方法,也请不吝赐教