在对how to dynamically update a plot in a loop in ipython notebook (within one cell)的回答中,给出了一个如何在Python循环中动态更新Python笔记本中的图表的例子。然而,这是通过在每次迭代中销毁和重新创建图表来实现的,其中一个线程中的评论指出,这种情况可以通过使用新的%matplotlib nbagg
魔术来改善,它提供了一个嵌入笔记本中的交互式图形,而不是静态图像。
然而,这个奇妙的新nbagg
功能似乎完全没有文档记录,我无法找到如何使用它来动态更新绘图的示例。因此我的问题是,**如何使用nbagg后端有效地更新Python/Python Notebook中的现有绘图?**由于在matplotlib中动态更新图通常是一个棘手的问题,一个简单的工作示例将是一个巨大的帮助。指向任何相关文档的指针也将非常有帮助。
先说清楚我的要求:我想做的是运行一些模拟代码几次迭代,然后绘制其当前状态的图,然后再运行几次迭代,然后更新图以反映当前状态,等等。所以想法是绘制一个图,然后,没有用户的任何交互,更新图中的数据,而不破坏和重新创建整个东西。
下面是从上面链接的问题的答案中稍微修改的代码,它通过每次重新绘制整个图来实现这一点。我想实现相同的结果,但使用nbagg
更有效。
%matplotlib inline
import time
import pylab as pl
from IPython import display
for i in range(10):
pl.clf()
pl.plot(pl.randn(100))
display.display(pl.gcf())
display.clear_output(wait=True)
time.sleep(1.0)
5条答案
按热度按时间t40tm48m1#
这里有一个循环更新图的例子。它更新图中的数据,而不是每次都重新绘制整个图。它确实会阻止执行,但如果你有兴趣运行一组有限的模拟并将结果保存在某个地方,这对你来说可能不是问题。
%matplotlib widget
魔术需要ipympl
Matplotlib扩展包。我把这个up on nbviewer here,这里是a direct link to the gist
jgzswidk2#
我正在使用jupyter-lab,这对我很有效(根据您的情况进行调整):
然后在一个循环中填充一个字典,并将其传递给
live_plot()
:请确保在图的下方有几个单元格,否则每次重绘图时视图都会捕捉到位。
jtjikinw3#
如果你不想清除所有的输出,你可以使用
display_id=True
来获取一个句柄,然后在上面使用.update()
:(改编自@ martematics)
0aydgbwb4#
我已经调整了@Ziofil的答案,并将其修改为接受x,y作为列表,并在同一图上输出散点图和线性趋势。
你只需要在一个循环中调用
live_plot(x, y)
.它是这样的:x1c 0d1xlh80um4z5#
图中的
canvas.draw
方法动态更新其图形,对于当前图: