2016-09-09 3 views
1

私は現在、8つのセンサーを読み込んでリアルタイムグラフをプロットするプロジェクトを作成中です。私はMatplotlibを使用しましたが、速度が遅いのでpyqtgraphに切り替えました。それは比較的速いです。私は文書を参照し、ライブデータをプロットする簡単なコードを設計しました。 私が直面している唯一の問題は、ディスクスペースとCPU使用量が大幅に増加することです.20分程度の時間を費やしています。ここに私のコードです。PyQtGraphとnumpyリアルタイムプロット

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と互換性があると聞いた。私はこのプログラミングのことを初めて勉強しているので、私はこれらの温度の読み取り値をとり、グラフをプロットする数値配列を作ることができません。私もドキュメントを参照しましたが、それは助けなかった

私は8つのセンサーがあります私は8つの異なるnumpy配列またはこれらをプロットする関数を1つの多次元配列のようなものを作成する必要があります値はリアルタイムで

誰かがリストの代わりに細かい配列を作成するのを助けることができたら、私は感謝します。

答えて

0

リストをnp.arrayに置き換えたい場合、1つの大きな問題に直面します。リストと同じようにデータを配列に追加することは直接できません。 1つの可能性は、例えば、 np.hstack,np.vstack,np.column_stackまたはnp.row_stack。ここでは、np.hstackを使用してupdateSensor1機能を変化させることができる方法の例です:

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() 

しかし、アレイ用の各「追加」アクションが必要なメモリの短期倍増が必要なので、あなたはおそらくリストを使用することが可能になることがわかります大規模な配列を処理する場合はより効率的です。

よりよい解決策は、たとえば20分のプロット後に、目的の最終出力と同じ大きさの配列(たとえばnp.zeros)を生成することです。そうすれば、配列の作成/破壊を避けることができます。あなただけ例えば、右のデータを更新し、プロットするために、別のカウント変数を作成したり、updateSensor1 -functionに時間を渡す必要が続いて:複数のセンサについては

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:

あなたが各300sかそこら、まだは、x軸は続けたいpopリストが時間内に2番目のリストを渡す必要がある場合、またはx /時間の値を持つ配列。次に、あなただけのtimesリストにあなたがあなたのtempC1リストを開くと同じ時間をポップする必要があり

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() 

:私のようなものをお勧めします。基準時刻t0は変更されていないので、これは常に正しい時刻を与えるはずです。

+0

貴重なチュートリアルをありがとうございました。どういうわけか私は以前のコードをより効率的にしてくれました。唯一の問題は、リアルタイムである程度のタイムラグがあることです(時間は50秒です)。 Numpyがこのタイムラグを撲滅し、リアルタイムにするのに役立つと思いますか? また、私のプログラムをより効率的にするために、私は 'tempC1 'を試しています。pop(0) 'はカウンタが300に達したときのリストです。ポップは良好に機能しますが、x軸は0〜300のままです。リスト内の値がポップされた後でも軸がリアルタイムを表示している間にリストアイテムをポップする方法はありますか? – Ajay

+0

リストに最大300個の値しかない場合は、リストの使用に遅れが生じるとは思わない。 x軸の問題に関する私の編集をチェックしてください。 –

+0

それは絶対にうまく動作します。ありがとうございました.. – Ajay