# Setting up Data Set for Animation
dataSet = np.array([x, y, z]) # Combining our position coordinates
numDataPoints = len(t)
你也可以改动上面的时间和位置数组来创建新的轨迹。我们接下来要用 dataSet和numDataPoints变量定义动画函数。
为了使我们的图形动画化,我们将用animation类中的一个名为FuncAnimation的函数。
你可以在此处访问关于这两个的文档:
https://matplotlib.org/stable/api/animation_api.html
FuncAnimation要求我们创建自己的函数来更新线、点等,在这里我们将其定义为animate_func 。
def animate_func(num):
ax.clear() # Clears the figure to update the line, point,
# title, and axes # Updating Trajectory Line (num+1 due to Python indexing)
ax.plot3D(dataSet[0, :num+1], dataSet[1, :num+1],
dataSet[2, :num+1], c='blue') # Updating Point Location
ax.scatter(dataSet[0, num], dataSet[1, num], dataSet[2, num],
c='blue', marker='o') # Adding Constant Origin
ax.plot3D(dataSet[0, 0], dataSet[1, 0], dataSet[2, 0],
c='black', marker='o') # Setting Axes Limits
ax.set_xlim3d([-1, 1])
ax.set_ylim3d([-1, 1])
ax.set_zlim3d([0, 100])
# Adding Figure Labels
ax.set_title('Trajectory \nTime = ' + str(np.round(t[num],
decimals=2)) + ' sec')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
首先要注意传递给animate_func的num变量。
这是当前动画步骤的索引。当我们将animate_func传递给FuncAnimation时,它会迭代我们的num变量。我们可以使用该变量来迭代所有我们之前创建的数据集。
这个函数从清除图形开始。这将删除线、点、原点、轴标签和标题。然后它添加更新的
轨迹线
(从0到num )
和点位置
(在步骤num处)
。我们的原点在此图中保持不变,因此你会注意到num没有显示,因为我们没有更改原点。接下来,该函数定义我们不变的
轴限制
(unchanging axis limits)
。如果你希望轴随着数字的增加而改变
(使轴变为动态)
,那么你可以删除轴限制。
最后,该函数定义了我们的标题和轴标签。
标签很简单,只有我们的x 、 y和z用于坐标。作为一点额外功能,我们有一个动态标题,显示轨迹的时间数组t。我们显示它
(四舍五入到小数点后第二位)
,并在每次迭代时更新它。
请注意,这些不是实时的秒数。
绘制我们的动画
最后一步是使用FuncAnimation绘制我们的动画。
我们首先创建具有三维轴的图形对象。然后我们使用FuncAnimation ,它将图形、我们之前创建的动画函数、间隔值
(interval value)
和帧值
(frames)
作为输入。间隔是以毫秒为单位的帧之间的延迟,帧是你想显示的帧数。最后两个是可选参数,但如果你想调整动画的外观,就需要包含它们。
# Plotting the Animation
fig = plt.figure()
ax = plt.axes(projection='3d')
line_ani = animation.FuncAnimation(fig, animate_func, interval=100,
frames=numDataPoints)
plt.show()
现在,你可以运行代码了,如果正确完成,你的绘图应如下所示
(点的速度可能不同)
:
保存我们的动画
如果想把动画保存为.gif文件,你可以用以下代码来完成。
# Saving the Animation
f = r"c://Users/(Insert User)/Desktop/animate_func.gif"
writergif = animation.PillowWriter(fps=numDataPoints/6)
line_ani.save(f, writer=writergif)
你需要选择一个位置来保存它,并将其存储为f变量。你可以在PillowWriter中调整每秒帧数fps变量。我将numDataPoints变量
(FuncAnimation中的帧数)
除以6 ,使动画长度为6秒。
这就是本文的全部内容。感谢你的阅读!如果不想错过更多 Python 和数据分析文章,请关注我们的公众号!你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:
https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ
;在LinkedIn上关注我们,扩展你的人际网络!
https://www.linkedin.com/company/dataapplab/
原文作者:Zack Fizell
翻译作者:Jiawei Tong
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:
https://towardsdatascience.com/how-to-animate-plots-in-python-2512327c8263
May 17, 2022
|
|
Tags:
数据分析