Python中的图形绘图 |设置 3
Python中的图形绘图 |设置 1
Python中的图形绘图 |设置 2
Matplotlib 是一个非常广泛的库,它也支持图形动画。动画工具以matplotlib.animation基类为中心,它提供了一个构建动画功能的框架。主要的接口是TimedAnimation和FuncAnimation ,在这两个接口中, FuncAnimation是最方便使用的一个。
安装:
- Matplotlib :请参阅Python中的图形绘图 |设置 1
- Numpy:您可以使用以下 pip 命令安装 numpy 模块:
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() ax = plt.axes(xlim=(-50, 50), ylim=(-50, 50)) line, = ax.plot([], [], lw=2)
在这里,我们首先创建一个图形,即所有子图的顶级容器。
然后我们创建一个轴元素ax作为子图。 x 和 y 轴的范围/限制也在创建轴元素时定义。
最后,我们创建名为line的绘图元素。最初,x 和 y 轴点被定义为空列表,线宽(lw)被设置为 2。def init(): line.set_data([], []) return line,
现在,我们声明一个初始化函数init 。动画师调用此函数来创建第一帧。
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()函数来创建每一帧。调用此函数的次数由帧数决定,帧数作为帧参数传递给 animator。
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 数据,然后返回绘图对象line 。
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=500, interval=20, blit=True)
现在,我们创建 FuncAnimation 对象anim 。它需要下面解释的各种参数:
fig :要绘制的图形。
animate :为每一帧重复调用的函数。
init_func :用于绘制清晰框架的函数。它在第一帧之前被调用一次。
帧数:帧数。 (注意:帧也可以是可迭代的或生成器。)
间隔:帧之间的持续时间(以毫秒为单位)
blit :设置 blit=True 意味着只绘制那些已经改变的部分。anim.save('animated_coil.mp4', writer = 'ffmpeg', fps = 30)
现在,我们使用save()函数将 animator 对象保存为视频文件。您将需要一个电影作家来保存动画视频。在此示例中,我们使用了 FFMPEG 电影编写器。所以,作家被设置为'ffmpeg'。
fps代表每秒帧数。
示例 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
这里也应用了同样的方法:
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 为两个纵坐标。然后旋转角度 theta 后,新的纵坐标为:
这里也应用了同样的方法:
X = x*np.cos(t) - y*np.sin(t) Y = y*np.cos(t) + x*np.sin(t)
总而言之,动画是创造令人惊叹的东西的好工具,并且可以使用它们来创造更多的东西。
因此,这就是使用 Matplotlib 生成和保存动画图的方式。