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 с помощью ImageMagick. |
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()
чтобы гарантировать выполнение необходимой настройки и очистки.
Примеры
END_OF_DOCUMENT_MARKER ```Классы вспомогательных функций
Базовые классы анимации
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.2.2/api/animation_api.html