Анимация данных в Matplotlib

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

Анимация дождь matplotlib

Изображение выше — симуляция дождя, которая была выполнена при помощи библиотеки Matplotlib, известной как праотец пакетов визуализации в Python. Matplotlib симулирует капли дождя на поверхности, анимируя масштаб и непрозрачность 50 точек рассеяния. Сегодня Python может похвастаться большим количеством мощных инструментов, таких как Plotly, Bokeh и Altair. Эти библиотеки могут довести анимацию и интерактив до уровня искусства. Впрочем, цель данной статьи — осветить один аспект этой библиотеки, который слабо исследован. Мы поговорим непосредственно об анимации и о способах ее создать.

Обзор Matplotlib

Matplotlib — это библиотека Python для работы с 2D графиками, которая является одной из самых популярных. Большинство начинают свой путь визуализации данных именно с этой библиотекой. Matplotlib может генерировать графики, гистограммы, спектры мощности, диаграммы ошибок и рассеяния. Он также легко интегрируется с такими библиотеками как Pandas и Seaborn для создания более сложных визуализаций.

Рассмотрим ключевые особенности matplotlib:

  • Он собран на подобии MATLAB, так что переключатся между ними очень легко.
  • Наличие большого количество бэкендов для рендеринга.
  • Возможность создавать практически любые графики.
  • Существует уже более десяти лет, так что в наличии огромная пользовательская база.

Впрочем, существуют области, где Matplotlib не настолько хорош, как его коллеги.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

  • Matplotlib имеет императивный API, который часто чересчур многословен.
  • Встречаются слабые настройки стилей.
  • Слабая поддержка для веб и интерактивных графиков.
  • Зачастую работает медленно с большими и сложными данными.

Если вы хотите освежить память — на Datacamp есть шпаргалка по Matplotlib, которой вы можете воспользоваться: https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Python_Matplotlib_Cheat_Sheet.pdf

Анимация в matplotlib Python

Базовый класс Matplotlib под названием animation занимается вопросом анимации. Он предоставляет структуру, вокруг которой строится функционал создаваемой анимации. Для этих целей существуют два основных интерфейса, которые используют:

  • FuncAnimation — создает анимацию путем повторяющегося вызова функции func.
  • ArtistAnimation — анимация, использующая фиксированный набор объектов Artist.

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

Требования

  • Модули, включая numpy и matplotlib, должны быть установлены.
  • Для сохранения анимации в вашей системе в форматах mp4 или gif, нужно установить ffmpeg или imagemagick.

После этого, мы можем начать нашу первую базовую анимацию в Jupyter Notebooks. Код для этой статьи может быть получен из  репозитория на Github: https://github.com/parulnith/Animations-with-Matplotlib

Простая анимация: движущаяся синусоида

Давайте используем FuncAnimation для создания простой анимации синусоиды, движущейся по экрану. Исходный код для анимации был взят из руководства Matplotlib Animation. Для начала, изучим выдачу, а затем код, чтобы понять, что происходит.

движущаяся синусоида matplotlib

  • В строках 7-9 мы просто создаем фигуру с одной осью. Затем мы создаем наш пустой объект строки, который по сути будет модифицирован в анимации. Объект line будет заполнен данными в дальнейшем.
  • В строках 11-13 мы создаем функцию init, которая будет отвечать за осуществление анимации. Функция init инициализирует данные, а также указывае лимит осей.
  • В строках 14-18 мы наконец определяем функцию анимации, которая принимает фрейм number(i) в качестве параметра и создает синусоиду (или любую другую анимацию), которая сдвигается в зависимости от значения i. Функция здесь возвращает кортеж объектов графика, который был модифицирован, и говорит фреймворку анимации, какие части графика должны быть анимированы.
  • В строке 20 мы создаем наш объект анимации. Параметр blit гарантирует, что будут перерисованы только те части графика, которые были изменены.

Это основное понимание того, что стоит за созданием анимации в Matplotlib. Выполняя небольшие изменения в коде, можно добиться интересных визуализаций. Давайте рассмотрим несколько из них.

Спираль в matplotlib

Таким же образом мы можем воспользоваться отличным примером создания фигур от GeeksforGeeks. Давайте создадим движущуюся спираль, которая медленно вращается при помощи класса animation библиотеки matplotlib. Код весьма похож на код синусоиды с небольшими поправками.

Спираль в matplotlib

Обновляемые графики в matplotlib

Обновляемые графики могут понадобиться, когда дело доходит до построения динамических величин, таких как данные о стоках, данные датчиков, и другие нестационарные данные. Мы построим простой график, который автоматически будет обновляться с появлением новых данных в системе.

Давайте составим график стоковых цен за месяц в гипотетической компании.

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

Обновляемые графики matplotlib

Здесь интервал длится 1000 миллисекунд, или одну секунду.

Анимирование 3D графика в matplotlib

Создание трехмерных графиков — обычное дело, но что если мы попробуем анимировать угол обзора таких графиков? Суть в изменении угла обзора камеры и использовать каждое итоговое изображение для создания анимации. Есть хороший раздел, посвященный данному вопросу в Python Graph Gallery.

Создайте папку под названием frames в том же каталоге, где расположен notebook. Все изображения будут храниться в этой папке, а затем будут использованы в анимации.

Так мы создадим несколько файлов PNG в папке frames. Теперь, используем ImageMagick для трансформации изображений в анимацию. Открываем терминал и переходим к папке frames и вводим следующую команду:

3D графика в matplotlib

Анимация и модуль Celluloid

Celluloid — это модуль Python, который упрощает процесс создания анимаций в matplotlib. Эта библиотека создает фигуру matplotlib и создает из нее камеру. Далее она снова использует фигуру, и по мере создания каждого кадра, делает скриншот нашей камерой. Наконец, анимация создается со всеми сохраненными кадрами.

Установка:

Несколько примеров использования модуля Celluloid.

Минимум

Celluloid

Подграфики

Подграфики

Легенды

Анимация данных в Matplotlib

Подведем итоги

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