Использование FuncAnimation из библиотеки matplotlib (Python3)

#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 ; но я нахожу этот способ более запутанным.