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)
с подробностями для обработки «блиттинга» (для существенного улучшения производительности в реальном времени), для того чтобы она не блокировала выполнение, не перезапускала цикл событий 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 |
Записывающее устройство 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–2018 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/3.3.3/api/animation_api.html