2016-10-29 21 views
0

私は、USARTのシリアルバス経由でPythonでマイクロコントローラから受信したいくつかのデータをプロットしようとしています。すべてのデータを並行してリアルタイムでプロットすることができればいいと思います。matplotlibを使ったPythonリアルタイムプロット

私が1つのプロットを使用すると、データはリアルタイムでプロットされますが、サブプロットを使用すると、1つのサブチャネルのみをプロットするだけでデータがますます遅延します。誰かがアイデアを持っている理由はなぜPythonのサブプロットは非常に遅いですか?

私は、関数update()の時間消費も測定しましたが、それは2ms以下と思われます。データは5ms以上毎にのみ受信されます。どうすればスピードを上げることができますか?

敬具:セバスチャン・T.

は、ここに私のコード

import serial 
import matplotlib.pyplot as plt 
import matplotlib.animation as anim 
import time 
from collections import deque 

#SERIAL####################################################### 
try: 
    ser = serial.Serial() 
    ser.baudrate=115200; 
    ser.port = 'COM7' 
    ser.open() 
except: 
    ser.close() 
    print('Problem occured') 

ser.flushInput() 
ser.flushOutput() 

#PLOT########################################################## 

MAX_X = 250 #width of graph 
MAX_Y = 70000 #height of graph 

# intialize line to horizontal line on 0 
line1 = deque([0.0]*MAX_X, maxlen=MAX_X) 
line2 = deque([0.0]*MAX_X, maxlen=MAX_X) 
line3 = deque([0.0]*MAX_X, maxlen=MAX_X) 
line4 = deque([0.0]*MAX_X, maxlen=MAX_X) 
line5 = deque([0.0]*MAX_X, maxlen=MAX_X) 

plt.close('all') 
fig, (ax1,ax2,ax3,ax4) = plt.subplots(4,1) 

l1, = ax1.plot([], []) 
l2, = ax2.plot([], []) 
l3, = ax3.plot([], []) 
l4, = ax4.plot([], []) 

l=[l1,l2,l3,l4] 

for ax in [ax1,ax2,ax3,ax4]: 
    ax.set_ylim(-(MAX_Y/2),MAX_Y/2) 
    ax.set_xlim(-(MAX_X/2),MAX_X/2) 
    ax.grid() 

def update(fn, data): 
    try: 
     t = time.time() 
     #prepare Data 
     data_raw = ser.readline() 
     data_raw = data_raw.split(',') 
     data_raw = data_raw[1::2] 

     #Update Plots 
     line1.append(int(data_raw[0])) 
     line2.append(int(data_raw[1])) 
     line3.append(int(data_raw[2])) 
     line4.append(int(data_raw[3])) 

     #Set Data 
     l[0].set_data(range(-MAX_X/2, MAX_X/2), line1) 
     l[1].set_data(range(-MAX_X/2, MAX_X/2), line2) 
     l[2].set_data(range(-MAX_X/2, MAX_X/2), line3) 
     l[3].set_data(range(-MAX_X/2, MAX_X/2), line4) 
     print(time.time() - t) 

    except: 
     print('exception') 
     ser.close() 

ani = anim.FuncAnimation(fig,update,fargs=(0,),frames=1, interval=100) 
plt.show() 
+0

つに挨拶になっていることクラーであるということですあなたのコードの最後の行についての注釈:** 1。**プロットを「リアルタイム」(5msごとに)にしたいのであれば、どうしてフレーム間の間隔を100msに設定し、5ms以下にしなかったのですか? ** 2。** 'frames = 1'はあなたのアニメーションが1つのフレームのみを表示し、そのフレームをループ表示してアニメーション化されないと言います。 – jadsq

+0

こんにちはjadsq、1msに間隔を変更するのを忘れていました私はここに投稿しましたが、間隔= 1msでもリアルタイムのプロットは得られません。私がフレームを変えたとき、フレームはプロットに全く影響しないようです。 – HansPeterLoft

+0

たとえば、フレーム= 23とインターバル= 1を使用すると、1フレームに23msが必要ですか?私がフレームを増やすと、それはずっと悪くなるようです。何とか間隔を1ms以下に設定できますか? – HansPeterLoft

答えて

0

プロットされたデータポイントの数が増える場合、これは既知の問題です。 D/Aコンバータからリアルタイムでデータをプロットし、約500点のプロット点の後にcla()で軸をクリアする必要がありました。

理由は...すべての時間が完全にすべてのプロット点を含む全体の数字を更新し、「DEF更新」呼び出すと、

より多くのunperformant博士コブラ

関連する問題