python matplotlib:无法从函数内部调用 FuncAnimation [英] python matplotlib: unable to call FuncAnimation from inside a function

查看:38
本文介绍了python matplotlib:无法从函数内部调用 FuncAnimation的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现一个输出动画图的函数.

I'm trying to implement a function which outputs an animated plot.

如果我以 simple_anim.py(来自 matplotlib 示例)为基础:

If I take simple_anim.py (from matplotlib examples) as a base:

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

有效地工作.

但是,如果我在函数中关闭此代码(为了提供不断变化的参数,并避免为每个可能的参数值创建一个显式文件):

BUT, if I close this code inside a function (in order to provide changing parameters, and avoid doing an explicit file for each possible parameter value):

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

def a():
    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()

然后调用函数,图形保持白色.事实上,进入animate函数永远不会到来.

and then call the function, the figure plot remains white. In fact, it never arrives to enter into the animate function.

我知道我遗漏了一些信息,这就是它不起作用的原因.有人可以给我一些提示吗?

I know that I'm missing some information, and that's why it does not work. Does anybody can give me some hints?

非常感谢,

安德烈斯

推荐答案

发生这种情况的原因是更新窗口的定时器和回调是对象ani的属性.如果您不保留对它的引用,那么垃圾收集中的 ani 和您的计时器/回调就会消失.

The reason that this happens is that the timers and call backs which update the window are attributes of the object ani. If you do not keep a reference to it around, then ani in garbage collected and your timers/callbacks go away.

解决方案是让您的函数返回 ani 并在您的代码中保留对它的引用:

The solution is to have your function return ani and keep a reference to it in your code:

def a(...):
    # stuff
    ani = animation.FuncAnimation(...)
    # more stuff
    return ani

outer_ani = a(...)

这个问题(见 github #1656)已经讨论过,但没有解决.

This issue (see github #1656) has been discussed, but not resolved.

这篇关于python matplotlib:无法从函数内部调用 FuncAnimation的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆