adding trendline to a plot

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

 采纳的回答

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 个评论

Isa, did that work for you?
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');
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);
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
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.
Thanks. ginput works well.
Hi, Please if I want the slope of the 'Line Fit' how do I get it?
Thanks
Regards
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
Hi Isa,
I have similar problem as you had. Please let me know if you could solve that problem and how.

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Line Plots 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by