实现pyqtgraph进行实时数据绘图

发布于 2021-01-29 15:17:03

我正在尝试获取实时数据图,因为它是由使用pyqtgraph的仪器收集的。

数据收集由主流程处理,然后通过连接传递给绘制该数据的子流程。我只是想传递新数据,并在传递新数据时更新它。

我试图通过将读取的连接放入Qt
Timer更新循环内来实现此目的,但是随后在连续的更新周期之间传递图形数据(我想附加到该数据)时遇到了困难。我从下面的代码中省略了,但是基本上我想加入连续的许多connData,我认为使用全局方法是可行的,但是由于某种原因我不能在这里实现。

编辑1:我与pyqtgraph示例进行比较的问题似乎是将数据传递给Qtimer的更新过程,我得到:

NameError:全局名称’CurveData’未定义

我尝试以这种方式而不是使用pyqtgraph的多处理模块的原因是,我不想每次都通过连接传递整个数据集(我认为这是必要的)。谢谢!

编辑2:某处有pyqtgraph.multiprocess的文档吗?

(这是提供的原始代码)

import multiprocessing
import numpy as np
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import sys
import os

def MakeGraph(conn):

    win = pg.GraphicsWindow(title = "test")
    win.resize(300,300)

    p1 = win.addPlot(title = "test")

    curve = p1.plot(pen = 'y')
    timer = QtCore.QTimer()

    def Update():
        try:
            ConnData = conn.recv()
            ConnData = [float(i) for i in ConnData]
            curve.setData(ConnData)
        except EOFError:
            print "Graph connection closed\n"
            timer.stop()
            QtGui.QApplication.quit()

    timer.timeout.connect(Update)
    timer.start(0)

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            QtGui.QApplication.instance().exec_()

修改版本:

import multiprocessing
import numpy as np
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import sys
import os

def MakeGraph(conn):

    win = pg.GraphicsWindow(title = "test")
    win.resize(300,300)

    p1 = win.addPlot(title = "test")

    curve = p1.plot(pen = 'y')
    timer = QtCore.QTimer()
    CurveData = []

    def Update():
        global CurveData
        try:
            ConnData = conn.recv()
            ConnData = [float(i) for i in ConnData]
            CurveData = np.append(CurveData,ConnData)
            curve.setData(CurveData)
        except EOFError:
            print "Graph connection closed\n"
            timer.stop()
            QtGui.QApplication.quit()

    timer.timeout.connect(Update)
    timer.start(0)

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            QtGui.QApplication.instance().exec_()
关注者
0
被浏览
180
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您尚未说明发布的示例不起作用的地方。是否有错误消息?进程是否无法接收消息?绘图结果是否与您的预期有所不同?

    作为最初的答案,我将推荐一种不同的方法:使用pyqtgraph的内置多处理功能。如果从主流程运行此代码,它将为您提供在新流程中运行的绘图窗口和曲线的代理。您在代理上调用的任何方法都将转发到远程进程:

    import pyqtgraph as pg
    pg.mkQApp()
    
    # Create remote process with a plot window
    import pyqtgraph.multiprocess as mp
    proc = mp.QtProcess()
    rpg = proc._import('pyqtgraph')
    plotwin = rpg.plot()
    curve = plotwin.plot(pen='y')
    
    # create an empty list in the remote process
    data = proc.transfer([])
    
    # Send new data to the remote process and plot it
    # We use the special argument _callSync='off' because we do
    # not want to wait for a return value.
    data.extend([1,5,2,4,3], _callSync='off')
    curve.setData(y=data, _callSync='off')
    

    请注意,我们在此处创建的所有对象-rpg,plotwin,曲线和数据-都是远程过程中真实对象的 代理
    。因此,使用常规pyqtgraph类几乎可以执行的所有操作也可以使用这些对象来完成,并且结果将显示在远程进程中。例如:

    # Local code:
    win = pg.GraphicsWindow()
    p1 = win.addPlot()
    p2 = win.addPlot()
    
    # Remote code:
    win = rpg.GraphicsWindow()
    p1 = win.addPlot()
    p2 = win.addPlot()
    

    这两个示例的唯一区别是起点–本地pyqtgraph模块的pg和远程模块的rpg。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看