Анимация
Содержание
Анимация
Самый простой способ создать живую анимацию в matplotlib — использовать один из классов 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)
с деталями для обработки «блендинга» (чтобы значительно улучшить производительность в реальном времени), чтобы быть неблокирующей, не повторять запуск/остановку цикла обработки событий GUI, обрабатывать повторы, несколько анимированных осей и легко сохранять анимацию в файл фильма.
«Блендинг» — это старая техника в компьютерной графике. В общих чертах, берется существующий битмап (в нашем случае, в основном растрированное изображение) и затем «блендится» еще один элемент наложения. Таким образом, управляя сохраненным «чистым» битмапом, мы можем перерисовать только те элементы, которые изменяются в каждом кадре, и, возможно, значительно сэкономить время. При использовании блендинга (передавая 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', animated=True)
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 |
Записыватели на основе канала передают захваченные кадры через канал внешнему процессу. Варианты на основе канала, как правило, более производительны, но могут не работать на всех системах.
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=fig, 'my_movie.ext', dpi=100)
for j in range(n):
update_figure(n)
moviewriter.grab_frame()
moviewriter.finish()
Если вы используете классы записывателей напрямую (не через Animation.save), настоятельно рекомендуется использовать менеджер контекста saving
with moviewriter.saving(fig, 'myfile.mp4', dpi=100):
for j in range(n):
update_figure(n)
moviewriter.grab_frame()
для обеспечения выполнения необходимой настройки и очистки.
Примеры
Вспомогательные классы
Базовые классы анимации
Animation | Этот класс оборачивает создание анимации с использованием matplotlib. |
TimedAnimation | Подкласс Animation для анимации, основанной на времени. |
Регистр записывателей
Для сопоставления имени записывателя и класса предоставляется регистр на уровне модуля, что позволяет передать строку в Animation.save вместо экземпляра записывателя.
MovieWriterRegistry | Регистр доступных классов записывателей по удобочитаемому имени. |
Базовые классы записывателей
Для уменьшения дублирования кода используются базовые классы
AbstractMovieWriter | Абстрактный базовый класс для записи видео. |
MovieWriter | Базовый класс для записи видео. |
FileMovieWriter |
MovieWriter для записи в отдельные файлы и склеивания в конце. |
и миксины
AVConvBase | Миксин-класс для вывода avconv. |
FFMpegBase | Миксин-класс для вывода FFMpeg. |
ImageMagickBase | Миксин-класс для вывода ImageMagick. |
предоставляются.
См. исходный код для того, как легко реализовать новые классы MovieWriter.
Диаграммы наследования
© 2012–2018 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/2.2.3/api/animation_api.html