实现pyqtgraph进行实时数据绘图
我正在尝试获取实时数据图,因为它是由使用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_()
-
您尚未说明发布的示例不起作用的地方。是否有错误消息?进程是否无法接收消息?绘图结果是否与您的预期有所不同?
作为最初的答案,我将推荐一种不同的方法:使用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。