簡體   English   中英

如何通過在R或MATLAB中一次添加每個點來對3D散點圖進行動畫處理

[英]How to animate 3D scatter plot by adding each point at a time in R or MATLAB

在這里有一組3D坐標。 數據具有52170行和4列。 每行代表一個點。 第一列是點索引號,從1增加到52170。第二列到第四列分別是x,y和z軸的坐標。 前10行如下:

seq    x               y        z
1   7.126616    -102.927567 19.692112
2   -10.546907  -143.824966 50.77417
3   7.189214    -107.792068 18.758278
4   7.148852    -101.784027 19.905006
5   -14.65788   -146.294952 49.899158
6   -37.315742  -116.941185 12.316169
7   8.023512    -103.477882 19.081482
8   -14.641933  -145.100098 50.182739
9   -14.571636  -141.386322 50.547684
10  -15.691803  -145.66481  49.946281

我想創建一個3D散點圖,其中使用R或MATLAB將每個點依次添加到該點。 首先添加由第一條線表示的點,然后再添加由第二條線表示的點,一直到最后一個點。

另外,我希望控制添加點的速度。

對於二維散點圖,我可以使用以下代碼:

 library(gganimate)
 x <- rnorm(50, 5, 1)
 y <- 7*x +rnorm(50, 4, 4)
 ind <- 1:50
 data <- data.frame(x, y, ind)

ggplot(data, aes(x, y)) + geom_point(aes(group = seq_along(x))) + transition_reveal(ind)

但是我找不到有關如何針對3D散點圖執行此操作的信息。 誰能告訴我該怎么做? 謝謝。

這是MATLAB的答案

通常,可以使用相同的方法對圖(或3d圖,散點圖,曲面或其他圖形對象)進行動畫處理:

  • 進行第一個plot / plot3 / scatter / surf,並獲取其句柄。 第一個圖可以包含第一個“初始”點集,甚至可以是空的(使用NaN值創建帶有不可見數據點的圖)。
  • 設置軸限制以及將要固定的所有其他可視化選項(視點,攝像機角度,閃電...)。 無需設置在動畫過程中會引起爭議的選項。
  • 在一個循環中,更新的最小集劇情對象的屬性: XDataYDataZData如果3D繪圖, CData ,如果劇情對象有一些你想動畫的顏色)。

以下代碼是適合您的情況的上述方法的實現:

%% Read data and place coordinates in named variables
csvfile = '3D scatter plot.csv' ;
data = csvread(csvfile,2) ;
% [optional], just to simplify notations further down
x = data(:,2) ;
y = data(:,3) ;
z = data(:,4) ;

%% Generate empty [plot3] objects
figure
% create an "axes" object, and retrieve the handle "hax"
hax = axes ;
% create 2 empty 3D point plots:
% [hp_new]   will contains only one point (the new point added to the graph)
% [hp_trail] will contains all the points displayed so far
hp_trail  = plot3(NaN,NaN,NaN,'.b','Parent',hax,'MarkerSize',2) ;
hold on
hp_new    = plot3(NaN,NaN,NaN,'or','Parent',hax,'MarkerSize',6,'MarkerEdgeColor','r','MarkerFaceColor','g','LineWidth',2) ;
hold off

%% Set axes limits (to limit "wobbling" during animation)
xl = [min(x) max(x)] ;
yl = [min(y) max(y)] ;
zl = [min(z) max(z)] ;
set(hax, 'XLim',xl,'YLim',yl,'ZLim',zl)

view(145,72)    % set a view perspective (optional)

%% Animate
np = size(data,1) ;

for ip=1:np
    % update the "new point" graphic object
    set( hp_new , 'XData',x(ip), 'YData',y(ip), 'ZData',z(ip) )

    % update the "point history" graphic object
    % we will display points from index 1 up to the current index ip
    % (minus one) because the current index point is already displayed in
    % the other plot object
    indices2display = 1:ip-1 ;
    set(hp_trail ,...
        'XData',x(indices2display), ...
        'YData',y(indices2display), ...
        'ZData',z(indices2display) )

    % force graphic refresh
    drawnow

    % Set the "speed"
    % actually the max speed is given by your harware, so we'll just set a
    % short pause in case you want to slow it down
    pause(0.01) % <= comment this line if you want max speed
end

這將產生:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM