модуль анимации
Содержание
Анимация
Самый простой способ создать живую анимацию в 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)
с деталями, чтобы обработать «blitting» (чтобы значительно улучшить производительность в реальном времени), чтобы быть неблокирующим, не неоднократно запускать/останавливать цикл событий GUI, обрабатывать повторы, несколько анимированных осей и легко сохранять анимацию в файл киноленты.
«Blitting» — это старая техника в компьютерной графике. Основная идея заключается в том, чтобы взять существующий битмап (в нашем случае, в основном растровое изображение) и затем «blit» ещё один элемент наверх. Таким образом, управляя сохранённым «чистым» битмапом, мы можем перерисовывать только те элементы, которые меняются в каждом кадре, и, возможно, сэкономить значительное время. При использовании blitting (передавая 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 и теории работы «blitting».
Ожидаемая подпись для 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
Примеры
- Примеры простой анимации
- Сохранение анимации
- Анимированное изображение с использованием списка изображений
Классы-писатели
Предоставленные писатели делятся на две основные категории: основанные на каналах и основанные на файлах. Писатели, основанные на каналах, передают захваченные кадры через канал внешнему процессу. Писатели на основе каналов, как правило, более производительны, но могут не работать на всех системах.
FFMpegWriter | Писатель ffmpeg на основе канала. |
ImageMagickFileWriter | Писатель анимированных GIF на основе файла. |
AVConvWriter | Писатель avconv на основе канала. |
В качестве альтернативы, писатели на основе файлов сохраняют временные файлы для каждого кадра, которые соединяются в один файл в конце. Хотя они медленнее, эти писатели могут быть легче отлаживаемыми.
FFMpegFileWriter | Писатель ffmpeg на основе файла. |
ImageMagickWriter | Писатель анимированных 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 для анимации, основанной на времени. |
Custom Animation classes
Writer Registry
Для сопоставления имени записи и класса предоставляется регистр на уровне модуля, что позволяет передавать строку в Animation.save вместо экземпляра записи.
MovieWriterRegistry | Регистр доступных классов записей по удобочитаемым именам. |
Writer Base Classes
Для сокращения дублирования кода предоставляются базовые классы
AbstractMovieWriter | Абстрактный базовый класс для записи видео. |
MovieWriter | Базовый класс для записи видео. |
FileMovieWriter |
MovieWriter для записи в отдельные файлы и склеивания в конце. |
и миксины предоставляются
AVConvBase | Миксин-класс для вывода avconv. |
FFMpegBase | Миксин-класс для вывода FFMpeg. |
ImageMagickBase | Миксин-класс для вывода ImageMagick. |
См. исходный код для того, как легко реализовать новые классы MovieWriter.
Диаграммы наследования
Устаревшее
MencoderBase | |
MencoderFileWriter |
Устарело начиная с версии 2.0. |
MencoderWriter |
Устарело начиная с версии 2.0. |
© 2012–2017 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
http://matplotlib.org/2.1.0/api/animation_api.html