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

Mar*_*ole 12 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()
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助表示赞赏!

Imp*_*est 11

总结一下您拥有的选项:

  • 使用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视频

    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后端兼容。完整的例子:

    from IPython.display import HTML
    HTML(ani.to_html5_video())
    
    Run Code Online (Sandbox Code Playgroud)
    %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)

  • 将动画转换为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
    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)
    from IPython.display import HTML
    HTML(ani.to_jshtml())
    
    Run Code Online (Sandbox Code Playgroud)


Adr*_*tin 8

根据这个答案,你可以获得动画(和完整的交互支持)在IPython笔记本中工作,启用nbagg后端%matplotlib nbagg.


小智 5

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

我用谷歌搜索“matplotlib inlinefigures”并找到了这个网站,它提到你必须启用matplotlib模式。不幸的是,仅仅使用%maplotlib根本没有帮助。

然后我%matplotlib qt兴致勃勃地在 IPython 控制台中输入内容,现在它工作得很好,尽管绘图显示在一个单独的窗口中。