私は、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()
つに挨拶になっていることクラーであるということですあなたのコードの最後の行についての注釈:** 1。**プロットを「リアルタイム」(5msごとに)にしたいのであれば、どうしてフレーム間の間隔を100msに設定し、5ms以下にしなかったのですか? ** 2。** 'frames = 1'はあなたのアニメーションが1つのフレームのみを表示し、そのフレームをループ表示してアニメーション化されないと言います。 – jadsq
こんにちはjadsq、1msに間隔を変更するのを忘れていました私はここに投稿しましたが、間隔= 1msでもリアルタイムのプロットは得られません。私がフレームを変えたとき、フレームはプロットに全く影響しないようです。 – HansPeterLoft
たとえば、フレーム= 23とインターバル= 1を使用すると、1フレームに23msが必要ですか?私がフレームを増やすと、それはずっと悪くなるようです。何とか間隔を1ms以下に設定できますか? – HansPeterLoft