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

查看:365
本文介绍了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()

然后调用该函数,图形将保持白色.实际上,它永远无法进入动画功能.

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?

非常感谢您,

安德烈斯(Andrés)

Andrés

推荐答案

发生这种情况的原因是,用于更新窗口的计时器和回调是对象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天全站免登陆