Matplotlib绘制的3D载具轨迹动画无动态效果,求解决
3D轨迹动画无动态效果的修复方案
我有一个形状为(18,101)的数组X_trj,用于绘制3辆不同载具的3D轨迹,尝试用以下代码实现动画,但运行后得到静态轨迹图,生成的animation.mp4也没有动态效果:
#animate the plot: import matplotlib.animation as animation # First, create a function that updates the scatter plot for each frame def update_plot(n,X_trj,scatters): # Set the data for each scatter plot scatters[0].set_offsets(np.stack((X_trj[0, :n], X_trj[1, :n], X_trj[2, :n]), axis=1)) scatters[1].set_offsets(np.stack((X_trj[6, :n], X_trj[7, :n], X_trj[8, :n]), axis=1)) scatters[2].set_offsets(np.stack((X_trj[12,:n], X_trj[13, :n], X_trj[14,:n]), axis=1)) return scatters # Create the figure and axis fig = plt.figure() ax = plt.axes(projection='3d') # Create the scatter plots scatters = [] scatters.append(ax.scatter(X_trj[0,:], X_trj[1,:], X_trj[2,:])) scatters.append(ax.scatter(X_trj[6,:], X_trj[7,:], X_trj[8,:])) scatters.append(ax.scatter(X_trj[12,:], X_trj[13,:], X_trj[14,:])) # Set the title ax.set_title('Trajectory from one-shot optimization (human + drones)') ani = animation.FuncAnimation(fig, update_plot, frames=range(X_trj.shape[1]), fargs=(X_trj, scatters)) plt.show() ani.save('animation.mp4')
问题原因
- 3D散点更新方法错误:
set_offsets()是专门给2D散点图设计的更新接口,3D场景下必须使用set_offsets3d()来更新三维坐标数据。 - 初始绘制了全部轨迹:初始化散点时直接渲染了所有帧的轨迹点,后续帧更新无法体现轨迹逐步生成的动态变化。
修改后的完整代码
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np # 逐帧更新3D散点数据 def update_plot(n, X_trj, scatters): # 用set_offsets3d更新三维坐标 scatters[0].set_offsets3d((X_trj[0, :n], X_trj[1, :n], X_trj[2, :n])) scatters[1].set_offsets3d((X_trj[6, :n], X_trj[7, :n], X_trj[8, :n])) scatters[2].set_offsets3d((X_trj[12,:n], X_trj[13, :n], X_trj[14,:n])) return scatters # 创建画布与3D坐标轴 fig = plt.figure() ax = plt.axes(projection='3d') # 初始化散点:只绘制第一个点,避免初始显示全部轨迹 scatters = [] scatters.append(ax.scatter(X_trj[0, :1], X_trj[1, :1], X_trj[2, :1])) scatters.append(ax.scatter(X_trj[6, :1], X_trj[7, :1], X_trj[8, :1])) scatters.append(ax.scatter(X_trj[12, :1], X_trj[13, :1], X_trj[14, :1])) # 设置图表属性 ax.set_title('Trajectory from one-shot optimization (human + drones)') ax.set_xlabel('X Axis') ax.set_ylabel('Y Axis') ax.set_zlabel('Z Axis') # 创建动画:从第1帧开始(n=0无数据),设置帧间隔控制速度 ani = animation.FuncAnimation( fig, update_plot, frames=range(1, X_trj.shape[1]), fargs=(X_trj, scatters), interval=50 # 每帧间隔50毫秒,数值越小动画越快 ) plt.show() # 保存视频需确保已安装ffmpeg,可通过pip install ffmpeg-python安装 ani.save('animation.mp4', writer='ffmpeg')
额外说明
- 保存视频前需确保环境已安装
ffmpeg,否则会报错。 interval参数可按需调整,控制动画播放速度。
内容的提问来源于stack exchange,提问作者Randy Chen
相关产品推荐
相关产品推荐

