加速度计数据写入文件并绘制Matplotlib图(3个子图 [x, y, z])
我对编程不是很熟悉,所以请多包涵。我正在做一个编程项目作为爱好(我主修物理)。总之,我想从一个Arduino Uno获取串行数据,然后用matplotlib画图,数据来源是一个ADXL345三轴加速度计。目前我不需要实时动态数据。以下是我用来将串行数据写入文件的代码,这部分运行得不错。
import serial
filepath = 'C:/Users/Josh/Documents/Programming/'
outfilename =filepath + 'data.txt'
outfile = open(outfilename,"w")
numpoints = 1000
ser = serial.Serial('COM4',9600)
for i in range(numpoints):
inString=ser.readline()
print inString
outfile.write(inString)
ser.close()
outfile.close()
这段代码生成了一个相对简单的文本文件,我想把它转换成一个包含三个子图(分别对应x、y、z轴)的matplotlib图表。不过,我在运行时遇到了一个问题,Python给我报了一个文件输入输出错误,提示errno 2,意思是找不到文件(文件不存在),但我确认文件是存在的,路径在我有限的知识范围内也是正确的。非常感谢任何帮助。这是我这个不太成功的尝试的相关部分:
import numpy as npy
import matplotlib.pyplot as plt
global y0,y1,y2
increment_size = 8000
datasample_size = 16000
filepath = ("C:\Users\Josh\Documents\Programming\data.txt")
infile = filepath + 'data.txt'
infile = open("data.txt","r")
singleline = infile.readline()
asciidata = singleline.split()
asciidata[0]=asciidata[0][3:] #strip three bytes of extraneous info
y0=[int(asciidata[0])]
y1=[int(asciidata[1])]
y2=[int(asciidata[2])]
2 个回答
1
如果你想知道如何实时绘制来自ADXL345的读数,这里有我的代码。为了让绘图更快,我使用了pyqtgraph这个库。
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
import serial
app = QtGui.QApplication([])
xdata = [0]
ydata = [0]
zdata = [0]
# set up a plot window
graph = pg.plot()
graph.setWindowTitle("ADXL345 realtime data")
graph.setInteractive(True)
xcurve = graph.plot(pen=(255,0,0), name="X axis")
ycurve = graph.plot(pen=(0,255,0), name="Y axis")
zcurve = graph.plot(pen=(0,0,255), name="Z axis")
# open serial port
ser = serial.Serial("COM4", 115200, timeout=1)
def update():
global xcurve, ycurve, zcurve, xdata, ydata, zdata
# serial read
dataRead = ser.readline().split()
# append to data list
xdata.append(float(dataRead[0]))
ydata.append(float(dataRead[1]))
zdata.append(float(dataRead[2]))
# plot
xcurve.setData(xdata)
ycurve.setData(ydata)
zcurve.setData(zdata)
app.processEvents()
# Qt timer
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(0)
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
2
你的文件路径是完整的文件地址,不只是文件夹的名字。然后你在这个路径后面加上了 'data.txt'
,你需要把你的代码改成:
filepath = 'C:\\Users\\Josh\\Documents\\Programming\\'
infile = filepath + 'data.txt'
infile = open(infile,"r")
在Python中,反斜杠('\')是用来转义字符的,所以如果你想要一个实际的反斜杠,你必须用两个反斜杠('\\')。
另外,你可以(而且通常应该)使用 os.path.join
来连接文件夹和文件。这样你的代码就变成:
from os.path import join
filepath = 'C:\\Users\\Josh\\Documents\\Programming'
infile = join(filepath, 'data.txt')
infile = open(infile,"r")