iPython笔记本中的动画

Add*_*dem 22 animation ipython python-3.x jupyter-notebook

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

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

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

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

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

Imp*_*est 33

使用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()
    Run Code Online (Sandbox Code Playgroud)

  • %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()
    Run Code Online (Sandbox Code Playgroud)

  • %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()
    Run Code Online (Sandbox Code Playgroud)

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

    from IPython.display import HTML
    HTML(ani.to_html5_video())
    
    Run Code Online (Sandbox Code Playgroud)

    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
    Run Code Online (Sandbox Code Playgroud)
    %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())
    Run Code Online (Sandbox Code Playgroud)

  • 将动画转换为JavaScript:

    from IPython.display import HTML
    HTML(ani.to_jshtml())
    
    Run Code Online (Sandbox Code Playgroud)

    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
    Run Code Online (Sandbox Code Playgroud)
    %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())
    Run Code Online (Sandbox Code Playgroud)


Per*_*rfi 12

您可能会发现本教程很有趣.

如果你可以将你需要的东西变成matplotlib动画,我相当肯定你的描述可以,你可以使用

from matplotlib import rc, animation
rc('animation', html='html5')
Run Code Online (Sandbox Code Playgroud)

并使用显示您的动画

anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=N, interval=20, blit=True)
anim
Run Code Online (Sandbox Code Playgroud)

可能会派上用场!

  • 为什么这个片段显示两个“窗口”,一个是空白的,另一个是视频? (4认同)