Spec-Zone.ru › Matplotlib 2.1

модуль анимации

Содержание

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

Анимация

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

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

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

Ожидаемая подпись для 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

Примеры

  • Примеры простой анимации
  • Сохранение анимации
  • Анимированное изображение с использованием списка изображений

Классы-писатели

Предоставленные писатели делятся на две основные категории: основанные на каналах и основанные на файлах. Писатели, основанные на каналах, передают захваченные кадры через канал внешнему процессу. Писатели на основе каналов, как правило, более производительны, но могут не работать на всех системах.

FFMpegWriter Писатель ffmpeg на основе канала.
ImageMagickFileWriter Писатель анимированных GIF на основе файла.
AVConvWriter Писатель avconv на основе канала.

В качестве альтернативы, писатели на основе файлов сохраняют временные файлы для каждого кадра, которые соединяются в один файл в конце. Хотя они медленнее, эти писатели могут быть легче отлаживаемыми.

FFMpegFileWriter Писатель ffmpeg на основе файла.
ImageMagickWriter Писатель анимированных 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()

для обеспечения выполнения необходимой настройки и очистки.

MovieWriter

Вспомогательные классы

Базовые классы анимации

Animation Этот класс оборачивает создание анимации с использованием matplotlib.
TimedAnimation Подкласс Animation для анимации, основанной на времени.

Custom Animation classes

Анимированные подграфики

Writer Registry

Для сопоставления имени записи и класса предоставляется регистр на уровне модуля, что позволяет передавать строку в Animation.save вместо экземпляра записи.

MovieWriterRegistry Регистр доступных классов записей по удобочитаемым именам.

Writer Base Classes

Для сокращения дублирования кода предоставляются базовые классы

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

Устаревшее

MencoderBase
MencoderFileWriter

Устарело начиная с версии 2.0.

MencoderWriter

Устарело начиная с версии 2.0.

© 2012–2017 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
http://matplotlib.org/2.1.0/api/animation_api.html

Spec-Zone.ru

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