matplotlib.animation
Содержание
Анимация
Проще всего создать анимацию в Matplotlib можно с помощью одного из классов Animation.
См. также
Базовый класс для анимаций. | |
Подкласс | |
Подкласс |
В обоих случаях крайне важно сохранять ссылку на объект экземпляра. Анимация продвигается таймером (обычно предоставляемым GUI-фреймворком приложения), на который объект Animation хранит единственную ссылку. Если не сохранить ссылку на объект Animation, он (а вместе с ним и таймеры) будет удалён сборщиком мусора, и анимация остановится.
Чтобы сохранить анимацию, используйте Animation.save, Animation.to_html5_video или Animation.to_jshtml.
Подробную информацию о поддерживаемых форматах видео см. ниже в разделе Вспомогательные классы.
FuncAnimation
В общих чертах FuncAnimation работает следующим образом:
for d in frames:
artists = func(d, *fargs)
fig.canvas.draw_idle()
fig.canvas.start_event_loop(interval)
При этом учитываются детали, необходимые для «блиттинга» (значительно повышающего производительность анимации), неблокирующей работы, предотвращения многократного запуска и остановки цикла событий GUI, обработки повторов и нескольких анимированных осей, а также для удобного сохранения анимации в видеофайл.
«Блиттинг» — это стандартный метод компьютерной графики. В общих чертах, он заключается в том, чтобы взять существующую растровую карту (в нашем случае — преимущественно растеризованное изображение) и «наложить» на неё ещё один объект Artist. Таким образом, сохранив «чистую» растровую карту, можно перерисовывать только несколько изменяющихся объектов Artist в каждом кадре и, возможно, значительно сократить время обработки. При использовании блиттинга (передав blit=True) основной цикл FuncAnimation становится немного сложнее:
ax = fig.gca()
def update_blit(artists):
fig.canvas.restore_region(bg_cache)
for a in artists:
a.axes.draw_artist(a)
ax.figure.canvas.blit(ax.bbox)
artists = init_func()
for a in artists:
a.set_animated(True)
fig.canvas.draw()
bg_cache = fig.canvas.copy_from_bbox(ax.bbox)
for f in frames:
artists = func(f, *fargs)
update_blit(artists)
fig.canvas.start_event_loop(interval)
Разумеется, здесь опущены многие детали (например, обновление фона при изменении размера изображения или его полной перерисовке). Тем не менее этот минималистичный пример поможет понять, как init_func и func используются внутри FuncAnimation, а также объясняет принцип работы блиттинга.
Примечание
При блиттинге порядок zorder объектов Artist не учитывается, поскольку объекты Artist, отрисовываемые с помощью блиттинга, всегда отображаются поверх остальных.
Ожидаемая сигнатура func и init_func очень проста. Это позволяет не включать FuncAnimation в логику учёта объектов и построения графиков, но означает, что передаваемые вызываемые объекты должны знать, с какими объектами Artist им предстоит работать. Существует несколько способов решить эту задачу, различающихся по сложности и степени инкапсуляции. Самый простой способ, хорошо подходящий для скриптов, — определить объект Artist в глобальной области видимости и позволить Python самостоятельно разобраться с остальным. Например:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'ro')
def init():
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1, 1)
return ln,
def update(frame):
xdata.append(frame)
ydata.append(np.sin(frame))
ln.set_data(xdata, ydata)
return ln,
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True)
plt.show()
Второй способ — использовать functools.partial, чтобы передавать функции аргументы:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from functools import partial
fig, ax = plt.subplots()
line1, = ax.plot([], [], 'ro')
def init():
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1, 1)
return line1,
def update(frame, ln, x, y):
x.append(frame)
y.append(np.sin(frame))
ln.set_data(x, y)
return ln,
ani = FuncAnimation(
fig, partial(update, ln=line1, x=[], y=[]),
frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True)
plt.show()
Третий способ — использовать замыкания для создания нужных объектов Artist и функций. Четвёртый способ — создать класс.
Примеры
ArtistAnimation
Примеры
Классы средств записи
Предоставляемые средства записи можно разделить на несколько основных категорий.
Средство записи Pillow использует библиотеку Pillow для создания анимации и хранит все данные в памяти.
Средство записи HTML создаёт анимации на основе JavaScript.
Средство записи HTML-видео на основе JavaScript. |
Средства записи на основе каналов передают захваченные кадры через канал внешнему процессу. Такие варианты обычно работают эффективнее, но могут поддерживаться не всеми системами.
Средство записи ffmpeg на основе канала. | |
Средство записи анимированных GIF на основе канала. |
Средства записи на основе файлов сохраняют временные файлы для каждого кадра, которые в конце объединяются в один файл. Хотя они работают медленнее, отлаживать их может быть проще.
Файловое средство записи ffmpeg. | |
Файловое средство записи анимированных GIF. |
Классы средств записи позволяют последовательно захватывать кадры из одного и того же объекта Figure. Все они предоставляют три метода, которые необходимо вызывать по порядку:
-
setupподготавливает средство записи (например, открывает канал). Для средств записи на основе каналов и на основе файлов методуsetup()передаются разные аргументы. -
grab_frameзатем можно вызывать столько раз, сколько необходимо, чтобы каждый раз захватить один кадр -
finishзавершает создание видео и записывает выходной файл на диск.
Пример:
moviewriter = MovieWriter(...)
moviewriter.setup(fig, 'my_movie.ext', dpi=100)
for j in range(n):
update_figure(j)
moviewriter.grab_frame()
moviewriter.finish()
При непосредственном использовании классов средств записи (не через Animation.save) настоятельно рекомендуется использовать менеджер контекста saving:
with moviewriter.saving(fig, 'myfile.mp4', dpi=100):
for j in range(n):
update_figure(j)
moviewriter.grab_frame()
чтобы обеспечить выполнение необходимых действий по подготовке и очистке.
Примеры
Вспомогательные классы
Базовые классы анимации
Базовый класс для анимаций. | |
Подкласс |
Реестр средств записи
Для сопоставления имён средств записи с их классами предусмотрен реестр уровня модуля. Благодаря ему методу Animation.save можно передать строку вместо экземпляра средства записи.
Реестр доступных классов средств записи, индексируемых понятными человеку именами. |
Базовые классы средств записи
Для сокращения дублирования кода предусмотрены базовые классы
Абстрактный базовый класс для записи видео; позволяет захватывать кадры с помощью вызова | |
Базовый класс для записи видео. | |
Подкласс |
а также примеси
Класс-примесь для вывода FFMpeg. | |
Класс-примесь для вывода ImageMagick. |
Также предусмотрены соответствующие классы.
О том, как легко реализовать новые классы MovieWriter, см. исходный код.
© 2012–2026 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/stable/api/animation_api.html