Как создать GIF из графиков Matplotlib в Python
В этой статье рассмотрим метод визуализации данных для 2-мерных временных рядов данных с использованием 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, который показывает взаимосвязь между двумя объектами. Но теперь вы упускаете аспект времени.
Чтобы визуализировать взаимосвязь между двумя функциями и временем, мы можем использовать 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
Наконец, все, что вам нужно сделать, это сохранить кадры в формате GIF с помощью метода mimsave
. Вы можете настроить частоту кадров GIF в секунду (fps) с помощью параметра fps
.
imageio.mimsave('./example.gif', # output gif
frames, # array of input frames
fps = 5) # optional: frames per second
Полученный GIF-файл показан ниже.
Если вы хотите, чтобы GIF останавливался после последнего кадра, добавьте параметр loop=1
в метод mimsave
.
imageio.mimsave('./example.gif',
frames,
fps = 5,
loop = 1)
Вывод
Визуализация 2-мерных данных временных рядов с помощью линейных графиков может быть неэффективной, поскольку она не показывает взаимосвязи между двумя объектами. Использование GIF-файлов является лучшей альтернативой визуализации данных для 2-мерных временных рядов, таких как долгота и широта или координаты x и y.
В этом кратком руководстве вы узнали, как можно создать GIF-файл с помощью Matplotlib и imageio на Python всего за три простых шага.