最近遇到一个需要动态作图的问题,情况是这样的:有一台仪器(一台天平)不断通过串口向计算机发送数据,在计算机中用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/ ]




Tags: , ,