我试图使用OpenCV实时绘制来自摄像机的一些数据 . 但是,实时绘图(使用matplotlib)似乎不起作用 .
我把这个问题分成了这个简单的例子:
fig = plt.figure()
plt.axis([0, 1000, 0, 1])
i = 0
x = list()
y = list()
while i < 1000:
temp_y = np.random.random()
x.append(i)
y.append(temp_y)
plt.scatter(i, temp_y)
i += 1
plt.show()
我希望这个例子可以单独绘制1000个点 . 实际发生的是窗口弹出第一个点显示(确定),然后在填充图表的其余部分之前等待循环完成 .
有什么想法,为什么我没有看到一次填充一个点?
10 回答
这是有问题的代码的工作版本(至少需要2011-11-14版本的Matplotlib 1.1.0版本):
请注意一些变化:
plt.pause(0.05)
以绘制新数据并运行GUI的事件循环(允许鼠标交互) .如果你're interested in realtime plotting, I'建议调查matplotlib's animation API . 特别是,使用
blit
来避免在每一帧上重新绘制背景可以为您带来显着的速度增益(~10x):输出:
show
可能不是最好的选择 . 我要做的是改用pyplot.draw()
. 您还可能希望在循环中包含一个小的时间延迟(例如,time.sleep(0.05)
),以便您可以看到正在发生的情节 . 如果我对你的例子进行了这些修改,它对我有用,我看到每个点一次出现一个 .这些方法都不适合我 . 但我发现了这个Real time matplotlib plot is not working while still in a loop
你只需要添加
而且你可以看到新的情节 .
So your code should look like this, and it will work
我知道我回答这个问题有点晚了 . 不过,我前段时间制作了一些代码来绘制实时图表,我想分享一下:
试一试吧 . 将此代码复制粘贴到新的python文件中,然后运行它 . 你应该得到一个漂亮,流畅的图表:
我知道这个问题已经过时了,但现在有一个名为drawnow的软件包在GitHub上被称为"python-drawnow" . 这提供了类似于MATLAB的绘图界面 - 您可以轻松更新图形 .
您的用例的示例:
python-drawnow是一个围绕
plt.draw
的薄包装器,但提供了在图形显示后确认(或调试)的能力 .顶部(以及许多其他)答案 Build 在
plt.pause()
之上,但这是在matplotlib中制作动画的旧方法 . 它不仅速度慢,而且在每次更新时都会引起焦点(我很难停止绘制python进程) .TL;DR: 您可能想要使用
matplotlib.animation
(as mentioned in documentation) .在挖掘了各种答案和代码之后,事实证明这是为我无限地绘制传入数据的一种平滑方式 .
这是我的快速入门代码 . 它以无限的每200ms在[0,100]中随机编号绘制当前时间,同时还处理视图的自动重新缩放:
您还可以探索
blit
以获得更好的性能as in FuncAnimation documentation .问题似乎是你希望
plt.show()
显示窗口然后返回 . 它没有这样做 . 程序将在此时停止,并且只有在关闭窗口后才会恢复 . 您应该能够测试:如果您关闭窗口,则应弹出另一个窗口 .要解决该问题,请在循环后调用
plt.show()
一次 . 然后你得到完整的情节 . (但不是'real-time plotting')您可以尝试设置关键字参数
block
,如下所示:plt.show(block=False)
一次开头,然后使用.draw()进行更新 .这是我在我的系统上工作的版本 .
drawow(makeFig)行可以用makeFig()替换; plt.draw()序列,它仍然可以正常工作 .
如果你想要绘制而不是冻结线程,因为绘制了更多的点你应该使用plt.pause()而不是time.sleep()
我使用以下代码绘制一系列xy坐标 .