Matplotlib动画无法在IPython Notebook中工作(空白图)

时间:2014-08-15 20:27:58

标签: matplotlib ipython-notebook

我尝试了多个动画示例代码,无法使其中的任何代码正常工作。这是我在Matplotlib文档中尝试过的基本内容:

"""
A simple example of an animated plot
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)        # x-array
line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x+i/10.0))  # update the data
    return line,

#Init only required for blitting to give a clean slate.
def init():
    line.set_ydata(np.ma.array(x, mask=True))
    return line,

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init,
    interval=25, blit=True)
plt.show()

当我在IPython Notebook中执行上述操作时,我只看到生成的空白图。我尝试使用多个浏览器(Chrome,FF,IE)在多台计算机上运行多台服务器(包括Wakari)。

我可以将动画保存到mp4文件就好了,播放时效果很好。

感谢任何帮助!

5 个答案:

答案 0 :(得分:8)

根据此answer,您可以在IPython笔记本中使用动态(以及完整的交互支持),使nbagg后端具有%matplotlib nbagg

答案 1 :(得分:6)

总结您的选择:

  • 在循环中使用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视频

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

答案 2 :(得分:3)

我也遇到了这个问题,发现我需要了解matplotlib后端的概念,如何启用特定的后端,以及哪些后端与FuncAnimation配合使用。我整理了一个ipython notebook来解释详细信息,并总结了哪些后端在Mac,Windows和wakari.io上与FuncAnimation配合使用。笔记本还总结了哪些后端与ipython interact()小部件一起使用,以及基本matplotlib绘图的图形(内联或辅助窗口)。包含代码和说明,以便您可以重现任何结果。

最重要的是,您无法使用FuncAnimation创建动画,以便在ipython笔记本中显示内联。但是,您可以将其显示在单独的窗口中。事实证明,我需要这个为本学期教授的本科课程创建可视化,虽然我更喜欢动画是内联的,但至少我能够在课堂上创建一些有用的可视化。

答案 3 :(得分:2)

直到刚才,我和你有完全相同的问题。我是一个完整的新手,所以tcaswell的答案对我来说有点神秘。也许你想出了他的意思或找到了自己的解决方案。如果你没有,我会把它放在这里。

我用google搜索“matplotlib内联数字”并找到了this网站,其中提到您必须启用matplotlib模式。不幸的是,仅使用%maplotlib根本没有帮助。

然后我在一个百灵鸟的IPython控制台中键入%matplotlib qt,它现在运行得很好,尽管情节出现在一个单独的窗口中。

答案 4 :(得分:0)

在以下情况下,动画结尾的Jupyter中没有内嵌视频

print(list(zip(titleValues.keys(),titleValues.values()))) # [('Movie 1 (1998)', ['0', '1', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']), ('Movie 2 (1994)', ['0', '1', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0'])]

不在笔记本单元的最后,因为随后输出被抑制。

您可以按以下方式使用它

HTML(ani.to_html5_video())

,然后在一个新的单元格中键入`,即可在线播放视频。