如何在Julia中绘制多个3D轨迹(大概使用for循环?) - 还有,如何随着时间的推移制作动画?



我正在尝试在Julia的单个绘图中绘制一组3D轨迹。我所说的3-D轨迹是指:随着时间的推移,不同的3-D坐标集。这些轨迹存储在一个称为positions的多维数组中,其中维度分别对应于Trajectory IDX-Y-Z coordinateTime。例如,positions[75,2,1:100]是指第 75 条轨迹的 Y(第 2 个(坐标,跨越轨迹的前 100 个时间步长。

我试图弄清楚为什么以下代码不起作用:

using Plots
plotlyjs()
time_indices = 1:100
ax= scatter3d(positions[1,1,time_indices],positions[1,2,time_indices],positions[1,3,time_indices],label="Trajectory 1 for times 1 to 100")
for n in 2:size(positions,1)
scatter3d!(ax, positions[n,1,time_indices], positions[n,2,time_indices],positions[n,3,time_indices],label="Trajectory $n for times 1 to 100")
end

当我运行该代码时,我在"绘图"窗口中看不到任何内容(我使用的是 Atom(,尽管我没有收到任何错误/它似乎成功运行。对我做错了什么有什么想法吗?我应该使用不同的后端吗?它不适用于gr()plotlyjs()(根据我完成的教程,这些是我所知道的唯一一个(。

后续问题:一旦我可以在单个静态图中成功绘制此类 3D 轨迹,我想知道您将如何随着时间的推移对它们进行动画处理(大概使用@gif@animate宏(?我在这里问这个问题,因为不幸的是,我无法理解有关 3D 动画的文档/教程。谷歌搜索/其他来源也无济于事:(

看起来你只是在循环之后的最后错过了一个display(ax)

编辑:要制作动画,请尝试

anim = @animate for n in 1:size(positions,1)
scatter3d(positions[n,1,time_indices], positions[n,2,time_indices],positions[n,3,time_indices],label="Trajectory $n for times 1 to 100")
end
gif(anim, "some_file_name.gif", fps=15)

(或者,如果您希望先前的轨迹也显示在 GIF 的后续帧中,请将scatter3d替换为scatter3d!(

如果没有您的positions,我无法测试上述内容,但这是我刚刚在 Julia 1.5.0beta 上使用绘图和 GR 后端测试的另一个示例:

using Plots; gr();
anim = @animate for i=1:100
plot(sin.(range(0,i/10*pi,length=1000)), label="", ylims=(-1,1))
end
gif(anim, "anim_fps15.gif", fps=15)

如何做第二位(动画 - 请参阅接受答案的评论中的详细信息(:

gr()
anim = @animate for t in time_indices
all_positions_t = positions[:,:,t] # positions of all trajectories at time t
scatter3d(all_positions_t[:,1], all_positions_t[:,2],all_positions_t[:,3],label="")
end
gif(anim, "some_file_name.gif", fps=15)

最新更新