Техника Matplotlib FuncAnimation, которая работает - но почему? - PullRequest
0 голосов
/ 01 марта 2020

Я пытался написать анимацию, используя FuncAnimation, которая позволила бы центрировать красную звезду вокруг четырех желтых звезд. (Меня интересует что-то более сложное, но я подумал, что если я смогу решить эту проблему с игрушкой, то смогу подойти к настоящему.) В любом случае, я заставил это работать, но я не понимаю почему. В частности, на что ссылаются (в функциях initial_frame и animation_frame) на stars[0] и bigstar[0]? Я полагаю, что и звезды, и большие звезды являются графиками 2D-линий. Я не видел такой техники использования FuncAnimation раньше ( хотя я относительно новичок в Python) и подумал, что это может быть интересно. Спасибо!

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

fig, ax = plt.subplots(figsize = (8, 8))
ax.set_xlim(-100, 100)
ax.set_ylim(-100, 100)
ax.set_facecolor('k')

R = 40.
theta = 0.
x_data = np.zeros(4)     # x, y data for yellow stars
y_data = np.zeros(4)
X_data = np.zeros(1)     # X, Y data for red star
Y_data = np.zeros(1)plots 
(stars, bigstar) = (ax.plot(x_data, y_data, 'oy', ls = ' ', ms = 8),\
                 ax.plot(X_data, Y_data, 'or', ls = ' ', ms = 40))

def initial_frame():
    global theta 
    theta = np.arange(4)*np.pi / 2.
    x_data = R * np.cos(theta)
    y_data = R * np.sin(theta)
    stars[0].set_xdata(x_data)
    stars[0].set_ydata(y_data)
    return (stars, bigstar)

def animation_frame(frame_number):
    global theta 
    a = 0.                           # setting a to be nonzero allows the red star to move
    theta = theta + np.pi/200. 
    x_data = R * np.cos(theta)
    y_data = R * np.sin(theta)
    global X_data, Y_data
    X_data = X_data + a
    Y_data = Y_data + a
    stars[0].set_xdata(x_data)
    stars[0].set_ydata(y_data)
    bigstar[0].set_xdata(X_data)
    bigstar[0].set_ydata(Y_data)
    return (stars, bigstar)

animation = FuncAnimation(fig, func = animation_frame, 
    init_func = initial_frame, interval = 10)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...