首先我要说的是,我怀疑这是一个非常简单的解决方案,我几乎不知道。
我正在尝试编写一个脚本,该脚本将在四个独立的子图中绘制一组数据(每个子图显示一个3D形状的不同视图,这些点正在绘制),但我只想显示当前的点 - 就像我一样,我不想看到每个点,只是随着时间的推移只有一组点(我正在捕捉情节的视频以随时间观察运动)。但是,对于每个时刻,都会有 n 点同时绘制。我知道这应该很简单,但我不能设法让所有 n 点同时进行绘制 - 我似乎只能让它一次绘制一个点,这在以下情况下毫无意义你有 n 标记随时间移动,所有这些标记你想要同时移动。
以下代码用于按顺序绘制每个点,但不会将所有 n 点绘制在一起,为每个 t 刷新这些点:
n = 0;
for i = 1:length(data)
% every marker occurs in one row of a specific set of data, and is split
% into x, y, z, so I correct here for each marker being every 3rd column
for j = 1:(cind/3) % cycle through every marker
x = markerLoc(i, j*3 - 2);
y = markerLoc(i, j*3 - 1);
z = markerLoc(i, j*3);
if j == 1 && i == 1 % set up the initial plots for each subplot
% s1,2,3,4 are the handles for the subplots
h1 = scatter3(s1,x, y, z, 'MarkerFaceColor', [0 .75 .75],...
'MarkerEdgeColor','k');
h2 = scatter3(s2,x, y, z, 'MarkerFaceColor', [0 .75 .75],...
'MarkerEdgeColor','k');
h3 = scatter3(s3,x, y, z, 'MarkerFaceColor', [0 .75 .75],...
'MarkerEdgeColor','k');
h4 = scatter3(s4,x, y, z, 'MarkerFaceColor', [0 .75 .75],...
'MarkerEdgeColor','k');
else % update data
% this is probably insanely redundant
set(h1, 'XData', x, 'YData', y, 'ZData', z);
set(h2, 'XData', x, 'YData', y, 'ZData', z);
set(h3, 'XData', x, 'YData', y, 'ZData', z);
set(h4, 'XData', x, 'YData', y, 'ZData', z);
end
end
frames(n) = getframe(gcf); % capture frames
n = n + 1;
end
任何人都可以帮助找到我需要更改的内容以使其成为情节,而不是在每个j(个别标记)之后,在第n个j之后吗?
答案 0 :(得分:1)
实际上,您目前只在每个时刻为一个标记更新XData
,YData
和ZData
。相反,您想要摆脱内部循环并获得x
,y
和z
变量的数组。然后,您可以将这些内容用于scatter3
来电,以及更新XData
,YData
和ZData
。
for i = 1:length(data)
%// Get XYZ coordinates for all markers at this time and reshape so X,Y,Z are rows
xyz = reshape(markerLoc(i,:), 3, []);
if i == 1
%// Put these in an array so we can update them easier
h(1) = scatter3(s1, xyz(1,:), xyz(2,:), xyz(3,:), ...
'MarkerFaceColor', [0 .75 .75],...
'MarkerEdgeColor','k');
%// Just use copyobj to make a copy of this plot to all axes
h(2:4) = copyobj(h(1), [s2, s3, s4]);
else
set(h, 'XData', xyz(1,:), 'YData', xyz(2,:), 'ZData', xyz(3,:))
end
end