Я пытаюсь построить несколько данных, которые я получаю по последовательной шине USART от микроконтроллера на питоне. Было бы хорошо, если бы я мог строить все данные параллельно и в реальном времени.Python realtime plot with matplotlib
Когда я использую один график, данные отображаются в реальном времени, но когда я использую подзаголовки, данные все больше и больше задерживаются, также если я только рисую один подканал. Есть ли у кого-нибудь идеи, почему подзаголовки в python настолько медленнее?
Я измерил также потребление времени для обновления функции(), кажется, 2 мс или меньше. Данные я получаю только каждые 5 мс или более. Как я могу улучшить скорость?
С наилучшими пожеланиями: Себастьян Т.
Вот мой код
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. ** если вы хотите, чтобы ваш график был «в реальном времени» (так каждые 5 мс или около того), почему вы установили интервал между кадрами до 100 мс, а не 5 мс или меньше? ** 2. ** 'frames = 1' говорит, что в вашей анимации будет отображаться только один кадр, а затем цикл, отображающий этот кадр, который не будет таким анимированным ... – jadsq
Привет jadsq, я забыл изменить интервал до 1 мс, когда Я разместил здесь, но также с интервалом = 1 мс я получаю не графики в реальном времени. Фреймы, похоже, вообще не влияют на сюжеты, когда я меняю его. – HansPeterLoft
Если я, например, использую рамки = 23 и interval = 1, то нужен ли один кадр 23 мс? Похоже, что когда я увеличиваю рамки, становится намного хуже. Могу ли я как-то установить интервал ниже 1 мс? – HansPeterLoft