Search code examples
pythonmatplotlibmatplotlib-animation

stop / start / pause in matplotlib animation


I'm using FuncAnimation in matplotlib's animation module for some basic animation. This function perpetually loops through the animation. Is there a way by which I can pause and restart the animation by, say, mouse clicks?


Solution

  • Here is a FuncAnimation example which I modified to pause on mouse clicks. Since the animation is driven by a generator function, simData, when the global variable pause is True, yielding the same data makes the animation appear paused.

    The value of paused is toggled by setting up an event callback:

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