Spec-Zone.ru › Matplotlib 2.2

Анимация

Содержание

  • Анимация
  • Классы записывателей
  • Вспомогательные классы
  • Диаграммы наследования

Анимация

Самый простой способ создать живую анимацию в 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)

с деталями для обработки «блендинга» (чтобы значительно улучшить производительность в реальном времени), чтобы быть неблокирующей, не повторять запуск/остановку цикла обработки событий 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', 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

Примеры

  • Анимированное изображение, использующее предварительно вычисленный список изображений

Классы записывателей

Предоставленные записыватели относятся к нескольким широким категориям.

Записыватель 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.

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

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–2018 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/2.2.3/api/animation_api.html

Spec-Zone.ru

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