matplotlib.animation
Содержание
Анимация
Самый простой способ создать анимацию в matplotlib — использовать один из классов Animation.
Animation | Этот класс оборачивает создание анимации с помощью matplotlib. |
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')
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/3.1.1/api/animation_api.html