В режиме реального времени сюжет matplotlib не работает, пока находится в цикле
Я хочу создать программу для построения графиков в режиме реального времени, которая принимает данные от последовательного порта. Изначально я пробовал много кода, который размещался на сайтах, но ни один из них не работал. Итак, я решил написать код самостоятельно, интегрировав фрагменты кода, которые я видел на сайтах. Но проблема в том, что график появится только тогда, когда программа закончится, другими словами, вне цикла. Находясь в цикле, он ничего не показывает, только пустой холст. Я все еще довольно новичок в питоне. Вот мой код
import matplotlib.pyplot as plt
import time
import random
from collections import deque
import numpy as np
# simulates input from serial port
def random_gen():
while True:
val = random.randint(1,10)
yield val
time.sleep(0.1)
a1 = deque([0]*100)
ax = plt.axes(xlim=(0, 20), ylim=(0, 10))
d = random_gen()
line, = plt.plot(a1)
plt.ion()
plt.ylim([0,10])
plt.show()
for i in range(0,20):
a1.appendleft(next(d))
datatoplot = a1.pop()
line.set_ydata(a1)
plt.draw()
print a1[0]
i += 1
time.sleep(0.1)
Также я использую академическую лицензию Enthought Canopy, версия 1.1.0.
1 ответ
Решение
Вот решение добавить это plt.pause(0.0001)
в вашем цикле, как показано ниже:
import matplotlib.pyplot as plt
import time
import random
from collections import deque
import numpy as np
# simulates input from serial port
def random_gen():
while True:
val = random.randint(1,10)
yield val
time.sleep(0.1)
a1 = deque([0]*100)
ax = plt.axes(xlim=(0, 20), ylim=(0, 10))
d = random_gen()
line, = plt.plot(a1)
plt.ion()
plt.ylim([0,10])
plt.show()
for i in range(0,20):
a1.appendleft(next(d))
datatoplot = a1.pop()
line.set_ydata(a1)
plt.draw()
print a1[0]
i += 1
time.sleep(0.1)
plt.pause(0.0001) #add this it will be OK.