如何在 PyQtGraph 中的一个图中绘制两个实时数据?
How to plot two real-time data in one single plot in PyQtGraph?
我愿意获取 2 个随机数据,并使用 PyQtGraph 以实时方式将其绘制在同一个 Widget 中。我希望它们显示为红点和蓝点。但是,好不容易,我的脚本还是不行。
我想知道我该怎么做才能在同一个图中获取这两个数据。
我知道这是一个愚蠢的问题。我是 Python 和编码的初学者。
这是我的代码:
#-*- coding: utf-8 -*-
import random
import time
from collections import deque
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import os
import spidev
win = pg.GraphicsWindow()
win.setWindowTitle('DOTS')
p1 = win.addPlot()
p1.setRange(yRange=[0,25])
p1.setRange(xRange=[0,25])
curve1 = p1.plot()
nsamples=300 #Number of lines for the data
dataRed= np.zeros((nsamples,2),float) #Matrix for the Red dots
dataBlue=np.zeros((nsamples,2),float) #Matrix for the Blue dots
def getData():
global dataRed, dataBlue
t0= random.uniform(1.6,20.5) #Acquiring Data
d0= random.uniform(1.6,20.5) #Acquiring Data
vec=(t0, d0)
dataRed[:-1] = dataRed[1:]
dataRed[-1]=np.array(vec)
t0= random.uniform(1.6,20.5) #Acquiring Data
d0= random.uniform(1.6,20.5) #Acquiring Data
vec=(t0, d0)
dataBlue[:-1] = dataBlue[1:]
dataBlue[-1]=np.array(vec)
def plot():
#Blue Dots
curve1.setData(dataBlue, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('b'))
#Red Dots
curve1.setData(dataRed, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('r'))
def update():
getData()
plot()
timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()# -*- coding: utf-8 -*-
非常感谢您的帮助。
虽然从功能的角度来看 pyqtgraph 是一个很棒的包,但不幸的是缺少文档,您真的只需要深入研究代码并开始理解对象的结构。
当你打电话时:
p1 = win.addPlot()
此 returns 对 PlotItem 的引用,此时您现在可以将多个 PlotDataItems 添加到此 p1 对象(请参阅此处半有用的结构图:http://www.pyqtgraph.org/documentation/plotting.html#organization-of-plotting-classes)
所以当你打电话时:
curve1 = p1.plot()
这添加了 PlotDataItem #1,...您现在需要再次调用它以获取第二个引用以供使用:
curve2 = p1.plot()
这将成为 PlotDataItem #2,然后您可以将其用于 plot() 方法中的第二个 setData 方法,以便在 update() 期间调用。看起来像:
def plot():
#Blue Dots
curve1.setData(dataBlue, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('b'))
#Red Dots
curve2.setData(dataRed, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('r'))
我愿意获取 2 个随机数据,并使用 PyQtGraph 以实时方式将其绘制在同一个 Widget 中。我希望它们显示为红点和蓝点。但是,好不容易,我的脚本还是不行。
我想知道我该怎么做才能在同一个图中获取这两个数据。
我知道这是一个愚蠢的问题。我是 Python 和编码的初学者。
这是我的代码:
#-*- coding: utf-8 -*-
import random
import time
from collections import deque
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import os
import spidev
win = pg.GraphicsWindow()
win.setWindowTitle('DOTS')
p1 = win.addPlot()
p1.setRange(yRange=[0,25])
p1.setRange(xRange=[0,25])
curve1 = p1.plot()
nsamples=300 #Number of lines for the data
dataRed= np.zeros((nsamples,2),float) #Matrix for the Red dots
dataBlue=np.zeros((nsamples,2),float) #Matrix for the Blue dots
def getData():
global dataRed, dataBlue
t0= random.uniform(1.6,20.5) #Acquiring Data
d0= random.uniform(1.6,20.5) #Acquiring Data
vec=(t0, d0)
dataRed[:-1] = dataRed[1:]
dataRed[-1]=np.array(vec)
t0= random.uniform(1.6,20.5) #Acquiring Data
d0= random.uniform(1.6,20.5) #Acquiring Data
vec=(t0, d0)
dataBlue[:-1] = dataBlue[1:]
dataBlue[-1]=np.array(vec)
def plot():
#Blue Dots
curve1.setData(dataBlue, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('b'))
#Red Dots
curve1.setData(dataRed, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('r'))
def update():
getData()
plot()
timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()# -*- coding: utf-8 -*-
非常感谢您的帮助。
虽然从功能的角度来看 pyqtgraph 是一个很棒的包,但不幸的是缺少文档,您真的只需要深入研究代码并开始理解对象的结构。
当你打电话时:
p1 = win.addPlot()
此 returns 对 PlotItem 的引用,此时您现在可以将多个 PlotDataItems 添加到此 p1 对象(请参阅此处半有用的结构图:http://www.pyqtgraph.org/documentation/plotting.html#organization-of-plotting-classes)
所以当你打电话时:
curve1 = p1.plot()
这添加了 PlotDataItem #1,...您现在需要再次调用它以获取第二个引用以供使用:
curve2 = p1.plot()
这将成为 PlotDataItem #2,然后您可以将其用于 plot() 方法中的第二个 setData 方法,以便在 update() 期间调用。看起来像:
def plot():
#Blue Dots
curve1.setData(dataBlue, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('b'))
#Red Dots
curve2.setData(dataRed, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('r'))