停止/开始/暂停在Python matplotlib动画

yv5phkfx  于 2023-05-05  发布在  Python
关注(0)|答案(5)|浏览(137)

我在matplotlib的动画模块中使用FuncAnimation来实现一些基本的动画。此函数在动画中不断循环。有没有一种方法可以让我暂停和重新启动动画,比如说,鼠标点击?

7vhp5slm

7vhp5slm1#

下面是我修改的a FuncAnimation example,它可以在鼠标点击时暂停。由于动画是由生成器函数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)
fig.show()
jm81lzqq

jm81lzqq2#

这个管用。。

anim = animation.FuncAnimation(fig, animfunc[,..other args])

#pause
anim.event_source.stop()

#unpause
anim.event_source.start()
dgjrabp2

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

现在我们可以简单地通过点击来停止或启动动画。

laik7k3q

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

一些注意事项:

  • 为了能够修改runningdirection的值,我将它们赋给了anim。它避免了使用nonlocal(在Python2.7中不可用)或global(不可取,因为我在另一个函数中运行此代码)。不确定这是否是一个好的做法,但我发现它相当优雅。
  • 对于手动更新,我访问了anim的生成器对象,FuncAnimation使用该对象来更新绘图。这样可以确保当我恢复动画时,它从活动帧开始,而不是从最初暂停的位置开始。
ktecyv1j

ktecyv1j5#

由于有很多关于不同答案的评论要求提供文档化的特性,因此我基于fred's answer进行了更深入的研究。它似乎可以工作,但自matplotlib 3.4.0以来,有新的功能可以暂停和恢复绘图:pause()resume()。它们在内部调用event_source.stop()start(),但它们也会完全暂停动画,这可能会减少硬件压力。
它们可以在任何matplotlib.animation.Animation对象上调用,包括FuncAnimation子类。

相关问题