Spec-Zone.ru › Matplotlib 3.2

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 с помощью ImageMagick.
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()

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

Примеры

  • Извлечение кадров
END_OF_DOCUMENT_MARKER ```

Классы вспомогательных функций

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

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

Регистр записи

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

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

Базовые классы записывающего модуля

Для уменьшения дублирования кода предоставлены базовые классы

AbstractMovieWriter Абстрактный базовый класс для записи видео.
MovieWriter Базовый класс для записи видео.
FileMovieWriter MovieWriter для записи в отдельные файлы и склеивания в конце.

и миксины

AVConvBase Класс-миксин для вывода avconv.
FFMpegBase Класс-миксин для вывода FFMpeg.
ImageMagickBase Класс-миксин для вывода ImageMagick.

предоставлены.

См. исходный код для того, как легко реализовать новые классы MovieWriter.

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

Диаграмма наследования matplotlib.animation.FuncAnimation, matplotlib.animation.ArtistAnimation

Диаграмма наследования 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.2.2/api/animation_api.html

Spec-Zone.ru

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