You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

问题原因

  1. 3D散点更新方法错误:set_offsets()是专门给2D散点图设计的更新接口,3D场景下必须使用set_offsets3d()来更新三维坐标数据。
  2. 初始绘制了全部轨迹:初始化散点时直接渲染了所有帧的轨迹点,后续帧更新无法体现轨迹逐步生成的动态变化。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:05:31