Как приостановить анимацию matplotlib на несколько секунд (без щелчков мышью)?

Я создал скрипт, который анимирует две точки разброса и линию между ними. Вот гифка:

А вот скрипт, используемый для анимации:

from a import get_points
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time

fig, ax = plt.subplots(figsize=(12,8))
ax.set(xlim=(0,104), ylim=(0,68))

x_start, y_start = (50, 35)
x_end, y_end = (90, 45)

x_1, y_1 = get_points(x_start, y_start, x_end, y_end, 0.55)
x_2, y_2 = get_points(x_end, y_end, x_start, y_start, 0.55)

x = np.linspace(x_1, x_2, 20)
y = np.linspace(y_1, y_2, 20)

sc_1 = ax.scatter([], [], color="green", zorder=4)
line, = ax.plot([], [], color="crimson", zorder=4)
sc_2 = ax.scatter([], [], color="gold", zorder=4)
title = ax.text(50, 65, "", bbox={'facecolor':'w', 'alpha':0.5, 'pad':5}, ha="center")

def animate(i):
    ## plot scatter point
    sc_1.set_offsets([x_start, y_start])

    ## plot line
    line.set_data(x[:i], y[:i])

    ## plot scatter point
    if i == len(x):
        sc_2.set_offsets([x_end, y_end])

    return sc_1, line, sc_2, title,

ani = animation.FuncAnimation(  
    fig=fig, func=animate, interval=50, blit=True)  

plt.show()

Я хочу: приостановить анимацию на 2 секунды, когда появится первая точка разброса, затем анимировать линию, а когда анимация линии завершится, приостановить анимацию еще на 2 секунды и после этого отобразить точку разброса.

Что я должен изменить в своем коде, чтобы получить требуемую анимацию?


person slothfulwave612    schedule 16.09.2020    source источник
comment
Отвечает ли это на ваш вопрос? остановка/запуск/пауза в анимации python matplotlib   -  person Karthik    schedule 16.09.2020
comment
Ответ показывает, как мы можем запускать/останавливать нажатие кнопок, и я не хочу нажимать кнопки. Я просто хочу остановить анимацию на несколько секунд.   -  person slothfulwave612    schedule 16.09.2020
comment
Что такое модуль a, из которого вы импортируете get_points? Что это за функция?   -  person Andrea Blengino    schedule 16.09.2020


Ответы (1)


Отвечать

Вы можете сделать это с помощью plt.pause().
Я немного упростил ваш код, чтобы использовать его без неизвестного модуля a (и его функции get_points()).

Код

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots(figsize=(12,8))
ax.set(xlim=(0,104), ylim=(0,68))

x_start, y_start = (50, 35)
x_end, y_end = (90, 45)

N = 20
x = np.linspace(x_start, x_end, N)
y = np.linspace(y_start, y_end, N)

sc_1 = ax.scatter([], [], color="green", zorder=4)
line, = ax.plot([], [], color="crimson", zorder=4)
sc_2 = ax.scatter([], [], color="gold", zorder=4)


def animate(i):
    sc_1.set_offsets([x_start, y_start])
    if i == 1:
        plt.pause(2)

    line.set_data(x[:i], y[:i])

    if i == len(x):
        plt.pause(2)
        sc_2.set_offsets([x_end, y_end])

    return sc_1, line, sc_2,

ani = animation.FuncAnimation(fig=fig, func=animate, interval=50, blit=True)

plt.show()
person Andrea Blengino    schedule 16.09.2020