Spec-Zone.ru › Matplotlib 3.4

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)

с подробностями для обработки «блиттинга» (для существенного повышения производительности в режиме реального времени), для обеспечения неблокирующей работы, для предотвращения многократного запуска/остановки цикла обработки событий графического интерфейса, для обработки повторений, нескольких анимированных осей и для простого сохранения анимации в файл кино.

«Блиттинг» — это стандартный приём в компьютерной графике. В общем случае он сводится к взятию существующего битового изображения (в нашем случае, в основном растрового рисунка) и последующего «блиттинга» одного или нескольких объектов поверх него. Таким образом, управляя сохранённым «чистым» битовым изображением, мы можем перерисовать только те несколько объектов, которые изменяются в каждом кадре, потенциально экономя значительное количество времени. При использовании блиттинга (передавая 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.

Диаграммы наследования

Inheritance diagram of matplotlib.animation.FuncAnimation, matplotlib.animation.ArtistAnimation
Inheritance diagram of matplotlib.animation.AVConvFileWriter, matplotlib.animation.AVConvWriter, matplotlib.animation.FFMpegFileWriter, matplotlib.animation.FFMpegWriter, matplotlib.animation.ImageMagickFileWriter, matplotlib.animation.ImageMagickWriter

© 2012–2021 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/3.4.3/api/animation_api.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API