2016-11-13 2 views
1

Я готов получить 2 случайных данных и построить его в том же виджете, используя PyQtGraph в режиме реального времени. Я хочу, чтобы они отображались как красные и синие точки. Однако, после трудного времени, мой скрипт не работает.Как построить две данные в режиме реального времени в одном графике в 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 -*- 

Я очень ценю вашу помощь.

+0

'dataRed [: - 1] = dataRed [1:] dataRed [-1] = np.array (VEC)' не этот переход к представлению данных, 1 место на спине а затем заменить последний элемент вместо первого? –

+0

@ MaartenFabré У меня было намерение сделать это, на самом деле Это простая версия более крупной проблемы, связанной с кривыми в реальном времени. В любом случае, спасибо за ваш комментарий! –

ответ

2

Хотя pyqtgraph - отличный пакет с точки зрения функциональности, к сожалению, документации не хватает, и вам просто нужно вникнуть в код и начать понимать структуру объектов.

Когда вы звоните:

p1 = win.addPlot() 

Это возвращает ссылку на PlotItem, в этот момент, теперь вы можете добавить несколько PlotDataItems к этому p1 объекта (см полу-полезную структурную диаграмму здесь: http://www.pyqtgraph.org/documentation/plotting.html#organization-of-plotting-classes)

Так что, когда вы звоните:

curve1 = p1.plot() 

Это добавляет PlotDataItem # 1, ... теперь нужно называть его снова, чтобы получить вторую ссылку, чтобы использовать:

curve2 = p1.plot() 

Это становится PlotDataItem # 2, который затем можно использовать для 2-го методы УстановитьДанной в вашем методе участка() для вызова во время обновления(). Какой будет выглядеть так:

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')) 
+0

WOW! Большое спасибо. Я решил проблему. Большое спасибо за все объяснение! –

Смежные вопросы