Spec-Zone.ru › Matplotlib 3.1

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 на основе канала.
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/3.1.1/api/animation_api.html

Spec-Zone.ru

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