matplotlib.animation
Содержание
Анимация
Самый простой способ создать живую анимацию в matplotlib — использовать один из классов Animation.
Animation | Базовый класс для анимаций. |
FuncAnimation | Создаёт анимацию путём многократного вызова функции func. |
ArtistAnimation | Анимация с использованием фиксированного набора объектов Artist. |
В обоих случаях крайне важно сохранить ссылку на экземпляр объекта. Анимация продвигается таймером (обычно из фреймворка графического интерфейса), на который объект Animation держит единственную ссылку. Если вы не сохраните ссылку на объект Animation, он (а вместе с ним и таймеры) будет удалён сборщиком мусора, что остановит анимацию.
Для сохранения анимации на диск используйте Animation.save или Animation.to_html5_video
Подробнее о поддерживаемых форматах кино смотрите в Вспомогательные классы ниже.
FuncAnimation
Внутреннее устройство FuncAnimation примерно такое:
for d in frames: artists = func(d, *fargs) fig.canvas.draw_idle() fig.canvas.start_event_loop(interval)
с подробностями для обработки «блиттинга» (для существенного повышения производительности в режиме реального времени), для обеспечения неблокирующей работы, для предотвращения многократного запуска/остановки цикла обработки событий графического интерфейса, для обработки повторений, нескольких анимированных осей и для простого сохранения анимации в файл кино.
«Блиттинг» — это стандартный приём в компьютерной графике. В общем случае он сводится к взятию существующего битового изображения (в нашем случае, в основном растрового рисунка) и последующего «блиттинга» одного или нескольких объектов поверх него. Таким образом, управляя сохранённым «чистым» битовым изображением, мы можем перерисовать только те несколько объектов, которые изменяются в каждом кадре, потенциально экономя значительное количество времени. При использовании блиттинга (передавая 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 и о теории работы «блиттинга».
Ожидаемая сигнатура в func и init_func очень проста, чтобы оградить FuncAnimation от вашего ведения учета и логики построения графиков, но это означает, что вызываемые объекты, которые вы передаёте, должны знать, за какими объектами-артистами они должны работать. Существует несколько подходов к обработке этого, с разной степенью сложности и инкапсуляции. Самый простой подход, который хорошо работает в случае сценария, заключается в определении объекта-артиста на глобальном уровне и предоставлении Python возможности разобраться в этом. Например
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.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 для «связывания» объектов-артистов с функциями. Третий метод — использование замыканий для построения необходимых объектов-артистов и функций. Четвёртый метод — создание класса.
Примеры
- Распад
- Обновление Байеса
- Задача двойного маятника
- Анимированная гистограмма
- Моделирование дождя
- Анимированная 3D случайная прогулка
- Анимированный график линии
- Осциллограф
- MATPLOTLIB НЕПРЯМОЙ
ArtistAnimation
Примеры
Классы записи
Предоставленные классы записи делятся на несколько основных категорий.
Класс записи Pillow использует библиотеку Pillow для записи анимации, сохраняя все данные в памяти.
PillowWriter |
Класс записи HTML генерирует анимацию на основе JavaScript.
HTMLWriter | Класс записи для HTML-кино, основанного на JavaScript. |
Классы записи, основанные на каналах, передают захваченные кадры по каналу в внешний процесс. Классы записи, основанные на каналах, как правило, более производительны, но могут не работать на всех системах.
FFMpegWriter | Запись ffmpeg по каналу. |
ImageMagickWriter | Анимированный GIF по каналу. |
AVConvWriter | Запись avconv по каналу. |
Классы записи, основанные на файлах, сохраняют временные файлы для каждого кадра, которые в конечном итоге склеиваются в один файл. Хотя они медленнее, такие классы записи могут быть проще в отладке.
FFMpegFileWriter | Запись ffmpeg по файлам. |
ImageMagickFileWriter | Запись анимированного GIF по файлам. |
AVConvFileWriter | Запись avconv по файлам. |
В основе MovieWriter лежит способ извлечения последовательных кадров из одного и того же базового объекта Figure. Базовый класс MovieWriter реализует 3 метода и менеджер контекста. Разница между классами записи, основанными на каналах, и классами записи, основанными на файлах, заключается в аргументах соответствующих методов 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 | Базовый класс для анимаций. |
TimedAnimation | Подкласс Animation для анимации, основанной на времени. |
Регистр записи
Для сопоставления имени записывателя с классом предоставляется регистр на уровне модуля, позволяющий передать строку в Animation.save вместо экземпляра записывателя.
MovieWriterRegistry | Регистр доступных классов записывателей по удобочитаемому имени. |
Базовые классы записывателя
Для уменьшения дублирования кода используются базовые классы
AbstractMovieWriter | Абстрактный базовый класс для записи видео. |
MovieWriter | Базовый класс для записи видео. |
FileMovieWriter |
MovieWriter для записи в отдельные файлы и склеивания в конце. |
и миксины
AVConvBase | [Устаревший] Миксин-класс для вывода avconv. |
FFMpegBase | Миксин-класс для вывода FFMpeg. |
ImageMagickBase | Миксин-класс для вывода ImageMagick. |
предоставлены.
См. исходный код для того, как легко реализовать новые классы MovieWriter.
Диаграммы наследования
© 2012–2021 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/3.4.3/api/animation_api.html