首页 文章

iPython笔记本中的动画

提问于
浏览
14

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

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

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

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

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

4 回答

  • 2

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

    • Using display in a loop 使用 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()
    
    • Convert animation to mp4 video (已由@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())
    
    • Convert animation to 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())
    
  • 20

    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
    

    可能会派上用场!

  • 11

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

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

    两者都有GitHub Repostory

  • 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()
    

    注:我从http://www.downgraf.com/inspiration/25-beautiful-loading-bar-design-examples-gif-animated/找到了一些漂亮的GIF动画 .

相关问题