我在matplotlib的动画模块中使用FuncAnimation来实现一些基本的动画。此函数在动画中不断循环。有没有一种方法可以让我暂停和重新启动动画,比如说,鼠标点击?
7vhp5slm1#
下面是我修改的a FuncAnimation example,它可以在鼠标点击时暂停。由于动画是由生成器函数simData驱动的,因此当全局变量pause为True时,生成相同的数据会使动画显示为暂停。paused的值通过设置事件回调来切换:
simData
pause
paused
def onClick(event): global pause pause ^= True fig.canvas.mpl_connect('button_press_event', onClick)
import matplotlib.pyplot as plt import numpy as np import matplotlib.animation as animation pause = False def simData(): t_max = 10.0 dt = 0.05 x = 0.0 t = 0.0 while t < t_max: if not pause: x = np.sin(np.pi*t) t = t + dt yield x, t def onClick(event): global pause pause ^= True def simPoints(simData): x, t = simData[0], simData[1] time_text.set_text(time_template%(t)) line.set_data(t, x) return line, time_text fig = plt.figure() ax = fig.add_subplot(111) line, = ax.plot([], [], 'bo', ms=10) ax.set_ylim(-1, 1) ax.set_xlim(0, 10) time_template = 'Time = %.1f s' time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes) fig.canvas.mpl_connect('button_press_event', onClick) ani = animation.FuncAnimation(fig, simPoints, simData, blit=False, interval=10, repeat=True) fig.show()
jm81lzqq2#
这个管用。。
anim = animation.FuncAnimation(fig, animfunc[,..other args]) #pause anim.event_source.stop() #unpause anim.event_source.start()
dgjrabp23#
结合@fred和@unutbu的答案,我们可以在创建动画后添加onClick函数:
import matplotlib.pyplot as plt import matplotlib.animation as animation fig = plt.figure() def run_animation(): anim_running = True def onClick(event): nonlocal anim_running if anim_running: anim.event_source.stop() anim_running = False else: anim.event_source.start() anim_running = True def animFunc( ...args... ): # Animation update function here fig.canvas.mpl_connect('button_press_event', onClick) anim = animation.FuncAnimation(fig, animFunc[,...other args]) run_animation()
现在我们可以简单地通过点击来停止或启动动画。
laik7k3q4#
我登陆这个页面试图实现相同的功能,暂停matplotlibs动画。其他的答案是伟大的,但除此之外,我希望能够手动循环通过帧使用箭头键。对于任何寻找相同功能的人,这里是我的实现:
import matplotlib.pyplot as plt import matplotlib.animation as ani fig, ax = plt.subplots() txt = fig.text(0.5,0.5,'0') def update_time(): t = 0 t_max = 10 while t<t_max: t += anim.direction yield t def update_plot(t): txt.set_text('%s'%t) return txt def on_press(event): if event.key.isspace(): if anim.running: anim.event_source.stop() else: anim.event_source.start() anim.running ^= True elif event.key == 'left': anim.direction = -1 elif event.key == 'right': anim.direction = +1 # Manually update the plot if event.key in ['left','right']: t = anim.frame_seq.next() update_plot(t) plt.draw() fig.canvas.mpl_connect('key_press_event', on_press) anim = ani.FuncAnimation(fig, update_plot, frames=update_time, interval=1000, repeat=True) anim.running = True anim.direction = +1 plt.show()
一些注意事项:
running
direction
anim
ktecyv1j5#
由于有很多关于不同答案的评论要求提供文档化的特性,因此我基于fred's answer进行了更深入的研究。它似乎可以工作,但自matplotlib 3.4.0以来,有新的功能可以暂停和恢复绘图:pause()和resume()。它们在内部调用event_source.stop()和start(),但它们也会完全暂停动画,这可能会减少硬件压力。它们可以在任何matplotlib.animation.Animation对象上调用,包括FuncAnimation子类。
pause()
resume()
event_source.stop()
start()
matplotlib.animation.Animation
FuncAnimation
5条答案
按热度按时间7vhp5slm1#
下面是我修改的a FuncAnimation example,它可以在鼠标点击时暂停。由于动画是由生成器函数
simData
驱动的,因此当全局变量pause
为True时,生成相同的数据会使动画显示为暂停。paused
的值通过设置事件回调来切换:jm81lzqq2#
这个管用。。
dgjrabp23#
结合@fred和@unutbu的答案,我们可以在创建动画后添加onClick函数:
现在我们可以简单地通过点击来停止或启动动画。
laik7k3q4#
我登陆这个页面试图实现相同的功能,暂停matplotlibs动画。其他的答案是伟大的,但除此之外,我希望能够手动循环通过帧使用箭头键。对于任何寻找相同功能的人,这里是我的实现:
一些注意事项:
running
和direction
的值,我将它们赋给了anim
。它避免了使用nonlocal(在Python2.7中不可用)或global(不可取,因为我在另一个函数中运行此代码)。不确定这是否是一个好的做法,但我发现它相当优雅。anim
的生成器对象,FuncAnimation使用该对象来更新绘图。这样可以确保当我恢复动画时,它从活动帧开始,而不是从最初暂停的位置开始。ktecyv1j5#
由于有很多关于不同答案的评论要求提供文档化的特性,因此我基于fred's answer进行了更深入的研究。它似乎可以工作,但自matplotlib 3.4.0以来,有新的功能可以暂停和恢复绘图:
pause()
和resume()
。它们在内部调用event_source.stop()
和start()
,但它们也会完全暂停动画,这可能会减少硬件压力。它们可以在任何
matplotlib.animation.Animation
对象上调用,包括FuncAnimation
子类。