How to plot the best fitted ellipse or circle?

21 visualizaciones (últimos 30 días)
Ashfaq Ahmed
Ashfaq Ahmed el 24 de Oct. de 2023
Editada: Matt J el 25 de Oct. de 2023
Hi all,
I have a data set (attached here) that has two arrays. I want to plot them in a polar graph and want to find out the best fitted a) ellipse, and b) circle.
x(:,1) is the x and x(:,2) is the y for the plot.
If anyone can help me out here, I will be very grateful.
xy = load("EllipseData.mat");
x = xy.x(:,1);
y = xy.x(:,2);
plot(x,y,'o')
axis equal
  5 comentarios
Ashfaq Ahmed
Ashfaq Ahmed el 25 de Oct. de 2023
Editada: Ashfaq Ahmed el 25 de Oct. de 2023
Hi @Image Analyst, the secoond option. It would be if they are plotted in the polarplot first and then creating the ellipsoid.
Image Analyst
Image Analyst el 25 de Oct. de 2023
I see you accepted @Matt J's answer. You can adjust/control the approximate number of points within the ellipse by changing the 0.95 in this line of code:
b=boundary(XY,0.95);

Iniciar sesión para comentar.

Respuesta aceptada

Matt J
Matt J el 25 de Oct. de 2023
Editada: Matt J el 25 de Oct. de 2023
The code below uses ellipsoidalFit() from this FEX download,
Is this the kind of thing you are looking for?
xy=load('EllipseData.mat').x;
p=prunecloud(xy);
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
I=all(~isnan(p.Vertices),2);
e=ellipticalFit(p.Vertices(I,:)');
%Display -- EDITED
XY=e.sample(linspace(0,360,1000));
[t,r]=cart2pol(xy(:,1),xy(:,2));
[T,R]=cart2pol(XY{:});
polarplot(t,r,'ob',T,R,'r-')
function [p,XY]=prunecloud(xy)
for i=1:3
D2=max(pdist2(xy,xy,'euclidean','Smallest', 10),[],1);
xy(D2>0.1,:)=[];
end
XY=xy;
b=boundary(XY,0.95);
p=polyshape(XY(b,:));
end
  4 comentarios
Ashfaq Ahmed
Ashfaq Ahmed el 25 de Oct. de 2023
Hi @Matt J, thank you for the suggestion. I can see it is working now. I have a request. Can you please help me plot it on a polar plane?
Matt J
Matt J el 25 de Oct. de 2023
Editada: Matt J el 25 de Oct. de 2023
See my edited answer.

Iniciar sesión para comentar.

Más respuestas (3)

Image Analyst
Image Analyst el 24 de Oct. de 2023

Torsten
Torsten el 24 de Oct. de 2023
Editada: Torsten el 24 de Oct. de 2023
  1. Compute the center of gravity of the point cloud. Call it (x',y').
  2. Compute the point of your point cloud with the greatest distance to (x',y'). Call the distance R.
  3. Define the circle that encloses the point cloud by (x-x')^2 + (y-y')^2 = R^2.
  6 comentarios
Image Analyst
Image Analyst el 25 de Oct. de 2023
I moved @Les Beckham's comment to be an answer.

Iniciar sesión para comentar.


Les Beckham
Les Beckham el 25 de Oct. de 2023
Movida: Image Analyst el 25 de Oct. de 2023
xy = load("EllipseData.mat");
x = xy.x(:,1);
y = xy.x(:,2);
rho = sqrt(x.^2 + y.^2);
theta = atan2(y,x); % <<< use 4 quadrant atan2
polarplot(theta, rho, '.', 'markersize', 3, 'Color', '#aa4488')

Categorías

Más información sobre Scatter Plots en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by