Python. Анимированные графики в matplotlib
На уроке Python. Научная графика мы разобрали библиотеку научной графики matplotlib. Было рассказано, как установить библиотеку, дан обзор ее важным классам. В статье рассказано, как рисовать при помощи библиотеки matplotlib, строить графики функций, как делать на графиках метки. Библиотека matplotlib также позволяет рисовать трехмерные графики, топологические карты, сохранять графики в файлы в различных форматах, включая png и pdf. Так же matplotlib позволяет строить различные диаграммы, например, круговые.
При помощи данной библиотеки Python можно так же делать и анимированные графики. Например:
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation TWOPI = 2*np.pi fig, ax = plt.subplots() t = np.arange(0.0, TWOPI, 0.001) s = np.sin(t) l = plt.plot(t, s) ax = plt.axis([0,TWOPI,-1,1]) redDot, = plt.plot([0], [np.sin(0)], 'ro') def animate(i): redDot.set_data(i, np.sin(i)) return redDot, # create animation using the animate() function myAnimation = animation.FuncAnimation(fig, animate, frames=np.arange(0.0, TWOPI, 0.1), \ interval=10, blit=True, repeat=True) plt.show()
Запустив данную программу, вы увидите синусоиду, по которой «бегает» красный кружочек.
Теперь разберем эту программу более подробно.
Вот этим кодом мы подключаем необходимые библиотеки:
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation
Далее, вычисляем число «2 пи»:
TWOPI = 2*np.pi
Это все понятно и очевидно. А вот теперь начинается самое интересное:
fig, ax = plt.subplots()
Если после этой команды мы добавим
print(fig) print(ax)
то получим на экране:
Figure(640×480)
AxesSubplot(0.125,0.11;0.775×0.77)
По сути, это информация о созданных объектах. То есть fig и ax — это объекты (фигура и оси). Но нам интересна именно fig — фигура, которая далее передаётся функции FuncAnimation:
# create animation using the animate() function myAnimation = animation.FuncAnimation(fig, animate, frames=np.arange(0.0, TWOPI, 0.1), \ interval=10, blit=True, repeat=True)
Сюда же передается функция animate, которая, собственно говоря, и осуществляет анимацию. Что она делает? Она устанавливает новую координату красной точки:
def animate(i): redDot.set_data(i, np.sin(i)) return redDot,
До этого красная точка была нарисована командой:
redDot, = plt.plot([0], [np.sin(0)], 'ro')
Цвет и тип точки закодирован в строке ‘ro’ — красный кругляшек. Если поставим ‘go’ то кругляшек будет зеленый. Если вместо ‘o’ поставить знак ‘^’ то вместо кругляшка будет треугольник. Но можно задать маркер и цвет в более понятном виде:
redDot, = plt.plot([0], [np.sin(0)], marker = 'o', color = 'yellow')
А вот пример другой анимации, бегущая синусоида:
import numpy as np from matplotlib import pyplot as plt from matplotlib.animation import FuncAnimation plt.style.use('seaborn-pastel') fig = plt.figure() ax = plt.axes(xlim=(0, 4), ylim=(-2, 2)) line, = ax.plot([], [], lw=3) def init(): line.set_data([], []) return line, def animate(i): x = np.linspace(0, 4, 1000) y = np.sin(2 * np.pi * (x - 0.01 * i)) line.set_data(x, y) return line, anim = FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True) plt.show()
Здесь в функции animate мы просто пересчитываем синусоиду с некоторым сдвигом.
Анимацию можно записать, только для этого нужно поставить сначала специальную прогу, которая создает гифки, например, imagemagick (https://imagemagick.org/script/download.php) и после этого вы может создать файл с анимацией, просто вызвав:
anim.save('d:\\7\\1.gif', writer='imagemagick', fps=30)
А вот и сама анимашка:
Comments
So empty here ... leave a comment!