我在matplotlib的动画模块中使用FuncAnimation进行一些基本动画.此函数永久循环播放动画.有没有办法通过鼠标点击暂停和重启动画?
这是一个FuncAnimation示例,我修改为在鼠标点击时暂停.由于动画由生成器函数驱动simData
,当全局变量pause
为True时,产生相同的数据会使动画暂停.
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) plt.show()
这有效......
anim = animation.FuncAnimation(fig, animfunc[,..other args]) #pause anim.event_source.stop() #unpause anim.event_source.start()
结合@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()
现在我们可以通过点击停止或启动动画.