Этот ответ не так элегантен, как использование animation-api - но он работает.
Вы должны адаптироваться довольно много - ради примера Минимальный, Полный и Проверяемый Мне пришлось реализовать свой собственный "серийный" поставщик данных:
from itertools import cycle
data = [0,0,0,0,0,0,0,0,0,2,25,64,92,119,132,139,124,123,103,71,38,3]
cyc = cycle(data)
def serial():
from random import randint
def create_data():
for k in range(randint(2,3)):
yield next(cyc)
return list(create_data())
Один из способов ее решения:
Вам также необходимо получить оси вашего графика, чтобы отрегулировать отображаемую «область», затем вам нужно указать правильные значения x в качестве «времени» и значения y в виде чтения из серийного номера (вы можете увеличивать переменную «сколько данных получено» при каждом извлечении в течение времени ):
from tkinter import *
from matplotlib import pyplot as plt
fig, ax = plt.subplots()
ax.set_ylim(-200, 200)
ax.set_xlim(0,110)
fig.show()
fig.canvas.draw()
time = 0
last = 0
while True:
# "animate" x-axis
if time > 100:
ax.set_xlim(time-100,time+10)
data = serial()
print(data)
# add the last datapoint again so you get a continuous curve
plt.plot([time-1]+[time+x for x in range(len(data))], [last]+data)
# increment time
time += len(data)
# remember last data-value
last = data[-1]
fig.canvas.draw()
Чтобы получить (текстовый вывод опущен - он просто повторяет данные сверху по-разному в разбивке):
По цветным отрезкам линий видно, какие данные были добавлены вместе.