Я на питоне 3.7.Я пытаюсь прочитать данные с последовательного порта, это будет 7 разных байтов.Затем я хотел бы разместить каждый отдельный байт на отдельном участке.Я хочу читать последовательный порт каждые 500 мс, и каждый раз, когда я читаю, добавляю новые данные на участки.Каждое чтение дает еще одну информацию для построения на каждом участке.Это в основном показания датчика.
Вот код, который я написал:
со времени импорта, сна, импорта, последовательного импорта, matplotlib.pyplot как plt
f=plt.figure(1)
ax=[0 for x in range(7)]
for i in range(0,7):
ax[i]=f.add_subplot(4,2,1+i)
ser = serial.Serial('COM3', 115200) # Establish the connection on a specific port
counter = 0
byte=ser.readline() #first line not to be plotted
while True:
counter +=1
ser.write(b'9') # send a command to the arduino
byte=ser.read(7) #read 7 bytes back
for i in range(0,7):
ax[i].plot(counter, byte[i]) # Trying to plot the new values to each different subplots
plt.pause(0.01)
sleep(.5) # Delay for one half of a second
На рисунке показанои ось x и ось y адаптируются к значению, которое я хочу указать, но на графике нет никаких данных вообще.Если я использую Scatter вместо графика, он работает, но тогда он менее универсален, и я не могу нарисовать тот тип графика, который мне нужен.Я также пытаюсь воспроизвести проблему, не используя последовательные данные, а просто отображая точки списка одну за другой следующим образом:
import matplotlib.pyplot as plt
from time import sleep
f=plt.figure()
series=[[4,3,2,1],[8,7,6,5],[12,11,10,9]]
counter=0
ax=[0 for x in range(7)]
for i in range(0,3):
ax[i]=f.add_subplot(4,2,1+i)
for j in range (0,4):
counter=counter+1
for i in range(0,3):
ax[i].plot(counter,series[i][j])
plt.pause(0.01)
sleep(1)
И он делает то же самое, окончательное изображение, которое я имею награфик таков: Который показывает, что ось взяла то, что я хотел построить, но ничего не изобразил.Дело в том, что я не хочу очищать весь график и перерисовывать все, потому что для датчика данных у меня будет около 30 дней данных для отображения в непрерывном режиме.Что я делаю не так с кодом, который я написал?
РЕДАКТИРОВАТЬ: После комментария ImportanceOfBeingErnest я попытался реализовать ответ, данный здесь .Код тогда:
from time import sleep
import serial
import matplotlib.pyplot as plt
import numpy
plt.ion()
f=plt.figure()
ax=[0 for x in range(7)]
lines=[0 for x in range(7)]
for i in range(0,7):
ax[i]=f.add_subplot(4,2,1+i)
lines[i]=ax[0].plot([],[])
def update_line(hl, new_datax, new_datay):
hl.set_xdata(numpy.append(hl.get_xdata(), new_datax))
hl.set_ydata(numpy.append(hl.get_ydata(), new_datay))
plt.draw()
ser = serial.Serial('COM3', 115200) # Establish the connection on a specific port
counter = 0
byte=ser.readline() #first line not to be plotted
while True:
counter +=1
ser.write(b'9') # send a command to the arduino
byte=ser.read(7) #read 7 bytes back
for i in range(0,7):
update_line(lines[i][0], counter, byte[i]) # Trying to plot the new values to each different subplots
plt.pause(0.01)
sleep(.5) # Delay for one half of a second
Но все равно ничего не показывает.Я думаю, что мне не хватает сюжета и / или где-нибудь очистить, но после нескольких попыток я не могу заставить его работать.