Как закрыть окно анимации matplotlib через заданное время? - PullRequest
1 голос
/ 12 июля 2020

Это анимация, которую я сделал с помощью matplotlib, где точки случайным образом перемещаются по кругу. Я хочу, чтобы анимация остановилась (и окно закрывалось) через 4 секунды. Я попытался установить таймер и отложить черчение на некоторое время l oop, но он не работает, он продолжает работать.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from scipy.spatial import distance
import random
import datetime, time

fig, ax = plt.subplots()
ax.set_xlim(0, 20)
ax.set_ylim(0, 20)
then = datetime.datetime.now() + datetime.timedelta(seconds=10)
circle_r=2
def get_initial_coordinates():
    x_coord =[random.uniform(3, 7) for i in range(n_particles)]
    y_coord = [random.uniform(3, 7) for i in range(n_particles)]
    return x_coord, y_coord

def get_initial_velocities():
    x_vel = [3 * (np.random.random() - 0.5) * box_width for i in range(n_particles)]
    y_vel = [3 * (np.random.random() - 0.5) * box_width for i in range(n_particles)]
    return x_vel, y_vel

def take_step(x_coord, y_coord, x_vel, y_vel):
    for i in range(n_particles):
     x_coord[i] += x_vel[i]*dt
     y_coord[i] += y_vel[i]*dt
     if distance.euclidean([5, 5], [x_coord[i],y_coord[i]]) >= 3:
         x_vel[i] = -x_vel[i]
         x_coord[i] += x_vel[i] * dt
         y_vel[i] = -y_vel[i]
         y_coord[i] += y_vel[i] * dt

    return x_coord, y_coord, x_vel, y_vel

n_particles = 40
box_width = 10
n_steps = 5000
dt = 0.001

x_coord, y_coord = get_initial_coordinates()
x_vel, y_vel = get_initial_velocities()
for i in range(n_steps):
    x_coord,y_coord,x_vel,y_vel= take_step(x_coord,y_coord,x_vel,y_vel)
#---------------------
fig = plt.figure()
ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
ax.set_aspect('equal')
d, = ax.plot([x_coord[i] for i in range(n_particles)],
             [y_coord[i] for i in range(n_particles)], 'ro')
x_coord, y_coord = get_initial_coordinates()
x_vel, y_vel = get_initial_velocities()
circle = plt.Circle((5, 5), 3, color='blue', fill=False)
ax.add_artist(circle)
def animate(i):
    take_step(x_coord, y_coord, x_vel, y_vel)
    d.set_data([x_coord[i]for i in range(n_particles)],
               [y_coord[i]for i in range(n_particles)])
    return d,

anim = animation.FuncAnimation(fig, animate, frames=200, interval=20)
while then > datetime.datetime.now():
    plt.show()
    time.sleep(1)
else:
    plt.close()

1 Ответ

1 голос
/ 12 июля 2020

Возможно, вы можете сделать это с параметром block = False и plt.pause(), как здесь:

anim = animation.FuncAnimation(fig, animate, frames=200, interval=20, repeat=False)
plt.show(block=False)
plt.pause(1)

enter image description here

Check этот ответ и plt.show() документация для справки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...