【问题标题】:Plot Multiple Points Simultaneously同时绘制多个点
【发布时间】:2016-04-20 12:30:52
【问题描述】:

首先让我说我怀疑这是一个非常简单的解决方案,我几乎没有错过它。

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

【问题讨论】:

    标签: matlab


    【解决方案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
    

    【讨论】:

    • 哇,这不仅有效,而且看起来非常好,让我的情节看起来完全符合我的要求。我知道这是沿着这些思路 - 将所有点存储在一个 xyz 数组中 - 但无论出于何种原因,我都无法思考如何准确地完成它。非常感谢,伙计,我真的很感激!
    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多