同时绘制多个点

时间:2016-04-20 12:30:53

标签: matlab

首先我要说的是,我怀疑这是一个非常简单的解决方案,我几乎不知道。

我正在尝试编写一个脚本,该脚本将在四个独立的子图中绘制一组数据(每个子图显示一个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之后吗?

1 个答案:

答案 0 :(得分:1)

实际上,您目前只在每个时刻为一个标记更新XDataYDataZData。相反,您想要摆脱内部循环并获得xyz变量的数组。然后,您可以将这些内容用于scatter3来电,以及更新XDataYDataZData

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