Applying Colormaps to Scatter3 Plots

조회 수: 24 (최근 30일)
Paul
Paul 2024년 3월 6일
댓글: Voss 2024년 3월 7일
I'm trying to plot using scatter3, along with colormaps to understand correlations in my data. Currently, this is what I've developed
At first glance, this might look ok, but if you take a closer look (especially as time increases,) you can see that the control action data points don't follow the colorbar colors as you would expect it to. To help, here's the code I wrote to make the plot.
% Here, variable{xAxisChoice} and its similiar calls are 500 x 3001
% matrices.
c = parula(height(variable{zAxisChoice}));
figure()
hold on; grid on; grid minor; box on;
scatter3(variable{xAxisChoice}, variable{yAxisChoice}, variable{zAxisChoice}, 0.75, c)
xlabel(name{xAxisChoice});
ylabel(name{yAxisChoice});
zlabel(name{zAxisChoice})
title(['Scenario ' num2str(scenarioChoice)])
cb = colorbar('colormap', c);
clim([min(variable{4}, [], 'all'), max(variable{4}, [], 'all')])
ylabel(cb, 'Control Action, u [1/m]','FontSize', 12);
I'd be willing to switch to surf or scatteredInterpolant if that makes it easier to represent. The essential points are that each point can be seen, and that the colormap can be applied.
  댓글 수: 4
Paul
Paul 2024년 3월 6일
Thanks for this contribution @Walter Roberson! Do you have any idea how I could correlate the color of the point to the z-axis?
Walter Roberson
Walter Roberson 2024년 3월 6일
편집: Walter Roberson 2024년 3월 6일
variable = {rand(500,3001),rand(500,3001),rand(500,3001)};
xAxisChoice = 1;
yAxisChoice = 2;
zAxisChoice = 3;
c = variable{zAxisChoice}(:);
figure()
hold on; grid on; grid minor; box on;
scatter3(variable{xAxisChoice}(:), variable{yAxisChoice}(:), variable{zAxisChoice}(:), 0.75, c)
view(3)
colormap(parula)

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

채택된 답변

Voss
Voss 2024년 3월 6일
"Do you have any idea how I could correlate the color of the point to the z-axis?"
If that's what you want to do, the easy way is to set the figure or axes colormap, and use the Z-variable as the color input to scatter3:
variable = {25+15*rand(500,3001),300*rand(500,3001),-2.5e-4*rand(500,3001)};
xAxisChoice = 1;
yAxisChoice = 2;
zAxisChoice = 3;
name = {'Density \rho [cars/km]','Time t[s]','Control Action, u [1/m]'};
c = parula(height(variable{zAxisChoice}));
figure('Colormap',c)
hold on; grid on; grid minor; box on;
scatter3(variable{xAxisChoice}(:), variable{yAxisChoice}(:), variable{zAxisChoice}(:), 0.75, variable{zAxisChoice}(:))
xlabel(name{xAxisChoice});
ylabel(name{yAxisChoice});
zlabel(name{zAxisChoice});
cb = colorbar();
clim([min(variable{zAxisChoice}, [], 'all'), max(variable{zAxisChoice}, [], 'all')])
ylabel(cb, name{zAxisChoice},'FontSize', 12);
view(3)
  댓글 수: 3
Paul
Paul 2024년 3월 7일
Great! I got this to work with my data. I've accepted the answer because it answers exactly what I asked, but I have one more question - if length(variable{yAxisChoice}(:)) ~= length(variable{xAxisChoice}(:)) or length(variable{zAxisChoice}(:)), how could I change the code to help it handle that case?
Voss
Voss 2024년 3월 7일
You're welcome!
In case variable{xAxisChoice} et al are not all the same size, I would go by the smallest one and truncate the others for plotting. Something like this:
[mx,nx] = size(variable{xAxisChoice});
[my,ny] = size(variable{yAxisChoice});
[mz,nz] = size(variable{zAxisChoice});
m = min([mx,my,mz]);
n = min([nx,ny,nz]);
X = variable{xAxisChoice}(1:m,1:n);
Y = variable{yAxisChoice}(1:m,1:n);
Z = variable{zAxisChoice}(1:m,1:n);
scatter3(X(:), Y(:), Z(:), 0.75, Z(:))

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Color and Styling에 대해 자세히 알아보기

제품


릴리스

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by