在Jupyter / iPython中dynamic更新图表的最新方法是什么?

在如何dynamic更新ipython笔记本(在一个单元格内)循环中绘图的答案中,给出了一个示例,说明如何在Python循环内dynamic更新Jupyter笔记本内的绘图。 然而,这种方法通过在每次迭代中破坏并重新创build情节起作用,并且在其中一个线索中的评论指出,可以通过使用新的ish %matplotlib nbagg magic来改善这种情况,其提供embedded在笔记本,而不是一个静态的图像。

然而,就我所知,这个奇妙的新的nbaggfunction似乎完全没有logging,而且我无法find如何使用它来dynamic更新情节的例子。 因此我的问题是, 如何使用nbagg后端有效地更新Jupyter / Python笔记本中的现有绘图? 由于dynamic更新matplotlib中的图是一个棘手的问题,一个简单的工作示例将是一个巨大的帮助。 任何关于这个主题的文档的指针也是非常有帮助的。

为了清楚我所要求的:我想要做的是运行一些模拟代码进行一些迭代,然后绘制一个当前状态的图,然后运行它几次迭代,然后更新图以反映当前状态,等等。 所以这个想法是绘制一个情节,然后在没有任何用户的交互的情况下更新情节中的数据而不破坏和重新创build整个事情。

下面是上面链接问题的答案略有修改的代码,通过每次重新绘制整个数字来实现这一点。 我想达到相同的结果,但更有效地使用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) 

这里是一个例子,更新一个循环的情节。 它更新图中的数据,并且不会每次都重新绘制整个数字。 它确实会阻止执行,但是如果您有兴趣运行一组有限的仿真并将结果保存在某处,那么对您而言可能不是问题。

 %matplotlib notebook import numpy as np import matplotlib.pyplot as plt import time def pltsin(ax, colors=['b']): x = np.linspace(0,1,100) if ax.lines: for line in ax.lines: line.set_xdata(x) y = np.random.random(size=(100,1)) line.set_ydata(y) else: for color in colors: y = np.random.random(size=(100,1)) ax.plot(x, y, color) fig.canvas.draw() fig,ax = plt.subplots(1,1) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_xlim(0,1) ax.set_ylim(0,1) for f in range(5): pltsin(ax, ['b', 'r']) time.sleep(1) 

我在这里把它放在nbviewer上。

有一个IPython Widget版本的nbagg ,目前正在Matplotlib仓库中进行中 。 当可用时,这可能是使用nbagg的最佳方式。

编辑:更新显示多个情节