在Canopy中的函数内使用matplotlib.animation

时间:2014-08-27 22:08:02

标签: python matplotlib enthought

以下脚本在使用Canopy 1.4.1中的%run语句执行时生成一个正在行进的正弦波的简单动画:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

def animator():
    fig = plt.figure()
    ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
    line, = ax.plot([], [], lw=2)

    def init():
        line.set_data([], [])
        return line,

    def animate(i):
        x = np.linspace(0, 2, 1000)
        y = np.sin(2 * np.pi * (x - 0.01 * i))
        line.set_data(x, y)
        return line,

    anim = animation.FuncAnimation(fig, animate, init_func=init,
                                frames=200, interval=20, blit=True)

    plt.show()

animator()

但是,如果我删除最后一行,请使用%run运行脚本并从解释器调用animator(),只在屏幕上绘制第一帧。为什么是这样?如何进行函数调用以在Canopy中生成动画?

奇怪的是,在IDLE或IPython(PyLab)中都不会出现这个问题,从解释器调用animator()可以正常工作。更重要的是,问题仅限于交互式显示:如果我向animator添加更多行以将动画保存为mp4格式,则即使从Canopy也能正确保存mp4文件。

上面的代码基于Jake Vanderplas的教程。

1 个答案:

答案 0 :(得分:1)

我已经找到了问题第二部分的答案:按照建议in this answer,我必须拥有return anim函数。但我仍然有些困惑,为什么Canopy和其他解释器在这里表现不同。 (为什么IDLE和PyLab有效?)任何见解都会受到赞赏!