Pause matplotlib custom animation loop

2019-07-25 00:24发布

问题:

I want to pause an animation that I'm running in my own event loop. Here is a simplified version of the code:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
from mpl_toolkits.mplot3d import proj3d

import time

def main():
    global paused
    paused = False

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    ax.set_ylim(-100, 100)
    ax.set_xlim(-10, 10)
    ax.set_zlim(-100, 100)

    plt.ion()
    plt.show()

    def pause_anim(event):
        global paused
        paused = not paused

    pause_ax = fig.add_axes((0.7, 0.03, 0.1, 0.04))
    pause_button = Button(pause_ax, 'pause', hovercolor='0.975')
    pause_button.on_clicked(pause_anim)

    x = np.arange(-50, 51)

    line = ax.plot([], [], [], c="r")[0]

    y_range = list(np.arange(1, 60, 3))
    y_len = len(y_range)
    idx = 0

    while True:

        if not paused:
            idx += 1
            if idx >= y_len:
                break

            y = y_range[idx]
            z = - x**2 + y - 100

            line.set_data(x, 0)
            line.set_3d_properties(z)

            plt.draw()
            plt.pause(0.2)

        else:
            time.sleep(1)  # this stops button events from happening
            #input("Shoop?")  # prompting for input works
            # I've also tried putting a mutex here

if __name__ == '__main__':
    main()

As I mention in the code, I've tried time.sleep and Lock, but these stop me from unpausing once I've paused. How can I pause the loop without breaking the ability to resume the animation?

回答1:

You may just replace time.sleep(1) in the else-part with plt.pause, just like you also did it in the if-part.

        ....
        plt.draw()
        plt.pause(0.2)
    else:
        plt.pause(0.2)

The other option is of course to use a matplotlib animation, like FuncAnimation, which has the methods .event_source.stop() and .event_source.start(). (As shown in two of the answers to this question: stop / start / pause in python matplotlib animation)