在 MATLAB 中,我想用回归绘制散点数据。
a = [2004.4 2005.6 2002.1 2002.1 2004.8 2002.6 2003.5 2001.3 2003.5 2002.6];
b = [0.1006 0.0848 0.0502 0.0502 0.0909 0.0385 0.0732 0.0732 0.0896 0.0772];
scatter(a, b, 6);
hold on
p = polyfit(a,b,1);
f = polyval(p,a);
plot(a,f,'Color',[0.7500 0.7500 0.7500],'linewidth',1.5)
但是,我想延长直线(和 x 轴),使直线穿过 y=0
并在原点处与 x 轴相交,这样它看起来像这样:
最佳答案
您只需将输入的点数组更改为 polyval
。您仅使用 a
中定义的点并绘制通过这些点的最佳拟合线。因此,定义 more 点,在其中指定 y=0
发生的点,直到 a
中的最后一个点。考虑到最佳拟合线是 y = mx + b
,其中 m
是斜率,b
是截距,x
生成 y=0
的值就是 -b/m
。因此,起点只是 MATLAB 语法中的 -p(2)/p(1)
引用您的代码。 polyfit
的输出是两个值的数组(因为您将拟合阶数指定为 1),其中第一个是斜率 p(1)
,最后一个是拦截 p(2)
.
因此,尝试这样做。我完整地保留了您的代码,并在我修改过的地方放置了注释:
a = [2004.4 2005.6 2002.1 2002.1 2004.8 2002.6 2003.5 2001.3 2003.5 2002.6];
b = [0.1006 0.0848 0.0502 0.0502 0.0909 0.0385 0.0732 0.0732 0.0896 0.0772];
scatter(a, b, 6);
hold on
p = polyfit(a,b,1);
xx = linspace(-p(2)/p(1), max(a)); %// Change
yy = polyval(p, xx); %// Change
plot(xx,yy,'Color',[0.7500 0.7500 0.7500],'linewidth',1.5) %// Change
xlim([-p(2)/p(1), max(a)]); %// Change
linspace
生成从最小值到最大值的线性间隔点数组。点数默认为 100。最小值为 -b/m
,最大值为 a
中的最大值。生成此数组后,我们将使用 polyval
并评估数组中每个值沿线的点。我还修改了对您的 plot
的调用,以便我使用这些新点并使图形整洁,我将显示的 x
值的限制更改为从 x
截距到 a
中的最大值的范围。这是用 xlim
完成的我们可以在其中指定图表中要关注的最小和最大 x
值。
我们得到下图:
关于matlab - 如何在 MATLAB 中扩展最佳拟合线(polyfit)以在零处穿过 y 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35098996/