【问题标题】:Multiple updating plot with pyqtgraph in Python在 Python 中使用 pyqtgraph 进行多次更新
【发布时间】:2015-01-15 15:07:00
【问题描述】:

我必须绘制 3 条从传感器读取的数据更新曲线。当我只使用一条曲线时,更新图非常快,但是当我尝试绘制它们时,它们中的每一个都非常慢。我使用的代码如下:

#!/usr/bin/python


from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg

import time
import numpy as np


app = QtGui.QApplication([])



win = pg.GraphicsWindow()

p1 = win.addPlot()
p2 = win.addPlot()
p3 = win.addPlot()


curve1 = p1.plot()

curve2 = p2.plot()

curve3 = p3.plot()

readData = [0.0, 0.0, 0.0]
y1=[0.0]
y2=[0.0]
y3=[0.0]

temp = [0.0]

start = time.time()

def update():
    global curve1, curve2, curve3
    t = time.time()-start         # measure of time as x-coordinate
    readData= readfun()        #function that reads data from the sensor it returns a list of 3 elements as the y-coordinates for the updating plots
    y1.append(readData[0])
    y2.append(readData[1])
    y3.append(readData[2])
    temp.append(t)

    curve1.setData(temp,y1)
    curve2.setData(temp,y2)
    curve3.setData(temp,y3)
    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_'):
        QtGui.QApplication.instance().exec_()

如何加快三条曲线的更新绘图? 谢谢

编辑: 受 dirkjot 解决方案的启发,我想编辑上面的代码,以防有人出于相同目的需要它。它工作正常:

#!/usr/bin/python


from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg

import time
import numpy as np


app = QtGui.QApplication([])

win = pg.GraphicsWindow()

p1 = win.addPlot()
p2 = win.addPlot()
p3 = win.addPlot()


curve1 = p1.plot()

curve2 = p2.plot()

curve3 = p3.plot()

readData = [0.0, 0.0, 0.0]
y1=np.zeros(1000,dtype=float)
y2=np.zeros(1000,dtype=float)
y3=np.zeros(1000,dtype=float)

indx = 0
def update():
    global curve1, curve2, curve3, indx, y1,y2,y3

    readData= readfun()        #function that reads data from the sensor it returns a list of 3 elements as the y-coordinates for the updating plots
    y1[indx]=readData[0]
    y2[indx]=readData[1]
    y3[indx]=readData[2]

    if indx==99:
       y1=np.zeros(1000,dtype=float)
       y2=np.zeros(1000,dtype=float)
       y3=np.zeros(1000,dtype=float)
    else:
       indx+=1
    curve1.setData(y1)
    curve2.setData(y2)
    curve3.setData(y3)
    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_'):
        QtGui.QApplication.instance().exec_()

【问题讨论】:

    标签: python plot pyqtgraph


    【解决方案1】:

    一个问题是您要附加到列表中。当列表变大时,这会变得非常慢,因为 Python 必须将完整列表复制到比前一个单元格大一个单元格的新位置。您可以通过再次运行代码并删除附加内容来测试这一点,但继续读取数据(您为该测试而丢弃的数据)。

    如果是这个问题,有几种解决方案:

    1. 预先分配一个大列表(比如[None] * 1000)并在你正在写的地方保留一个计数器。当你达到 1k 时绕圈。通过这种方式,您可以获得持续更新的显示,就像您在老式示波器上看到的那样。
    2. 使用 numpy 并预先分配一个固定的缓冲区,例如 1k 个样本。将样本添加到末尾(位置 -10 到 -1)。当您到达 -1 时,在高效的 numpy 数据语句中将缓冲区内容 10 向左移动(类似于buffer[0:-10] = buffer[10:],但可能有专门的 numpy 移位指令)并再次从 -10 开始写入。

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2018-09-18
      • 1970-01-01
      • 2019-02-07
      相关资源
      最近更新 更多