generate a 3d scatter plot with z-support lines / pin plot / needle plot ...

조회 수: 2 (최근 30일)
Andres
Andres 2024년 12월 10일
댓글: Star Strider 2024년 12월 11일
I'd like to plot scattered 3d data. To enhance readability, I want to add support lines in z-direction ("needles") to the data points with matching colors, see the image below.
Is there a specific name for such a plot?
To generate the chart, I used the code below with a for loop. I wonder if you have ideas how to simplify the code.
X = rand(20, 3);
f = figure;
hsc = scatter3(X(:,1),X(:,2),X(:,3), 20, X(:,3));
cmap = colormap('cool');
axis tight
xlabel("x"), ylabel("y"), zlabel("z")
title('needle plot')
box on
hold on
% draw support lines ("needles")
zlo = zlim*[1;0];
c_inter_fun = @(x) ...
interp1(linspace(zlo, zlim*[0;1], length(cmap)).' , cmap, x);
for k = 1:numel(hsc.XData)
plot3(hsc.XData(k)*[1 1], ...
hsc.YData(k)*[1 1], ...
[zlo, hsc.ZData(k)], ...
Color=c_inter_fun(hsc.ZData(k)));
end

채택된 답변

Star Strider
Star Strider 2024년 12월 10일
See if the stem3 function will do what you want.
You will probably still have to use a loop of you want the individual stems and markers to be different colours, since the stem plots do not offer those options.
X = rand(20, 3);
f = figure;
hsc = stem3(X(:,1),X(:,2),X(:,3));
cmap = colormap('cool');
axis tight
xlabel("x"), ylabel("y"), zlabel("z")
title('needle plot')
box on
cm = cool(size(X,1));
f = figure;
hold on
for k = 1:size(X,1)
hsc = stem3(X(k,1),X(k,2),X(k,3), 'filled', Color=cm(k,:));
end
hold off
cmap = colormap('cool');
axis tight
xlabel("x"), ylabel("y"), zlabel("z")
title('needle plot')
box on
grid on
view(-27,30)
% hold on
% draw support lines ("needles")
% zlo = zlim*[1;0];
% c_inter_fun = @(x) ...
% interp1(linspace(zlo, zlim*[0;1], length(cmap)).' , cmap, x);
% for k = 1:numel(hsc.XData)
% plot3(hsc.XData(k)*[1 1], ...
% hsc.YData(k)*[1 1], ...
% [zlo, hsc.ZData(k)], ...
% Color=c_inter_fun(hsc.ZData(k)));
% end
.
  댓글 수: 10
Andres
Andres 2024년 12월 11일
편집: Andres 2024년 12월 11일
If you just want to sort the colormap values along the z-value, you don't need to interpolate.
Two sorts
[~, si] = sort(X(:,3));
[~, si] = sort(si);
cm = cmap(si,:);
or one unique
[~, ~, si] = unique(X(:,3));
cm = cmap(si,:);
would do.
As I want to link the colormap values linearly to the z-value, the explicit interpolation seems unavoidable.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Jacob Mathew
Jacob Mathew 2024년 12월 10일
Hey Andres,
You can use stem3 to achieve the effect you want. Here is an example:
X = rand(20, 3);
figure;
hold on;
% Create stem plot (needles)
stem3(X(:,1), X(:,2), X(:,3), 'Color', 'k');
% Customize plot
colormap('cool');
axis tight;
xlabel('x');
ylabel('y');
zlabel('z');
title('Needle Plot');
box on;
view(45,45); % To view the plot from a angle since plot is not interactive below
You can refer to the documentation of stem3 below:

카테고리

Help CenterFile Exchange에서 Graphics Performance에 대해 자세히 알아보기

제품


릴리스

R2024b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by