Построение графиков на Python | Набор 1
Построение графиков на Python | Набор 2
Matplotlib-это довольно обширная библиотека, которая также поддерживает анимацию графиков. Инструменты анимации сосредоточены вокруг базового класса matplotlib.animation, который обеспечивает основу, вокруг которой строится функциональность анимации. Основными интерфейсами являются TimedAnimation и FuncAnimation, и из этих двух наиболее удобным в использовании является FuncAnimation.
Установка:
- Matplotlib: Обратитесь к построению графиков в Python | Набор 1
- Numpy: Вы можете установить модуль numpy, используя следующую команду pip:
pip install numpy
- FFMPEG: Это требуется только для сохранения анимации в виде видео. Исполняемый файл можно загрузить с здесь.
Реализация:
# importing required modules
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
# create a figure, axis and plot element
fig = plt.figure()
ax = plt.axes(xlim=(-50, 50), ylim=(-50, 50))
line, = ax.plot([], [], lw=2)
# initialization function
def init():
# creating an empty plot/frame
line.set_data([], [])
return line,
# lists to store x and y axis points
xdata, ydata = [], []
# animation function
def animate(i):
# t is a parameter
t = 0.1*i
# x, y values to be plotted
x = t*np.sin(t)
y = t*np.cos(t)
# appending new points to x, y axes points list
xdata.append(x)
ydata.append(y)
# set/update the x and y axes data
line.set_data(xdata, ydata)
# return line object
return line,
# setting a title for the plot
plt.title('A growing coil!')
# hiding the axis details
plt.axis('off')
# call the animator
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=500, interval=20, blit=True)
# save the animation as mp4 video file
anim.save('animated_coil.mp4', writer = 'ffmpeg', fps = 30)
# show the plot
plt.show()
Вот как выглядит выходная анимация:
Теперь давайте попробуем разобраться в коде по частям:
fig = plt.figure()
Здесь мы сначала создаем фигуру, то есть контейнер верхнего уровня для всех наших подзаголовков.
Затем мы создаем элемент осей топор который действует как подзаголовок. Диапазон/предел для осей x и y также определяются при создании элемента оси.
Наконец, мы создаем сюжет элемент, названный как линия . Первоначально точки по осям x и y были определены как пустые списки и ширина строки
def init():
line.set_data([], [])
return line,
Теперь мы объявляем функцию инициализации, в этом . Эта функция вызывается аниматором для создания первого кадра.
def animate(i):
# t is a parameter
t = 0.1*i
# x, y values to be plotted
x = t*np.sin(t)
y = t*np.cos(t)
# appending new points to x, y axes points list
xdata.append(x)
ydata.append(y)
# set/update the x and y axes data
line.set_data(xdata, ydata)
# return line object
return line,
Это самая важная функция вышеуказанной программы. функция animate() вызывается аниматором снова и снова для создания каждого кадра. Количество раз, когда эта функция будет вызвана, определяется количеством кадров, которое передается аниматору в качестве аргумента кадров.
функция animate() принимает индекс i-го кадра в качестве аргумента.
t = 0,1*i
Здесь мы умело используем индекс текущего кадра в качестве параметра!
x = t*np.sin(t)
y = t*np.cos(t)
Теперь, поскольку у нас есть параметр t, мы можем легко построить любое параметрическое уравнение. Например, здесь мы строим спираль, используя ее параметрическое уравнение.
line.set_data(xdata, ydata)
return line,
Наконец, мы используем set_data() функция для задания данных x и y, а затем возврата объекта графика, линия.
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=500, interval=20, blit=True)
Теперь мы создаем объект FuncAnimation, anim . Для этого требуются различные аргументы, описанные ниже:
fig .: рисунок, который будет нанесен на график.
animate : функция, вызываемая повторно для каждого кадра.
init_func : функция, используемая для рисования четкого кадра. Он вызывается один раз перед первым кадром.
frames : количество кадров. (Примечание: кадры также могут быть повторяющимися или генераторными.)
interval : длительность между кадрами ( в миллисекундах)
blit : установка blit=True означает, что будут нарисованы только те части, которые изменились.
anim.save('animated_coil.mp4', writer = 'ffmpeg', fps = 30)
Теперь мы сохраняем объект аниматора в виде видеофайла с помощью save(). Вам понадобится сценарист фильма для сохранения анимационного видео. В этом примере мы использовали FFMPEG movie writer. Так, writer устанавливается как » ffmpeg’.
Шутер от первого лица означает кадр в секунду.
Пример 2
Этот пример показывает, как можно построить вращающуюся кривую, применив простую математику!
# importing required modules
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
# create a figure, axis and plot element
fig = plt.figure()
ax = plt.axes(xlim=(-25, 25), ylim=(-25, 25))
line, = ax.plot([], [], lw=2)
# initialization function
def init():
# creating an empty plot/frame
line.set_data([], [])
return line,
# set of points for a star (could be any curve)
p = np.arange(0, 4*np.pi, 0.1)
x = 12*np.cos(p) + 8*np.cos(1.5*p)
y = 12*np.sin(p) - 8*np.sin(1.5*p)
# animation function
def animate(i):
# t is a parameter
t = 0.1*i
# x, y values to be plotted
X = x*np.cos(t) - y*np.sin(t)
Y = y*np.cos(t) + x*np.sin(t)
# set/update the x and y axes data
line.set_data(X, Y)
# return line object
return line,
# setting a title for the plot
plt.title('A rotating star!')
# hiding the axis details
plt.axis('off')
# call the animator
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=100, interval=100, blit=True)
# save the animation as mp4 video file
anim.save('basic_animation.mp4', writer = 'ffmpeg', fps = 10)
# show the plot
plt.show()
Вот как выглядит вывод вышеприведенной программы:
Здесь мы использовали некоторую простую математику для поворота заданной кривой.
- Форма звезды получается, если положить k = 2,5 и 0<t:
То же самое было применено и здесь:
p = np.arange(0, 4*np.pi, 0,1)
x = 12*np.cos(p) + 8*np.cos(1,5*p)
y = 12*np.sin(p) - 8*np.sin(1,5*p)
- Теперь в каждом кадре мы поворачиваем звездную кривую, используя концепцию вращения в комплексных числах. Пусть x, y — две координаты. Затем после поворота на угол тета новые координаты будут:
То же самое было применено и здесь:
X = x*np.cos(t) - y*np.sin(t)
Y = y*np.cos(t) + x*np.sin(t)
В целом, анимация-отличный инструмент для создания удивительных вещей, и с ее помощью можно создать еще много вещей.
Итак, вот как можно создавать и сохранять анимированные сюжеты с помощью Matplotlib.