如何使用PyQtGraph来增加速度和拆分多个图表的数据?

2024-04-18 22:36:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用STM32工具包从串行端口读取数据。问题是我需要为绘图ADC数据使用自己的时间戳。也就是说,x轴应该是我的RTC时间(用ms表示),y轴是ADC数据。有绘图串口程序,但正如我所说,我需要设置自己的图表时间。我为此尝试了matplotlib,但速度非常慢。然后使用pyqtgraph和以下脚本:

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
from pyqtgraph.ptime import time
import serial

app = QtGui.QApplication([])

p = pg.plot()
p.setWindowTitle('live plot from serial')
curve = p.plot()

data = [0]
raw=serial.Serial("/dev/ttyACM0",115200)
#raw.open()

def update():
    global curve, data
    line = raw.readline()
    data.append(int(line))
    xdata = np.array(data, dtype='float64')
    curve.setData(xdata)
    app.processEvents()

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_()

这与mathplotlib相比太慢但太快。现在我找不到如何将时间戳和ADC数据拆分为x,y这样的绘图。我的数据是用“;”拆分的。你知道吗

谢谢你的回答。你知道吗

编辑时间:

我改变了我的代码读取速度寻找足够的了解。但要知道它正在绘制一些小故障,比如timetamp正在向前跳,然后返回,或者大量的x轴数据。我正在监视串口GUI上的数据,找不到任何错误的数据。我认为有些东西来自Python代码。我能忽略这些绘图程序上的小故障吗?你知道吗

立即编码:

import numpy as np
import pyqtgraph as pg
import serial

app = pg.Qt.QtGui.QApplication([])
p = pg.plot()
p.setWindowTitle('live plot from serial')
curve = p.plot()

data = [0]
tdata = [0]
temp = [0]
datax = [0]
datay = [0]

temp = 0
now = 0
k = 0
raw=serial.Serial("/dev/ttyACM0",115200, timeout=None)
while p.isVisible():
    line = raw.readline().decode('utf-8').strip()
    print("raw line:", line)
    line = str(line)
    print("str line:", line)
    line = line.split(':')
    print("splitted line:", line)
    if len(line) >= 4:
        print("line>4:", line)
        tdata = line[0]
        data = line[1]
        print("line[0]; line[1]:", tdata, line)
        tdata = int(tdata)
        data = int(data)
        print("int(tdata)", tdata)
        print("int(line)", data)
        datax.append(int(tdata))
        datay.append(int(data))
        xdata = np.array(datax, dtype='float64')
        ydata = np.array(datay, dtype='float64')
        p.setXRange(tdata-500, tdata+500, padding=0)
        curve.setData(xdata, ydata)
        # p.setYRange(0 ,data+30, padding=0)
        print("now will refresh the plot")
        app.processEvents()
    else:
        print("line<4:", line)

Tags: 数据importdatarawplotnpline时间
1条回答
网友
1楼 · 发布于 2024-04-18 22:36:42

拆分数据

使用Serial.readline()时,读取的数据将在末尾包含换行符\n(请参阅Python univeral newlines,如果从Windows发送,则可能是\r\n\)。你知道吗

首先解码接收到的字节并删除换行符:

data_string = r.readline().decode('utf-8').strip()

然后在:处拆分字符串

data_split = data_string.split(':')

现在data_split是一个包含条目的列表

[packetCount, databuffer, sec, subsec]

你可以把它们转换成浮点数或者整数,然后放到Numpy数组中。你知道吗

速度提升

Serial.readline可能会减慢代码的速度。使用这样的https://stackoverflow.com/a/56632812/7919597。你知道吗

还可以考虑在固定的numpy数组中移动数据,而不是每次使用xdata = np.array(data, dtype='float64')创建一个新数组。你知道吗

Shift elements in a numpy array

我将这些函数与Thread类函数结合使用

import threading
import queue

q = queue.Queue()
thread = threading.Thread(target=read_from_port, args=(serial_port, q))
thread.start()

从串口读取。你知道吗

PyQtGraph示例中有一个非常有用的示例:

https://github.com/pyqtgraph/pyqtgraph/blob/develop/examples/scrollingPlots.py

显示了用Numpy数组绘制滚动图的三种不同方法。你知道吗

我最终使用了方法1和方法3的组合,同时移动了从串行端口读取的尽可能多的位置。你知道吗

相关问题 更多 >