实时的matplotlib图在循环中无法工作

16

我想创建一个实时图形绘制程序,该程序从串口接收输入。最初,我尝试了很多发布在网站上的代码,但没有一个能够工作。因此,我决定通过整合我在网站上看到的代码片段编写自己的代码。但问题是图表只会在程序结束时弹出,换句话说,在循环外部。在循环中,它什么也不显示,只有一个空白画布。我对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。


和http://stackoverflow.com/questions/14265513/matplotlib-real-time-linear-line/14266609#14266609相关的编程内容。 - tacaswell
请提供更多上下文信息,以便我能够更好地理解您需要翻译的内容。 - tacaswell
1个回答

38

在您的循环中添加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.

非常感谢你!我已经花费了一周的时间来处理这个问题。它现在运行得非常好。你给了我很大的帮助。但是,我还有一个问题:这也会稍微减慢输入流速度。是否有一种方法可以独立获取数据并绘制呢?或者我必须编写不同的函数来进行绘图和流式传输或缓冲?或者延迟时间非常小,我可以忽略它? - Nabs
2
是的,这个可以工作。这里提供的答案对我来说都没有真正起作用。 - Autonomous
非常出色和快速。如果你想更快,只需去掉time.sleep!感谢您在这里的建议,正是我所需要的。 - bretcj7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接