09 05
最近遇到一个需要动态作图的问题,情况是这样的:有一台仪器(一台天平)不断通过串口向计算机发送数据,在计算机中用Terminal这个串口调试工具接收数据后记录到一个名字为data.log的文本文档中,现在需要将记录的数据动态地通过图形展现出来。
data.log中记录的数据格式如下:

比较麻烦的一点是有的数据后面有个问号,可能是天平读数不稳定时记录的数值就会用问号标记,因此作图之前需要先把这些数据处理一下。
写这个小程序又一次用到了Python,Python真是太好用了! 大致方法是这样的:复制data.log中的数据到一个temp.txt文件中,然后对数据进行预处理,然后作图。不断重复(每隔2秒)这个过程。
Python程序如下(有点乱,仅仅是简单地达到了动态作图的目的,没时间去优化了):
import time
import numpy as np
import matplotlib
matplotlib.use('WXAgg')
import matplotlib.pyplot as plt
import shutil
import wx
def pretreat(file_path):
f=open(file_path, 'r')
data1=f.readlines()
f.close()
data1[0:3]=[]
data1[-1:]=[]
data2=[i.strip() for i in data1]
data3=[i.rstrip('?') for i in data2]
data4=[i.strip() for i in data3]
data5=[i.rstrip('g') for i in data4]
data6=[i.strip() for i in data5]
data7=[float(i) for i in data6]
return data7
def update_line(idleevent):
shutil.copyfile('data.log', 'temp.txt')
path="temp.txt"
data=pretreat(path)
x=range(0,len(data))
line.set_ydata(data)
line.set_xdata(x)
ax.set_xlim(0, len(data)+200)
ax.set_ylim(data[len(data)-1]-50,data[0]+50)
fig.canvas.draw_idle()
time.sleep(2)
fig = plt.figure()
ax = fig.add_subplot(111)
shutil.copyfile('data.log', 'temp.txt')
path="temp.txt"
data=pretreat(path)
x=range(0,len(data))
ax.set_xlim(0, len(data)+200)
ax.set_ylim(data[len(data)-1]-50,data[0]+50)
line, = ax.plot(x,data)
wx.EVT_IDLE(wx.GetApp(), update_line)
plt.xlabel('Time (x10s)')
plt.ylabel('Weight (g)')
plt.title('Plotting')
plt.show()
运行的效果是这样的,图形自动实时更新:

参考资料:http://matplotlib.sourceforge.net/examples/animation/
如转载,请以超链接形式注明:转载自:有个博客 [ http://www.yelinsky.com/blog/ ]
九月 6th, 2010 at 23:21
这个还真没有学过,学习一下。
回复
九月 7th, 2010 at 15:11
动态作图,太高级了……
回复
Ye Lin Reply:
九月 7th, 2010 at 17:49
还是你们的曼斯曼提克斯更高级一些,哈哈
回复
十一月 21st, 2010 at 18:55
O(∩_∩)O~呵呵,从你这里发现了很多好东西哦,谢谢你啊!
回复