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
doc polyfit
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!选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
