实时matplotlib图在循环中不起作用[重复]

Posted

技术标签:

【中文标题】实时matplotlib图在循环中不起作用[重复]【英文标题】:Real time matplotlib plot is not working while still in a loop [duplicate] 【发布时间】:2013-11-14 23:25:18 【问题描述】:

我想创建一个从串行端口获取输入的实时图形绘图程序。最初,我尝试了很多发布在网站上的代码,但都没有奏效。因此,我决定通过集成我在网站上看到的代码片段来自己编写代码。但问题是只有在程序结束时才会弹出图表,换句话说,退出循环。在循环中,它什么也不显示,只是一个空白画布。我对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 版。

【问题讨论】:

和***.com/questions/14265513/… 和***.com/questions/18791722/… 【参考方案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.

【讨论】:

非常感谢!我已经为此工作了一个多星期。它工作得很好。你帮了我很多。我还有一个问题。这也会稍微减慢输入流。有没有办法获取数据并独立绘制?或者我必须为绘图和流式传输或缓冲编写不同的函数?还是延迟时间太短,我可以忽略它? 是的,这行得通。鉴于here,没有任何答案对我真正有用。 非常好而且非常快。如果您想要更快,只需花点时间。睡觉!感谢这里的建议,正是我所需要的。

以上是关于实时matplotlib图在循环中不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我的算术表达式在 CMD FOR 循环中不起作用 [重复]

matplotlib 绘图在谷歌 colab 中不起作用

matplotlib 中的动画在 spyder 中不起作用

使用 NavigationToolbar 进行缩放在使用 pyqt 的 matplotlib 中不起作用

matplotlib:`tight_layout()` 在 PyQt 小部件中不起作用

fprint在循环中不起作用