![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/188648/image.jpeg)
How to fit hyperbola to scatter plot?
7 views (last 30 days)
Show older comments
ishita agrawal
on 22 Sep 2017
Answered: Ameer Hamza
on 20 May 2018
I have attached data I want to fit with hyperbola. As you can see in attached picture, the fit is appearing behind the scattered plot, however, I want it above the scatter plot. Here is the code I am using,
XLSdatafile = 'b46.csv';
XLIM = [0.4 0.24 ]; % beginning/end of yellow selection region
YLIM = [0.12 0.4 ]; % beginning/end of yellow selection region
INITIAL_FIT_GUESS = 0.0200; % initial ecd guess
INITIAL_2FIT_GUESS = 2.35 * INITIAL_FIT_GUESS;
if ~exist('XLSdatafile_loaded','var') || ~strcmp(XLSdatafile, XLSdatafile_loaded)
M = load(XLSdatafile);
XLSdatafile_loaded = XLSdatafile;
X = M(:,1);
Y = M(:,2);
end
f3=figure;
bins=75;
xi = linspace(min(X(:)),max(X(:)),bins);
yi = linspace(min(Y(:)),max(Y(:)),bins);
xr = interp1(xi,1:numel(xi),X,'nearest')';
yr = interp1(yi,1:numel(yi),Y,'nearest')';
scatter2dheat = log10(accumarray([xr' yr'], 1, [bins bins]));
scatter2dheat(isinf(scatter2dheat))=0; % replace inf with 0
pp3 = surf(xi,yi,scatter2dheat');
%this is a nice colormap
colormap([1 1 1;0.949999988079071 1 1;0.899999976158142 1 1;0.850000023841858 1 1;0.800000011920929 1 1;0.75 1
1;0.699999988079071 1 1;0.649999976158142 1 1;0.600000023841858 1 1;0.550000011920929 1 1;0.5 1 1;0.449999988079071 1
1;0.400000005960464 1 1;0.349999994039536 1 1;0.300000011920929 1 1;0.25 1 1;0.200000002980232 1 1;0.150000005960464 1
1;0.100000001490116 1 1;0.0500000007450581 1 1;0 1 1;0.0476190485060215 1 0.952380955219269;0.095238097012043 1
0.904761910438538;0.142857149243355 1 0.857142865657806;0.190476194024086 1 0.809523820877075;0.238095238804817 1
0.761904776096344;0.28571429848671 1 0.714285731315613;0.333333343267441 1 0.666666686534882;0.380952388048172 1
0.61904764175415;0.428571432828903 1 0.571428596973419;0.476190477609634 1 0.523809552192688;0.523809552192688 1
0.476190477609634;0.571428596973419 1 0.428571432828903;0.61904764175415 1 0.380952388048172;0.666666686534882 1
0.333333343267441;0.714285731315613 1 0.28571429848671;0.761904776096344 1 0.238095238804817;0.809523820877075 1
0.190476194024086;0.857142865657806 1 0.142857149243355;0.904761910438538 1 0.095238097012043;0.952380955219269 1
0.0476190485060215;1 1 0;1 0.954545438289642 0;1 0.909090936183929 0;1 0.863636374473572 0;1 0.818181812763214 0;1
0.772727251052856 0;1 0.727272748947144 0;1 0.681818187236786 0;1 0.636363625526428 0;1 0.590909063816071 0;1
0.545454561710358 0;1 0.5 0;1 0.454545468091965 0;1 0.409090906381607 0;1 0.363636374473572 0;1 0.318181812763214 0;1
0.272727280855179 0;1 0.227272734045982 0;1 0.181818187236786 0;1 0.136363640427589 0;1 0.0909090936183929 0;1
0.0454545468091965 0;1 0 0]);
set(gca,'Clim',[max(min(scatter2dheat(:)),1e-3) max(scatter2dheat(:))]);
view(2)
grid off
shading flat
axis([min(X) max(X) min(Y) max(Y)]);
hold on
fit_const = INITIAL_FIT_GUESS;
time = 0.01:0.001:0.3;
current = fit_const./time;
figure(f3)
hold on
p_fit1 = plot(time,current,'r-');
set(gca,'ylim',[0.05,0.5]);
hold on
fit_const = INITIAL_2FIT_GUESS;
time = 0.01:0.001:0.5;
current = fit_const./time;
figure(f3)
hold on
p_fit1 = plot(time,current,'r-');
Hyperbola fit is my only choice. Could anyone suggest a fitting code?
0 Comments
Accepted Answer
Ameer Hamza
on 20 May 2018
The problem is happening because you are viewing 3D plot from a 2D projection. In order to bring the line to the front, you need to give them z values greater the then the scatter plot points. You can use the following code to get the desired results
XLSdatafile = 'b46.csv';
XLIM = [0.4 0.24 ]; % beginning/end of yellow selection region
YLIM = [0.12 0.4 ]; % beginning/end of yellow selection region
INITIAL_FIT_GUESS = 0.0200; % initial ecd guess
INITIAL_2FIT_GUESS = 2.35 * INITIAL_FIT_GUESS;
if ~exist('XLSdatafile_loaded','var') || ~strcmp(XLSdatafile, XLSdatafile_loaded)
M = load(XLSdatafile);
XLSdatafile_loaded = XLSdatafile;
X = M(:,1);
Y = M(:,2);
end
f3=figure;
bins=75;
xi = linspace(min(X(:)),max(X(:)),bins);
yi = linspace(min(Y(:)),max(Y(:)),bins);
xr = interp1(xi,1:numel(xi),X,'nearest')';
yr = interp1(yi,1:numel(yi),Y,'nearest')';
scatter2dheat = log10(accumarray([xr' yr'], 1, [bins bins]));
scatter2dheat(isinf(scatter2dheat))=0; % replace inf with 0
pp3 = surf(xi,yi,scatter2dheat');
set(gca,'Clim',[max(min(scatter2dheat(:)),1e-3) max(scatter2dheat(:))]);
view(2)
grid off
shading flat
axis([min(X) max(X) min(Y) max(Y)]);
hold on
fit_const = INITIAL_FIT_GUESS;
time = 0.01:0.001:0.3;
current = fit_const./time;
figure(f3)
hold on
p_fit1 = plot3(time,current, max(max(scatter2dheat))*ones(size(time)),'r-', 'LineWidth', 4);
hold on
fit_const = INITIAL_2FIT_GUESS;
time = 0.01:0.001:0.5;
current = fit_const./time;
figure(f3)
hold on
p_fit2 = plot3(time,current, max(max(scatter2dheat))*ones(size(time)), 'r-','LineWidth', 4);
I have removed the colormap to keep code compact. You can add a color map of your choice.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/188648/image.jpeg)
0 Comments
More Answers (0)
See Also
Categories
Find more on Scatter Plots in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!