在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轴交叉,这样它看起来像这样:
答案 0 :(得分:2)
您只需将输入点数组更改为polyval
即可。您只使用a
中定义的点,并通过这些点绘制最佳拟合线。因此,定义更多点,您可以指定y=0
在a
中的最后一个点发生的点。鉴于最佳拟合线为y = mx + b
,其中m
为斜率,b
为截距,生成x
的{{1}}值仅为y=0
。因此,起始点在MATLAB语法中只是-b/m
引用您的代码。 -p(2)/p(1)
的输出是两个值的数组(正如您指定的拟合顺序为1),其中第一个是斜率polyfit
,最后一个是截距p(1)
。 / p>
因此,尝试这样做。我保留了您的代码,并在我修改过的地方放置了评论:
p(2)
linspace
生成从最小值到最大值的线性间隔点阵列。默认情况下,点数为100.最小值为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
,最大值为-b/m
中的最大值。一旦我们生成了这个数组,然后我们使用a
并评估该行中每个值对于该行的点。我还修改了对您polyval
的调用,以便我使用这些新点并使图形整齐,我更改了显示的plot
值的限制其中x
拦截达到x
中的最大值。完成了xlim
,我们可以在图中指定要关注的最小和最大a
值。
我们得到以下图表: