График в реальном времени matplotlib не работает, пока он все еще находится в цикле

Я хочу создать программу построения графика в реальном времени, которая принимает входные данные из последовательного порта. Первоначально я пробовал много кода, размещенного на веб-сайтах, но ни один из них не работал. Итак, я решил написать код самостоятельно, объединив фрагменты кода, которые я видел на веб-сайтах. Но проблема в том, что график выскочит только тогда, когда программа закончится, другими словами, из цикла. Пока в цикле он ничего не показывает, просто пустой холст. Я все еще довольно новичок в python. Вот мой код.

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.