Top.Mail.Ru

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!

Добавить комментарий

Sidebar