Как создать GIF из графиков Matplotlib в Python

В этой статье рассмотрим метод визуализации данных для 2-мерных временных рядов данных с использованием imageio

https://t.me/data_analysis_ml

GIF, созданный с помощью Matplotlib и imageio
GIF, созданный с помощью Matplotlib и imageio

Мы все знаем, что линейные графики – это самый интуитивный способ визуализации временных рядов. Но как бы вы визуализировали временной ряд с двумя объектами, которые имеют взаимосвязь, например, координаты x и y или долготу и широту? GIF-файлы – отличный способ визуализации 2-мерных данных временных рядов.

GIF-файлы – отличный способ визуализации 2-мерных данных временных рядов.

Давайте посмотрим на следующий пример.

x = [1, 2, 3, 4, 4, 4, 4, 3, 2, 1, 1, 1, 1]
y = [1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 3, 2, 1]
time = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

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

Линейные графики двух отдельных временных рядов
Линейные графики двух отдельных временных рядов

Затем вы можете построить график x поверх y, который показывает взаимосвязь между двумя объектами. Но теперь вы упускаете аспект времени.

x над y
x над y

Чтобы визуализировать взаимосвязь между двумя функциями и временем, мы можем использовать GIF.

В этой статье мы рассмотрим, как быстро создать GIF-файл на Python с помощью трех простых шагов.

Как создать GIF-файл на Python

Вы можете создать GIF-файл на Python всего за три простых шага, используя библиотеки Matplotlib и imageio:

  • Создайте функцию для построения зависящих от Time-Dependent кадров с помощью Matplotlib
  • Нанесите на график все кадры GIF-файла
  • Объедините кадры в GIF с помощью imageio

В этой статье мы будем использовать Matplotlib для построения отдельных кадров GIF и imageio для объединения отдельных кадров в один GIF.

import matplotlib.pyplot as plt
import imageio

Создайте функцию для построения Time-Dependen кадров

Сначала вы создадите функцию create_frame(t), которая отображает один кадр GIF в одну конкретную временную метку и сохраняет его с уникальным именем.

Я рекомендую установить параметры transparent=False и facecolor='white', чтобы избежать получения странных эффектов в ваших GIF-файлах из-за перекрытия отдельных прозрачных рамок.

def create_frame(t):
    fig = plt.figure(figsize=(6, 6))
    plt.plot(x[:(t+1)], y[:(t+1)], color = 'grey' )
    plt.plot(x[t], y[t], color = 'black', marker = 'o' )
    plt.xlim([0,5])
    plt.xlabel('x', fontsize = 14)
    plt.ylim([0,5])
    plt.ylabel('y', fontsize = 14)
    plt.title(f'Relationship between x and y at step {t}',
              fontsize=14)
    plt.savefig(f'./img/img_{t}.png', 
                transparent = False,  
                facecolor = 'white'
               )
    plt.close()

Нанесите на график все кадры GIF-файла

Далее все, что вам нужно сделать, это отобразить все кадры GIF.

for t in time:
    create_frame(t)
Все отдельные кадры GIF, построенные с помощью Matplotlib
Все отдельные кадры GIF, построенные с помощью Matplotlib

Объедините кадры в GIF

Наконец, все, что вам нужно сделать, это сохранить кадры в формате GIF с помощью метода mimsave. Вы можете настроить частоту кадров GIF в секунду (fps) с помощью параметра fps.

imageio.mimsave('./example.gif', # output gif
                frames,          # array of input frames
                fps = 5)         # optional: frames per second

Полученный GIF-файл показан ниже.

GIF, созданный с помощью Matplotlib и imageio
GIF, созданный с помощью Matplotlib и imageio

Если вы хотите, чтобы GIF останавливался после последнего кадра, добавьте параметр loop=1 в метод mimsave.

imageio.mimsave('./example.gif', 
                frames, 
                fps = 5, 
                loop = 1)
GIF, созданный с помощью Matplotlib и imageio, который останавливается после одного цикла в последнем кадре
GIF, созданный с помощью Matplotlib и imageio, который останавливается после одного цикла в последнем кадре

Вывод

Визуализация 2-мерных данных временных рядов с помощью линейных графиков может быть неэффективной, поскольку она не показывает взаимосвязи между двумя объектами. Использование GIF-файлов является лучшей альтернативой визуализации данных для 2-мерных временных рядов, таких как долгота и широта или координаты x и y.

В этом кратком руководстве вы узнали, как можно создать GIF-файл с помощью Matplotlib и imageio на Python всего за три простых шага.#Python#Matplotlib

источник

Ответить