I have a 3D scatter plot that I want to have a planar fit. How do you do this?
x = [14.9 1.7 0.0 10.9 0.0];
y = [11.3 9.1 23.7 12.8 2.9];
z = [5.32787E-17 2.93234E-16 2.09997E-16 5.45E-17 4.55E-16];
scatter3(x,y,z)
3D Scatter Plot.jpg

 채택된 답변

Star Strider
Star Strider 2019년 3월 7일

1 개 추천

A simple linear regression is straightforward:
x = [14.9 1.7 0.0 10.9 0.0];
y = [11.3 9.1 23.7 12.8 2.9];
z = [5.32787E-17 2.93234E-16 2.09997E-16 5.45E-17 4.55E-16];
B = [x(:) y(:) ones(size(x(:)))] \ z(:);
xv = linspace(min(x), max(x), 10)';
yv = linspace(min(y), max(y), 10)';
[X,Y] = meshgrid(xv, yv);
Z = reshape([X(:), Y(:), ones(size(X(:)))] * B, numel(xv), []);
scatter3(x,y,z, 'filled')
hold on
mesh(X, Y, Z, 'FaceAlpha', 0.5)
hold off
view(-120, 35)
title(sprintf('Z = %+.3E\\cdotX %+.3E\\cdotY %+.3E', B))
producing:
Plane Fitting a 3D Scatter Plot - 2019 03 06.png

댓글 수: 6

Sarah
Sarah 2019년 3월 7일
Two Questions:
  1. Is there a way to visually indicate the distance or "error" between the measured points and the fit plane?
  2. How would you calculate and display the coefficient of determination (R^2) on the graph?
Try this:
x = [14.9 1.7 0.0 10.9 0.0];
y = [11.3 9.1 23.7 12.8 2.9];
z = [5.32787E-17 2.93234E-16 2.09997E-16 5.45E-17 4.55E-16];
B = [x(:) y(:) ones(size(x(:)))] \ z(:);
xv = linspace(min(x), max(x), 50)';
yv = linspace(min(y), max(y), 50)';
[X,Y] = meshgrid(xv, yv);
Z = reshape([X(:), Y(:), ones(size(X(:)))] * B, numel(xv), []);
Ze = [x(:) y(:) ones(size(x(:)))] * B; % Calculate Surface At Each Data Triplet
Err = Ze - z(:); % Calculate Errors
SStot = sum((z - mean(z)).^2); % Total Sum-Of-Squares
SSres = sum(Err.^2); % Residual Sum-Of-Squares
Rsq = 1 - SSres/SStot; % Coefficient Of Determination
figure
surf(X, Y, Z, 'FaceAlpha', 0.5, 'EdgeColor','none')
hold on
plot3([x; x], [y; y], [z(:) Ze]', '-r', 'LineWidth',1) % Plot Errors (Red Lines From Surface To Data)
scatter3(x,y,z, 'filled')
hold off
view(-120, 35)
xlabel('X')
ylabel('Y')
zlabel('Z')
% title(sprintf('Z = %+.3E\\cdotX %+.3E\\cdotY %+.3E', B))
title('Z = -2.0998\times10^{-17}X - 1.135\times10^{-17}Y + 4.644\times10^{-16}')
text(10, 20, 3.5E-16, sprintf('R^2 = %0.3f', Rsq))
I tweaked my previous code slightly to incorporate the additions you requested. I also manually entered the title string, with the same data as previously. The first one still works, this one is easier to read.
Experiment to get the result you want.
The updated plot:
Plane Fitting a 3D Scatter Plot (2) - 2019 03 06.png
Sarah
Sarah 2019년 3월 7일
Wonderful!!
Star Strider
Star Strider 2019년 3월 7일
As always, my pleasure!
Damla Yüksel
Damla Yüksel 2019년 12월 1일
Hello, in the following line, matlab returns an error:
"Error using plot3
Vectors must be the same length.
Error in (line 33)
plot3([x; x], [y; y], [z(:) Ze]', '-r','LineWidth',1) % Plot Errors (Red Lines From Surface To Data)"
What should I do for this error?
Star Strider
Star Strider 2019년 12월 1일
You should make the vectors the same length!
It is best for you to post this as a new Question, supplying ‘x’, ‘y’, ‘z’ and ‘Ze’.
Your Comment does not relate to the substance of this thread, so I will delete it (and my Comment here) in a few yours.

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

추가 답변 (1개)

KSSV
KSSV 2019년 3월 7일

0 개 추천

x = [14.9 1.7 0.0 10.9 0.0];
y = [11.3 9.1 23.7 12.8 2.9];
z = [5.32787E-17 2.93234E-16 2.09997E-16 5.45E-17 4.55E-16];
nx = 10 ; ny = 10 ;
xi = linspace(min(x),max(x),nx) ;
yi = linspace(min(y),max(y),ny) ;
[X,Y] = meshgrid(xi,yi) ;
F = scatteredInterpolant(x',y',z') ;
Z = F(X,Y) ;
scatter3(x,y,z)
hold on
surf(X,Y,Z)

카테고리

도움말 센터File Exchange에서 Line Plots에 대해 자세히 알아보기

제품

질문:

2019년 3월 7일

댓글:

2019년 12월 1일

Community Treasure Hunt

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

Start Hunting!

Translated by