在IPython Notebook中制作动画图表

18
有没有一种创建动画图表的方法?例如显示相同的图表,但使用不同的参数。
例如,在SAGE笔记本中,可以编写:
a = animate([circle((i,i), 1-1/(i+1), hue=i/10) for i in srange(0,2,0.2)], 
            xmin=0,ymin=0,xmax=2,ymax=2,figsize=[2,2])
a.show()
8个回答

9

这个动画有很明显的闪烁问题,但至少它可以为我创建一个动态效果。它基于Aron的代码,但是原始代码不能直接使用。

import time, sys
from IPython.core.display import clear_output
f, ax = plt.subplots()

n = 30
x = array([i/10.0 for i in range(n)])
y = array([sin(i) for i in x])
for i in range(5,n):
  ax.plot(x[:i],y[:i])
  time.sleep(0.1)
  clear_output()
  display(f)
  ax.cla() # turn this off if you'd like to "build up" plots
plt.close()

7

更新:2014年1月

Jake Vanderplas创建了一个基于Javascript的matplotlib动画包,可以在这里找到。使用它非常简单:

 # https://github.com/jakevdp/JSAnimation
 from JSAnimation import examples
 examples.basic_animation()

Jake的JSAnimation软件包示例

请查看他的博客文章,以获取更完整的描述和示例。 历史回答(有更正,请参见goger)

是的,JavaScript更新尚未正确保持图像帧,因此会出现闪烁,但是您可以使用这种技术来做一些非常简单的事情:

import time, sys
from IPython.display import clear_output
f, ax = plt.subplots()

for i in range(10):
  y = i/10*sin(x) 
  ax.plot(x,y)
  time.sleep(0.5)
  clear_output()
  display(f)
  ax.cla() # turn this off if you'd like to "build up" plots
plt.close()

你能否添加一个合理的x值呢?我尝试了你的示例,使用简单的range(100)和numpy.arange(0, 2*pi, 0.01),但都没有产生良好的输出。此外,似乎你缺少一些导入来直接运行这段代码。 - Ivo Flipse
这是一条有点年代久远的注释:为了避免闪烁,请设置 clear_output(True)(IPython 2.0.0)。 - eldad-a

6
IPython widgets可以让您使用Notebook中的GUI对象来操作内核中的Python对象。您可能还喜欢Sage 托管的IPython Notebooks。在Notebooks中分享小部件或交互式内容时,您可能会遇到一个问题,即如果其他人没有安装IPython,则无法运行您的工作。为解决这个问题,您可以使用Domino来共享包含小部件的Notebooks,以便他人能够运行。
以下是三个示例,展示了如何在Notebook中使用pandas来过滤数据、绘制分形和使用滑块进行三维绘图。 若要了解更多信息并查看代码和Notebooks,请单击此处
如果您想要实时流式传输数据或设置仿真运行循环,还可以将数据流式传输到Notebook中的图表中。免责声明:我为Plotly工作。

5
如果您使用IPython笔记本,v2.0及以上版本支持交互式小部件。您可以在这里找到一个很好的示例笔记本(注意:您需要下载并在自己的计算机上运行才能看到滑块)。
它基本上归结为导入interact,然后传递一个函数以及参数范围。例如,从第二个链接:
In [8]:
def pltsin(f, a):
    plot(x,a*sin(2*pi*x*f))
    ylim(-10,10)
In [9]:
interact(pltsin, f=(1,10,0.1), a=(1,10,1));

这将生成一个带有两个滑块的图表,用于控制 fa

我正在尝试在iPython笔记本中对不同类型的事物进行动画处理,这似乎是目前为止我找到的最佳解决方案。是否有一种方法可以自动播放动画,以便用户不需要操作滑块? - Addem
我认为这并不是一件简单的事情。但是请看一下“事件”页面:有一个例子可以通过回调程序来编程控制小部件。因此理论上,您可以拥有一个按钮,点击它只运行一个for循环来调整滑块/控件,并在之间休眠。这将产生某人手动“滑动”控件的效果。但这并不是理想的。 - Luciano

2


0
在@goger提到“可怕的闪烁”时,我发现调用clear_output(wait=True)解决了我的问题。该标志告诉clear_output等待渲染,直到有新内容需要渲染。

0

matplotlib有一个animation模块可以实现这一点。然而,网站上提供的示例不能直接在笔记本中运行;您需要进行一些调整才能使其正常工作。

下面是页面示例的修改版本,以便在笔记本中正常工作(加粗表示修改部分)。


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
<b>from matplotlib import rc
from IPython.display import HTML</b>

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro', animated=True)

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

<b>ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
rc('animation', html='html5')
ani
# plt.show()</b> # not needed anymore

请注意,笔记本中的动画是通过电影制作的,您需要安装ffmpeg并配置matplotlib才能使用它。

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