Good Day,
Please how do I add trendline(s) to a certain straight line portion(s) of a plot and how to extend the trendline to touch y and or x axis and the y and or x axis value determined?
Another related question is that how do I insert horizontal line on a plot and extend it to touch y axis and the y axis value determined?
Thanks
Best regards,
Isa

 Réponse acceptée

Image Analyst
Image Analyst le 23 Déc 2012

1 vote

I'd fit the portion of the data you're interested in to a line using polyfit. Then use polyval to get the points on the line over the entire range that you're interested in. See this demo:
clc; % Clear the command window.
workspace; % Make sure the workspace panel is showing.
format longg;
format compact;
fontSize = 20;
% Define equation.
x = -2:20;
y = (x-2).^2;
% Plot it
plot(x,y, 'bo-', 'LineWidth', 3);
grid on;
title('y = (x-2).^2', 'FontSize', fontSize);
xlabel('X', 'FontSize', fontSize);
ylabel('Y', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Give a name to the title bar.
set(gcf,'name','Demo by ImageAnalyst','numbertitle','off')
% Fit the range fro 10 to 20 with a line.
limitedRange = 10:20;
coeffs = polyfit(x(limitedRange), y(limitedRange), 1)
% Define the range where we want the line
xFitting = 0:19; % Or wherever...
yFitted = polyval(coeffs, xFitting);
% Plot the fitted line over the specified range.
hold on; % Don't blow away prior plot
plot(xFitting, yFitted, 'ro-', 'LineWidth', 2);
legend('Original Data', 'Line Fit');

12 commentaires

Image Analyst
Image Analyst le 24 Déc 2012
Isa, did that work for you?
Isa Isa
Isa Isa le 26 Déc 2012
I am still having problem with it. I tried using your code but Trendline was shown in the legend but not on the plot where I want it. My data as below x=[ 0 0.2762 0.3488 0.4052 0.5242 0.5806 0.6129 0.6431 0.6673 0.6976 0.7238 0.7520 0.7944 0.8448]; y=[ 0 0.0230 0.0370 0.0480 0.0760 0.0900 0.1000 0.1180 0.1380 0.1600 0.1860 0.2130 0.2880 0.4010]; I want the trendline at y range between y(9) to y(14).
Thanks Isa
I just put your data into my demo and got this. Is this what you want?
clc; % Clear the command window.
workspace; % Make sure the workspace panel is showing.
format longg;
format compact;
fontSize = 20;
% Define equation.
x=[ 0 0.2762 0.3488 0.4052 0.5242 0.5806 0.6129 0.6431 0.6673 0.6976 0.7238 0.7520 0.7944 0.8448];
y=[ 0 0.0230 0.0370 0.0480 0.0760 0.0900 0.1000 0.1180 0.1380 0.1600 0.1860 0.2130 0.2880 0.4010];
% Plot it
plot(x,y, 'bo-', 'LineWidth', 3);
grid on;
title('y = (x-2).^2', 'FontSize', fontSize);
xlabel('X', 'FontSize', fontSize);
ylabel('Y', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Give a name to the title bar.
set(gcf,'name','Demo by ImageAnalyst','numbertitle','off')
% Fit the range from index 1 to 14 with a line.
limitedRange = 1:14;
coeffs = polyfit(x(limitedRange), y(limitedRange), 1)
% Define the range where we want the line
xFitting = 9:14; % Or wherever...
yFitted = polyval(coeffs, xFitting);
% Plot the fitted line over the specified range.
hold on; % Don't blow away prior plot
plot(xFitting, yFitted, 'ro-', 'LineWidth', 2);
legend('Original Data', 'Line Fit');
Isa Isa
Isa Isa le 26 Déc 2012
I run the code and see that trendline/line fit is not passing through any of the y data. Like your original demo, I want the trendline to fit and pass through certain region of the curve. It may be early region, middle region or late region of the curve.
Thanks Isa
It was not clear when you said " I want the trendline at y range between y(9) to y(14)." because neither your x values nor your y values go through the range 9-14. See the line that says:
xFitting = 9:14; % Or wherever...
"whatever" means that you are supposed to change it to whatever you want for the x values. For example if you want 50 fitted (estimated) values between x(1) and x(14), you'd change that line to
xFitting = linspace(x(1), x(14), 50);
or if you wanted to make a point every 0.01 from x(1) to x(14), you'd do this:
xFitting = x(1) : 0.01 : x(14);
Isa Isa
Isa Isa le 27 Déc 2012
Thanks. I have got it. I really appreciate your assistance. Another issue is that if I click on any point on my original data curve and fit curve, I want to see the x and y data for that point I click on the curve. Please assist.
Thanks Isa
Image Analyst
Image Analyst le 27 Déc 2012
Can't you use ginput() to determine which actual data point is closest to the point you clicked at? That's what I'd try. If that didn't work I'd search Answers - I think that has been asked before.
If your original question is solved, go ahead and mark it as Answered.
Isa Isa
Isa Isa le 27 Déc 2012
Thanks. ginput works well.
Isa Isa
Isa Isa le 30 Déc 2012
Hi, Please if I want the slope of the 'Line Fit' how do I get it?
Thanks
Regards
José-Luis
José-Luis le 30 Déc 2012
doc polyfit
Isa Isa
Isa Isa le 6 Jan 2013
Hi, Please assist on this. I try to add trendline to a semilogx plot but didn't succeed. Please check the code below.
% Define equation. x=[ 90868 68151 45434 34076 27261 13631 6816 3408 2273 1948 1705 1137 853 683 569 455 342 274 228 190]; y=[ 3680 3723 3800 3866 3920 4103 4250 4320 4340 4344 4350 4364 4373 4379 4384 4393 4398 4402 4405 4407];
% Plot it semilogx(x,y, 'bo-', 'LineWidth', 3); grid on; % Enlarge figure to full screen. set(gcf, 'units','normalized','outerposition',[0 0 1 1]); % Give a name to the title bar. set(gcf,'name','Demo by ImageAnalyst','numbertitle','off')
% Fit the y data range with a line (limitedRange). limitedRange = 17:20; coeffs = polyfit(x(limitedRange), y(limitedRange), 1); xFitting = linspace(200, 90000, 50); yFitted = polyval(coeffs, xFitting);
% Plot the fitted line over the specified range. hold on; plot(xFitting, yFitted, 'ro-', 'LineWidth', 2); legend('Original Data', 'Line Fit');
Thanks Isa
Ananya Roy
Ananya Roy le 20 Fév 2017
Hi Isa,
I have similar problem as you had. Please let me know if you could solve that problem and how.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Line Plots dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by