2016-09-09 9 views
1

В настоящее время я делаю проект, который считывает 8 датчиков и графиков реального времени. Я использовал Matplotlib, но он был медленным, поэтому я переключился на pyqtgraph. Это сравнительно очень быстро. Я ссылался на документацию и разработал простой код, который отображает данные в реальном времени. Единственная проблема, с которой я столкнулся, - это дисковое пространство, и использование процессора резко возрастает, так как я позволяю ему рисовать 20 минут или около того. Вот мой код.PyQtGraph и numpy realtime plot

from tinkerforge.ip_connection import IPConnection 
from tinkerforge.bricklet_ptc import BrickletPTC 

from pyqtgraph.Qt import QtGui, QtCore 
import numpy as np 
import pyqtgraph as pg 

win = pg.GraphicsWindow(title="Basic plotting examples") 
win.resize(1280,720) 
win.setWindowTitle('Live Temperature Data') 
#Enable antialiasing for prettier plots 
pg.setConfigOptions(antialias=True) 


p1 = win.addPlot(title = 'Sensor1') 
curve1 = p1.plot(pen = '#00A3E0') 
p1.setLabel('left', "Temperature", units='°C') 
p1.setLabel('bottom', "Time", units= 's') 
p1.setDownsampling(auto=True,mode='peak') 
p1.setClipToView(True) 
p1.showGrid(x=True, y=True) 

tempC1 = [] 

def updateSensor1(): 
    global curve1, tempC1, indx1, p1 

    ipcon = IPConnection() # Create IP connection 
    ptc1 = BrickletPTC(UID1, ipcon) # S1 
    ipcon.connect(HOST, PORT) # Connect to brickd 
    temperature1 = ptc1.get_temperature() 

    dataArray1=str(temperature1/100).split(',') 
    temp1 = float(dataArray1[0]) 
    tempC1.append(temp1) 

    curve1.setData(tempC1) 
    app.processEvents() 


timer1 = QtCore.QTimer() 
timer1.timeout.connect(updateSensor1) 
timer1.start(1000) 

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

Я слышал, что списки намного медленнее, а numpy очень быстро и гораздо более совместимо с pyqtgraph. Поскольку я новичок в этом программном материале, я не могу создать массив numpy, который принимает эти показания температуры и отображает график. Я также ссылался на документацию, но это не помогло.

Ps sicne У меня есть 8 датчиков. Я понятия не имею, должен ли я создавать 8 различных массивов numpy или что-то вроде одного многомерного массива, который принимает значения датчиков и функцию, которая отображает эти values ​​in real time

Я был бы признателен, если кто-то может помочь мне создать массивы numpy вместо списков.

ответ

0

Так что, если вы хотите заменить свой список np.array, вы столкнетесь с одной серьезной проблемой: прямо не возможно добавить данные в массив так же, как со списком. Одна из возможностей заключается в использовании, например, np.hstack, np.vstack, np.column_stack или np.row_stack. Вот пример того, как можно изменить свою updateSensor1 функции с помощью np.hstack:

tempC1 = np.array(()) 

def updateSensor1(): 
    global curve1, tempC1, indx1, p1 

    ipcon = IPConnection() # Create IP connection 
    ptc1 = BrickletPTC(UID1, ipcon) # S1 
    ipcon.connect(HOST, PORT) # Connect to brickd 
    temperature1 = ptc1.get_temperature() 

    dataArray1=str(temperature1/100).split(',') 
    temp1 = np.array((dataArray1[0])).astype(np.float32) 
    tempC1 = np.hstack((tempC1,temp1)) 

    curve1.setData(tempC1) 
    app.processEvents() 

Однако для массивов каждые «добавить» действие требует краткосрочного удвоения требуемой памяти, так что вы, вероятно, обнаружите, что использование списка будет более эффективны, когда вы будете иметь дело с большими массивами.

Лучшее решение состоит в том, чтобы сгенерировать массив (например, np.zeros), который имеет желаемый конечный результат, например, после 20 минут построения графика. Таким образом, вы можете избежать создания/уничтожения массивов. Тогда вам просто нужно создать еще один отсчет переменным или пройти время к updateSensor1 -функции, чтобы обновить и построить правильные данные, например:

tempC1 = np.zeros((1200)) 
count = 0 

def updateSensor1(): 
    global curve1, tempC1, indx1, p1, count 

    ipcon = IPConnection() # Create IP connection 
    ptc1 = BrickletPTC(UID1, ipcon) # S1 
    ipcon.connect(HOST, PORT) # Connect to brickd 
    temperature1 = ptc1.get_temperature() 

    dataArray1=str(temperature1/100).split(',') 
    temp1 = float(dataArray1[0]) 
    tempC1[count] = temp1 

    curve1.setData(tempC1[::count]) 
    count += 1 
    app.processEvents() 

Для нескольких датчиков, вы можете просто добавлять новые размеры к вашему массив, например для 8 датчиков создайте массив np.zeros((1200,8)). Я надеюсь, что это было полезно в некотором роде ...

EDIT:

Если вы pop списка каждого 300s или так и по-прежнему хотите, чтобы ось х, чтобы продолжить во время, вы должны пройти второй список или массив с значениями x/time. Я хотел бы предложить что-то вроде:

import time 

times = [] 
t0 = time.time() 

def updateSensor1(): 
    global curve1, tempC1, indx1, p1, times, t0 

    ipcon = IPConnection() # Create IP connection 
    ptc1 = BrickletPTC(UID1, ipcon) # S1 
    ipcon.connect(HOST, PORT) # Connect to brickd 
    temperature1 = ptc1.get_temperature() 

    dataArray1=str(temperature1/100).split(',') 
    temp1 = float(dataArray1[0]) 
    tempC1.append(temp1) 
    times.append(time.time()-t0) 

    curve1.setData(times,tempC1) 
    app.processEvents() 

Тогда вы должны просто вытолкнуть times лист в то же время вы совать свой tempC1 список. Поскольку контрольное время t0 не изменяется, это должно дать вам всегда правильное время.

+0

Благодарим вас за ценный учебник. Как-то я сделал мой предыдущий код более эффективным, и он отлично работает со списком. Единственная проблема заключается в том, что у меня есть некоторое время с реальным временем (50 секунд для Hr). Как вы думаете, Numpy поможет искоренить это отставание и сделать его реальным временем? Кроме того, чтобы сделать мою программу более эффективной, я пытаюсь «tempC1.pop (0) 'списки, когда счетчик достигает 300 секунд. Поп-функции хороши, но ось x остается на 0-300. Есть ли способ, по которому я могу поместить элементы списка, пока ось показывает реальное время даже после того, как вы увидите значения в списке? – Ajay

+0

Я не думаю, что отставание происходит от использования списка, если у вас в нем максимум 300 значений. Проверьте мои изменения относительно проблемы оси x. –

+0

Он работает абсолютно нормально. Еще раз спасибо .. – Ajay

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