python matplotlib:无法从函数内部调用FuncAnimation [英] python matplotlib: unable to call FuncAnimation from inside a function
问题描述
我正在尝试实现一个输出动画情节的功能.
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屋!