Spec-Zone.ru › Matplotlib 3.3

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)

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

Записывающее устройство 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–2018 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/3.3.3/api/animation_api.html

Spec-Zone.ru

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