iPython笔记本中的动画

时间:2016-02-21 04:58:42

标签: python-3.x animation ipython jupyter-notebook

我正在尝试将动画放入iPython笔记本中,但我找不到解决方案。我看过一篇用交互式小部件讨论过的帖子,但是我对此有几个问题:首先,我用小部件看到的每个例子都使用滑块或其他输入,而我只想让动画在单元格时自动运行运行。其次,所有文档似乎都在Jupyter的网站上过时了 - 每当我下载并运行他们的笔记本时,我都会收到关于某些模块被弃用的消息,然后在文件中有些东西无法运行,可能是因为他们试图导入和访问不再存在的文件。

我已经看过关于这个主题的其他一些页面,但是他们经常需要下载二进制文件或其他模块,但我部分使用它来教一些学生数学,我让他们下载Anaconda - 我希望不要进一步混淆这个问题,让他们下载并安装更复杂的东西,同时花时间不谈数学。

简而言之,有没有一种方法可以在iPython笔记本中创建动画,只需要使用简单的导入命令即可开箱即用,以便与Anaconda的软件配合使用?

[编辑:我还应该注意到我已经使用过Tkinter来制作动画,我可以在matplotlib中创建一个我确定。因此,如果有一种方法可以获得您在iPython笔记本中渲染的动画,那对我来说肯定是一个可行的解决方案。]

[进一步编辑:我想我也可以说我现在想要制作的动画,虽然我真的想要对我可以制作动画的范围非常灵活,如果我决定的话。现在我正在尝试制作一个数字时钟,显示苏美尔基地60位数字中的每个数字,以说明不同的计数和基本系统。所以它应该最初显示|然后经过第二次||等等,直到10表示为<等等,直到最后时钟滴答到一分钟,现在显示|:|代表一分钟,一秒钟。]

4 个答案:

答案 0 :(得分:26)

使用matplotlib在Jupyter / IPython中制作动画图的一些选项:

  • 在循环中使用display 使用IPython.display.display(fig)在输出中显示数字。使用循环,您需要在显示新图形之前清除输出。请注意,此技术通常不会提供如此平滑的重新排列。因此我建议使用以下任何一种。

    
    
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    from IPython.display import display, clear_output
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    for i in range(len(x)):
        animate(i)
        clear_output(wait=True)
        display(fig)
        
    plt.show()
    
    
    

  • %matplotlib notebook 使用IPython magic %matplotlib notebook将后端设置为笔记本后端。这将使图形保持活着而不是显示静态png文件,因此也可以显示动画 完整示例:

    
    
    %matplotlib notebook
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    plt.show()
    
    
    

  • %matplotlib tk 使用IPython magic %matplotlib tk将后端设置为tk后端。这将在新的绘图窗口中打开图形,该窗口是交互式的,因此也可以显示动画 完整示例:

    
    
    %matplotlib tk
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    plt.show()
    
    
    

  • 将动画转换为mp4视频(已由@Perfi提及的选项):

    from IPython.display import HTML
    HTML(ani.to_html5_video())
    

    或在笔记本的开头使用plt.rcParams["animation.html"] = "html5"。 这将需要有ffmpeg视频编解码器可用于转换为HTML5视频。然后视频以内联方式显示。因此,这与%matplotlib inline后端兼容。完整示例:

    
    
    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["animation.html"] = "html5"
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    ani
    
    
    
    
    
    %matplotlib inline
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    from IPython.display import HTML
    HTML(ani.to_html5_video())
    
    
    

  • 将动画转换为JavaScript

    from IPython.display import HTML
    HTML(ani.to_jshtml())
    

    或在笔记本的开头使用plt.rcParams["animation.html"] = "jshtml"。 这将使用JavaScript将动画显示为HTML。这与大多数新浏览器以及%matplotlib inline后端高度兼容。它可以在matplotlib 2.1或更高版本中使用 完整示例:

    
    
    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["animation.html"] = "jshtml"
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    ani
    
    
    
    
    
    %matplotlib inline
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    from IPython.display import HTML
    HTML(ani.to_jshtml())
    
    
    

答案 1 :(得分:12)

You may find this tutorial interesting.

如果您可以将所需内容转换为matplotlib动画,并且我相当确定您的描述可能,那么您可以使用

from matplotlib import rc, animation
rc('animation', html='html5')

并使用

显示动画
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=N, interval=20, blit=True)
anim

可能会派上用场!

答案 2 :(得分:2)

我遇到了类似的问题,这个问题帮助我开始了。我把一个笔记本放在一起,说明了使用FuncAnimation以及为什么笔记本能像它做的那样做一些事情的好解释。它还包含指向FFmpeg的说明。它还链接到我在开发和理解动画时使用的示例。您可以查看我的贡献: Animation Illustration

对于您的问题,您可能会发现交互式滑块是一种更好的工具。我还创建了一个笔记本,用于演示Jupyter中的交互式小部件。它可用here;但是,交互式部分在那里不起作用。

两者都在GitHub Repostory

中提供

答案 3 :(得分:2)

Jupyter小部件是显示动画的好方法。下面的代码显示了一个动画gif .....

from ipywidgets import Image
from IPython import display
animatedGif = "animatedGifs/01-progress.gif" #path relative to your notebook
file = open(animatedGif , "rb")
image = file.read()
progress= Image(
    value=image,
    format='gif',
    width=100,
    height=100)
display.display(progress)

您可以使用以下方式关闭此动画:

progress.close()

N.B。我从http://www.downgraf.com/inspiration/25-beautiful-loading-bar-design-examples-gif-animated/找到了一些很好的GIF动画。

相关问题