Графики медленнее, чем полученные значения в реальном времени

Я пытаюсь получить данные от arduino и затем пытаюсь показать данные в режиме реального времени в python, используя подзаголовок. Значения, которые поступают с платы arduino uno, быстрые и отображаются в консоли Python с той же скоростью, но когда я пытаюсь отобразить данные в реальном времени на графике, они отображаются очень медленно. Это должно быть так же быстро, как скорость значений, поступающих с платы uno. Пожалуйста помоги. Вот мой код:

import serial 
import numpy
import matplotlib.pyplot as plt 
from drawnow import *
x = []
y = []
z = []
magnitude = []
arduinoData = serial.Serial('com4', 9600) 
plt.ion() 
count=0
fig = plt.figure()

def makeFig():
    ax1 = fig.add_subplot(4,1,1)
    ax1.plot(x, 'ro-', label='X axis')
    ax2 = fig.add_subplot(4,1,2)
    ax2.plot(y, 'b^-', label='Y axis')
    ax3 = fig.add_subplot(4,1,3)
    ax3.plot(z, 'gp-', label='Y axis')
    ax4 = fig.add_subplot(4,1,4)
    ax4.plot(magnitude, 'yo-', label='X axis')
while True: 
    while (arduinoData.inWaiting()==0):
        pass
    arduinoString = arduinoData.readline()
    dataArray = arduinoString.split(',')   
    xaxis = float( dataArray[0])            
    yaxis = float( dataArray[1])            
    zaxis = float( dataArray[2])    
    mag =float( dataArray[3])   
    x.append(xaxis)                     
    y.append(yaxis)                     
    z.append(zaxis) 
    magnitude.append(mag)
    drawnow(makeFig)
    count = count + 1

person Sayali Sheode    schedule 17.04.2015    source источник


Ответы (1)


Теперь есть некоторые вещи, которые вы должны понять, прежде чем сможете найти хорошее решение. Как быстро приходят данные от ардуино? Как быстро работает функция drawow? Эти тайминги не находятся под вашим контролем, поэтому, если данные поступают быстрее, чем может выполнить процедура построения графика, то задача, которую вы определили, невозможна. Во всех версиях Python есть модуль времени, а функция time.time() возвращает текущее время в секундах. Это можно использовать для измерения скорости функции протяжки. Возможно, вам потребуется кэшировать часть данных перед обновлением графика. Обновление сюжета несколько раз в секунду создаст иллюзию реального времени, и этого может быть достаточно.

Чтобы увидеть, насколько быстро строится график, используйте:

t = time.time()
drawnow()
print(time.time()-t)  # time in seconds
person Paul Cornelius    schedule 17.04.2015
comment
Как мне использовать time.time(), чтобы узнать скорость отрисовки сейчас? - person Sayali Sheode; 24.04.2015
comment
Кроме того, я использую 4 подзаголовка в одном окне, и я только что заметил, что, когда я комментирую все, кроме одного подзаголовка, скорость Arduino и графика совпадают. Как только я добавляю другие подграфики, график в целом становится медленным. Есть идеи, почему? - person Sayali Sheode; 24.04.2015
comment
Вероятно, график только с 1 подзаговором достаточно быстр, чтобы не отставать. - person Paul Cornelius; 25.04.2015