Spec-Zone.ru › Matplotlib

matplotlib.animation

Содержание

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

Анимация

Проще всего создать анимацию в Matplotlib можно с помощью одного из классов Animation.

См. также

  • Анимация с использованием Matplotlib

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

Animation

Базовый класс для анимаций.

FuncAnimation

Подкласс TimedAnimation, создающий анимацию путём многократного вызова функции func.

ArtistAnimation

Подкласс TimedAnimation, создающий анимацию с помощью фиксированного набора объектов Artist.

В обоих случаях крайне важно сохранять ссылку на объект экземпляра. Анимация продвигается таймером (обычно предоставляемым GUI-фреймворком приложения), на который объект Animation хранит единственную ссылку. Если не сохранить ссылку на объект Animation, он (а вместе с ним и таймеры) будет удалён сборщиком мусора, и анимация остановится.

Чтобы сохранить анимацию, используйте Animation.save, Animation.to_html5_video или Animation.to_jshtml.

Подробную информацию о поддерживаемых форматах видео см. ниже в разделе Вспомогательные классы.

FuncAnimation

В общих чертах FuncAnimation работает следующим образом:

for d in frames:
    artists = func(d, *fargs)
    fig.canvas.draw_idle()
    fig.canvas.start_event_loop(interval)

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

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

Примечание

При блиттинге порядок zorder объектов Artist не учитывается, поскольку объекты Artist, отрисовываемые с помощью блиттинга, всегда отображаются поверх остальных.

Ожидаемая сигнатура func и init_func очень проста. Это позволяет не включать FuncAnimation в логику учёта объектов и построения графиков, но означает, что передаваемые вызываемые объекты должны знать, с какими объектами Artist им предстоит работать. Существует несколько способов решить эту задачу, различающихся по сложности и степени инкапсуляции. Самый простой способ, хорошо подходящий для скриптов, — определить объект Artist в глобальной области видимости и позволить Python самостоятельно разобраться с остальным. Например:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.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, чтобы передавать функции аргументы:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from functools import partial

fig, ax = plt.subplots()
line1, = ax.plot([], [], 'ro')

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return line1,

def update(frame, ln, x, y):
    x.append(frame)
    y.append(np.sin(frame))
    ln.set_data(x, y)
    return ln,

ani = FuncAnimation(
    fig, partial(update, ln=line1, x=[], y=[]),
    frames=np.linspace(0, 2*np.pi, 128),
    init_func=init, blit=True)

plt.show()

Третий способ — использовать замыкания для создания нужных объектов Artist и функций. Четвёртый способ — создать класс.

Примеры

  • Затухание
  • Обновление Байеса
  • Задача о двойном маятнике
  • Анимированная гистограмма
  • Моделирование дождя
  • Анимированное трёхмерное случайное блуждание
  • Анимированный линейный график
  • Осциллограф
  • Matplotlib без ограничений

ArtistAnimation

Примеры

  • Анимированное изображение с использованием заранее вычисленного списка изображений

Классы средств записи

Диаграмма наследования matplotlib.animation.FFMpegFileWriter, matplotlib.animation.FFMpegWriter, matplotlib.animation.ImageMagickFileWriter, matplotlib.animation.ImageMagickWriter, matplotlib.animation.PillowWriter, matplotlib.animation.HTMLWriter

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

Средство записи Pillow использует библиотеку Pillow для создания анимации и хранит все данные в памяти.

PillowWriter

Средство записи HTML создаёт анимации на основе JavaScript.

HTMLWriter

Средство записи HTML-видео на основе JavaScript.

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

FFMpegWriter

Средство записи ffmpeg на основе канала.

ImageMagickWriter

Средство записи анимированных GIF на основе канала.

Средства записи на основе файлов сохраняют временные файлы для каждого кадра, которые в конце объединяются в один файл. Хотя они работают медленнее, отлаживать их может быть проще.

FFMpegFileWriter

Файловое средство записи ffmpeg.

ImageMagickFileWriter

Файловое средство записи анимированных GIF.

Классы средств записи позволяют последовательно захватывать кадры из одного и того же объекта Figure. Все они предоставляют три метода, которые необходимо вызывать по порядку:

  • 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

Абстрактный базовый класс для записи видео; позволяет захватывать кадры с помощью вызова grab_frame.

MovieWriter

Базовый класс для записи видео.

FileMovieWriter

Подкласс MovieWriter для записи отдельных файлов с последующим объединением.

а также примеси

FFMpegBase

Класс-примесь для вывода FFMpeg.

ImageMagickBase

Класс-примесь для вывода ImageMagick.

Также предусмотрены соответствующие классы.

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

© 2012–2026 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/stable/api/animation_api.html

Spec-Zone.ru

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