#python #matplotlib
#python #matplotlib
Вопрос:
https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.animation.FuncAnimation.html
Я использую FuncAnimation для случайного перемещения точек на диаграмме рассеяния. Я заставил их перемещаться, но это выглядит не самым гладким. Я понимаю все параметры в FuncAnimation, за исключением «фреймов». Может ли кто-нибудь объяснить, как работает параметр ‘frames’? Спасибо
Ответ №1:
FuncAnimation
работает путем вызова графической функции в каждом кадре. Это задается func
параметром. Вы должны ожидать, что func
при каждом вызове он должен возвращать разные выходные данные, или редактировать фигуру при каждом ее вызове (иначе анимации не было бы!).). Для этого мы заставляем func
принимать аргумент (или аргументы), которые управляют его поведением при каждом вызове.
frames
Параметр FuncAnimation
определяет значения, которые передаются в func
каждый кадр. Итак, первый кадр анимации генерируется путем вызова func(frames[0])
, второй — с помощью func(frames[1])
, n-й — с помощью func(frames[n])
.
Обычно я использую frames
для индексации данных, хранящихся в других переменных. Например, у меня будут некоторые данные в x
and y
, и frames
это просто серия int
, используемая для доступа x[i]
и y[i]
каждого кадра. Вот простой пример этого:
from matplotlib.animation import FuncAnimation
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.set_xlim(0,9)
ax.set_ylim(0,1000)
x = range(1, 8)
y = range(100, 800, 100)
colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
# f will be values from frames
def update(f):
ax.clear()
ax.set_xlim(0,9)
ax.set_ylim(0,1000)
ax.scatter(x[f], y[f], s=30, c=colors[f]) # f is used to access my data
# frames is just integers from 0 to 6, used to index my data and colors
ani = FuncAnimation(fig, func=update, interval=500, frames=range(len(x))
ani.save
Существуют разные возможные значения frames
, но они всегда используются для подачи func
:
- итеративный: каждый элемент используется один раз за кадр. Если это имеет длину (например, это не генератор), будет нарисовано столько кадров, сколько длина
frames
. - генератор:
next
значение генератора используется в каждом кадре. - целое число:
range()
для создания используется значение этого целогоframes
числа. Итак, в моем примере я мог бы просто использоватьframes = len(x)
. None
: если вы не укажетеframes
, он просто сгенерирует последовательные целые числа для передачиfunc
. В этом случае, я считаю, вам нужно указатьsave_count
, чтобы сообщить программе, когда нужно остановиться.
Кроме того, обратите внимание, что frames
это не обязательно просто набор int
, используемый для подмножества других данных. В matplotlib
примере frames
приведена итерация фактических данных, отображаемых на графике. Это также работает. В приведенном выше случае я мог бы создать frames = zip(x, y, colors)
, а затем получить доступ к фактическим данным в каждом вызове func
; но я нахожу этот способ более запутанным.