46 views (last 30 days)
Show older comments
Fabio Taccaliti on 20 Apr 2022
Commented: Star Strider on 20 Apr 2022
Accepted Answer: Star Strider
Open in MATLAB Online
Hello,
I would like to create an animated 3D scatter plot that is plotting the points included in the sub-array of a cell DD (102x1 cell), each sub-array is a 29x4 (where the last three column are the 3 coordinates (x,y.z)). Here below an example of my cell and sub-array.
M = [[0;0.2;0.2;0.4;0.6;0.6;0.6],rand(7,3)]
D = diff(find([1;diff(M(:,1));1]));
DD = mat2cell(M,D,4);
DD{:}
The animated scatter should display together each subarray points and then in a subsequent time step the next subarray points.
Here below the code that alreay plot all the points together.
figure(1)
for i = 1:numel(DD)
hold on; grid on; grid minor; axis equal;
set(gcf, 'Color', 'White');
set(gca, 'Fontsize', 12);
set(gca, 'ZDir','reverse')
scatter3(DD{i}(:,2),DD{i}(:,3),DD{i}(:,4))
view(3)
xlabel('x [mm]')
ylabel('y [mm]')
zlabel('z [mm]')
end
Thanks in advance
0 Comments Show -2 older commentsHide -2 older comments
Show -2 older commentsHide -2 older comments
Sign in to comment.
Sign in to answer this question.
Accepted Answer
Star Strider on 20 Apr 2022
Open in MATLAB Online
Try this slightly augmented version —
figure(1)
hold on
grid minor
axis([0 2 0 2 0 2])
for i = 1:numel(DD)
view(3)
set(gcf, 'Color', 'White');
set(gca, 'Fontsize', 12);
set(gca, 'ZDir','reverse')
scatter3(DD{i}(:,2),DD{i}(:,3),DD{i}(:,4))
grid on
axis([0 2 0 2 0 2])
drawnow
pause(0.25)
xlabel('x [mm]')
ylabel('y [mm]')
zlabel('z [mm]')
end
hold off
It fixes the axis limits and adds drawnow and pause to create the animation.
Experiment to get the desired results.
.
6 Comments Show 4 older commentsHide 4 older comments
Show 4 older commentsHide 4 older comments
Fabio Taccaliti on 20 Apr 2022
Direct link to this comment
https://matlabcentral.mathworks.com/matlabcentral/answers/1700565-animated-3d-scatter-plot#comment_2112910
Thanks a lot for the answer, the problem is that I would like to have axis equal on my plot but then in order to have it I need the hold on command and this involves that I will plot all the sub-array on top of each other without 'cleaning' the plot each time and plot just one sub-array each time with the 0.25s pause.
Do you know how can I fix it?
Star Strider on 20 Apr 2022
Direct link to this comment
https://matlabcentral.mathworks.com/matlabcentral/answers/1700565-animated-3d-scatter-plot#comment_2113070
Open in MATLAB Online
My pleasure.
When I run the code I posted, the plot does not ‘clear’. All the points are plotted and remain visible, with new ones appearing in each interation of the loop.
Add the axis equal call after the first axis call —
figure(1)
hold on
grid minor
axis([0 2 0 2 0 2])
axis equal
for i = 1:numel(DD)
view(3)
set(gcf, 'Color', 'White');
set(gca, 'Fontsize', 12);
set(gca, 'ZDir','reverse')
scatter3(DD{i}(:,2),DD{i}(:,3),DD{i}(:,4))
grid on
axis([0 2 0 2 0 2])
drawnow
pause(0.25)
xlabel('x [mm]')
ylabel('y [mm]')
zlabel('z [mm]')
end
hold off
Both of the axis calls are necessary.
.
Fabio Taccaliti on 20 Apr 2022
Direct link to this comment
https://matlabcentral.mathworks.com/matlabcentral/answers/1700565-animated-3d-scatter-plot#comment_2113505
⋮
Sorry maybe from what I wrote was not clear.
I would like that the plot 'clear' each iteration without showing the one from the previous.
Now from this code the axis remain equal that is perfect, but still all the points are plotted and remain visible (which I would like to avoid ) and show just the point for each iteration.
I tried several combination of hold on and hold off but still nothing.
Star Strider on 20 Apr 2022
Direct link to this comment
https://matlabcentral.mathworks.com/matlabcentral/answers/1700565-animated-3d-scatter-plot#comment_2113605
Open in MATLAB Online
To do that, remove the hold calls —
figure(1)
grid minor
axis([0 2 0 2 0 2])
axis equal
for i = 1:numel(DD)
view(3)
set(gcf, 'Color', 'White');
set(gca, 'Fontsize', 12);
set(gca, 'ZDir','reverse')
scatter3(DD{i}(:,2),DD{i}(:,3),DD{i}(:,4), 'filled')
grid on
axis([0 2 0 2 0 2])
drawnow
pause(0.25)
xlabel('x [mm]')
ylabel('y [mm]')
zlabel('z [mm]')
end
.
Fabio Taccaliti on 20 Apr 2022
Direct link to this comment
https://matlabcentral.mathworks.com/matlabcentral/answers/1700565-animated-3d-scatter-plot#comment_2113895
Thanks a lot, now it works :)
Star Strider on 20 Apr 2022
Direct link to this comment
https://matlabcentral.mathworks.com/matlabcentral/answers/1700565-animated-3d-scatter-plot#comment_2113955
As always, my pleasure!
Sign in to comment.
More Answers (1)
Steven Lord on 20 Apr 2022
Open in MATLAB Online
Rather than recreating the scatter plot each time, I'd apply the first of the techniques listed on the Animation Techniques documentation page. If I ran this in MATLAB Answers you wouldn't see the animation, but if you run it in MATLAB you can.
% Sample data
theta = 0:15:360;
x = cosd(theta);
y = sind(theta);
% Create the initial "frame" of the animation
h = scatter(x, y, 'o');
% Control the axes so at its "widest" the whole circle still fits
axis([-5 5 -5 5])
% Make it look circular
axis equal
% At each frame, push each point outward (or pull it inwards)
for r = repmat([1:5 4:-1:2], 1, 10)
% Update the existing object's properties rather than creating a new one
h.XData = r*x;
h.YData = r*y;
% Let you see the animation
pause(0.1)
end
In the "real" animation you might want to use one of the options for drawnow instead of pause.
1 Comment Show -1 older commentsHide -1 older comments
Show -1 older commentsHide -1 older comments
Fabio Taccaliti on 20 Apr 2022
Direct link to this comment
https://matlabcentral.mathworks.com/matlabcentral/answers/1700565-animated-3d-scatter-plot#comment_2113900
Thanks Steven, I'll have a better look into this :)
Sign in to comment.
Sign in to answer this question.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français
- United Kingdom(English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)
Contact your local office