Dav*_*ide 3 python animation matplotlib
我在用Python制作动画时遇到了麻烦.我的问题是为沿某个轨迹移动的3D点设置动画.我可以通过使用动画模块并在每个帧重新绘制图表来实现这一点(请参阅我的脚本中的第一个选项).我想改为只移动每一帧的点位置而不重新制作所有轴(参见我的脚本中的第二个选项).这是我的脚本:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as an
from mpl_toolkits.mplot3d import Axes3D
# create the parametric curve
t=np.arange(0, 2*np.pi, 2*np.pi/100)
x=np.cos(t)
y=np.sin(t)
z=t/(2.*np.pi)
# create the figure
fig=plt.figure()
ax=fig.gca(projection='3d')
# create the first plot
point=ax.scatter(x[0], y[0], z[0])
line=ax.plot(x, y, z, label='parametric curve')
ax.legend()
ax.set_xlim([-1.5, 1.5])
ax.set_ylim([-1.5, 1.5])
ax.set_zlim([-1.5, 1.5])
# first option - remake the plot at every frame
def update_axes(n, x, y, z, ax):
ax.cla()
ax.set_xlim([-1.5, 1.5])
ax.set_ylim([-1.5, 1.5])
ax.set_zlim([-1.5, 1.5])
point=ax.scatter(x[n], y[n], z[n])
line=ax.plot(x, y, z, label='parametric curve')
ax.legend()
return point
ani=an.FuncAnimation(fig, update_axes, 99, fargs=(x, y, z, ax))
# second option - move the point position at every frame
def update_point(n, x, y, z, point):
point.set_3d_properties(x[n], 'x')
point.set_3d_properties(y[n], 'y')
point.set_3d_properties(z[n], 'z')
return point
#ani=an.FuncAnimation(fig, update_point, 99, fargs=(x, y, z, point))
# make the movie file demo.mp4
writer=an.writers['ffmpeg'](fps=20)
dpi = 100
ani.save('demo.mp4',writer=writer,dpi=dpi)
Run Code Online (Sandbox Code Playgroud)
如果我选择第二个选项(注释第一个FuncAnimation并取消注释第二个选项),我将获得仅在z方向上移动的点.有关我应该怎样做才能在x和y方向移动它的任何建议?
仅沿z轴移动的原因是因为set_3d_properties仅针对第三轴.因此,前两个set_3d_properties电话是无影响的.查看工作修改代码:
from matplotlib import pyplot as plt
import numpy as np
import mpl_toolkits.mplot3d.axes3d as p3
from matplotlib import animation
fig = plt.figure()
ax = p3.Axes3D(fig)
# create the parametric curve
t=np.arange(0, 2*np.pi, 2*np.pi/100)
x=np.cos(t)
y=np.sin(t)
z=t/(2.*np.pi)
# create the first plot
point, = ax.plot([x[0]], [y[0]], [z[0]], 'o')
line, = ax.plot(x, y, z, label='parametric curve')
ax.legend()
ax.set_xlim([-1.5, 1.5])
ax.set_ylim([-1.5, 1.5])
ax.set_zlim([-1.5, 1.5])
# second option - move the point position at every frame
def update_point(n, x, y, z, point):
point.set_data(np.array([x[n], y[n]]))
point.set_3d_properties(z[n], 'z')
return point
ani=animation.FuncAnimation(fig, update_point, 99, fargs=(x, y, z, point))
plt.show()
Run Code Online (Sandbox Code Playgroud)