如何在PyQtGraph的单个绘图中绘制两个实时数据?

Hug*_*ira 3 python real-time pyqtgraph

我愿意获得2个随机数据,并使用PyQtGraph实时地将其绘制在同一控件中。我希望它们显示为红色和蓝色的点。但是,经过一段时间后,我的脚本无法正常工作。

我想知道要怎么做才能在同一图中获得两个数据。

我知道这是一个愚蠢的问题。我是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 -*-
Run Code Online (Sandbox Code Playgroud)

我将衷心感谢您的帮助。

小智 5

从功能的角度来看,虽然pyqtgraph是一个不错的软件包,但是不幸的是缺少文档,您实际上只需要深入研究代码并开始理解对象的结构即可。

你打电话的时候:

p1 = win.addPlot() 
Run Code Online (Sandbox Code Playgroud)

这将返回对PlotItem的引用,此时您可以在此p1对象中添加多个PlotDataItem(请参见此处的半有用结构图:http ://www.pyqtgraph.org/documentation/plotting.html#organization-of- 绘图类

因此,当您致电:

curve1 = p1.plot()
Run Code Online (Sandbox Code Playgroud)

这将添加PlotDataItem#1,...现在您需要再次调用它以获得第二个引用以使用:

curve2 = p1.plot()
Run Code Online (Sandbox Code Playgroud)

这将成为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')) 
Run Code Online (Sandbox Code Playgroud)