编辑最小二乘线的 x 限制
Edit the x limits of least squares line
我创建了两个散点图,然后使用 lsline 为每个图添加了回归线。我使用了这段代码:
for i=1:2
x = ..;
y = ..;
scatter(x, y, 50, 'MarkerFaceColor',myColours(i, :));
end
h_lines = lsline;
但是,较暗的线远远超出散点图中的最后一个数据点(在 x=0.3 左右):
lsline 似乎没有允许设置其水平范围的属性。在 Matlab 2016a 中,是否有针对两条线分别设置此项的解决方法?
您可以使用
获取定义线的点
h_lines =lsline;
h_lines(ii).XData
和 h_lines(ii).YData
将包含 2 个点,用于定义每个 ii=1,2
线的线。使用它们来创建直线方程,并在您想要的范围内绘制直线。
对于单个数据集
这是一种解决方法,而不是解决方案。 lsline
内部调用 refline
,它绘制了一条填充轴 的线,由它们的当前限制 (xlim
和 ylim
)给出。因此,您可以将这些限制更改为该行所需的范围,调用 lsline
,然后恢复限制。
示例:
x = randn(1,100);
y = 2*x + randn(1,100); % random, correlated data
plot(x, y, '.') % scatter plot
xlim([-1.5 1.5]) % desired limit for line
lsline % plot line
xlim auto % restore axis limit
对于几个数据集
在这种情况下,您可以按顺序对每个数据集应用相同的过程,但是您需要在调用 lsline
时只保持一个数据集可见;否则,当您调用它来创建第二行时,它还会创建第一行的新版本(范围错误)。
示例:
x = randn(1,100); y = 2*x + randn(1,100); % random, correlated data
h = plot(x, y, 'b.'); % scatter plot
axis([min(x) max(x) min(y) max(y)]) % desired limit for line
lsline % plot line
xlim auto % restore axis limit
hold on
x = 2*randn(1,100) - 5; y = 1.2*x + randn(1,100) + 6; % random, correlated data
plot(x, y, 'r.') % scatter plot
axis([min(x) max(x) min(y) max(y)]) % desired limit for line
set(h, 'HandleVisibility', 'off'); % hide previous plot
lsline % plot line
set(h, 'HandleVisibility', 'on'); % restore visibility
xlim auto % restore axis limit
另一种解决方案:实施您自己的 hsline
。很简单!
在 MATLAB 中,对直线进行最小二乘拟合是微不足道的。给定具有 N
个元素的列向量 x
和 y
,b = [ones(N,1),x] \ y;
是最佳拟合线的参数。 [1,x1;1,x2]*b
是 x 坐标为 x1
和 x2
的直线上两点的 y 位置。因此你可以写(跟随 ,并得到完全相同的输出):
N = 100;
x = randn(N,1); y = 2*x + randn(N,1); % random, correlated data
h = plot(x, y, 'b.'); % scatter plot
hold on
b = [ones(N,1),x] \ y;
x = [min(x);max(x)];
plot(x,[ones(2,1),x] * b, 'b-')
x = 2*randn(N,1) - 5; y = 1.2*x + randn(N,1) + 6; % random, correlated data
plot(x, y, 'r.') % scatter plot
b = [ones(N,1),x] \ y;
x = [min(x);max(x)];
plot(x,[ones(2,1),x] * b, 'r-')
我创建了两个散点图,然后使用 lsline 为每个图添加了回归线。我使用了这段代码:
for i=1:2
x = ..;
y = ..;
scatter(x, y, 50, 'MarkerFaceColor',myColours(i, :));
end
h_lines = lsline;
但是,较暗的线远远超出散点图中的最后一个数据点(在 x=0.3 左右):
lsline 似乎没有允许设置其水平范围的属性。在 Matlab 2016a 中,是否有针对两条线分别设置此项的解决方法?
您可以使用
获取定义线的点h_lines =lsline;
h_lines(ii).XData
和 h_lines(ii).YData
将包含 2 个点,用于定义每个 ii=1,2
线的线。使用它们来创建直线方程,并在您想要的范围内绘制直线。
对于单个数据集
这是一种解决方法,而不是解决方案。 lsline
内部调用 refline
,它绘制了一条填充轴 的线,由它们的当前限制 (xlim
和 ylim
)给出。因此,您可以将这些限制更改为该行所需的范围,调用 lsline
,然后恢复限制。
示例:
x = randn(1,100);
y = 2*x + randn(1,100); % random, correlated data
plot(x, y, '.') % scatter plot
xlim([-1.5 1.5]) % desired limit for line
lsline % plot line
xlim auto % restore axis limit
对于几个数据集
在这种情况下,您可以按顺序对每个数据集应用相同的过程,但是您需要在调用 lsline
时只保持一个数据集可见;否则,当您调用它来创建第二行时,它还会创建第一行的新版本(范围错误)。
示例:
x = randn(1,100); y = 2*x + randn(1,100); % random, correlated data
h = plot(x, y, 'b.'); % scatter plot
axis([min(x) max(x) min(y) max(y)]) % desired limit for line
lsline % plot line
xlim auto % restore axis limit
hold on
x = 2*randn(1,100) - 5; y = 1.2*x + randn(1,100) + 6; % random, correlated data
plot(x, y, 'r.') % scatter plot
axis([min(x) max(x) min(y) max(y)]) % desired limit for line
set(h, 'HandleVisibility', 'off'); % hide previous plot
lsline % plot line
set(h, 'HandleVisibility', 'on'); % restore visibility
xlim auto % restore axis limit
另一种解决方案:实施您自己的 hsline
。很简单!
在 MATLAB 中,对直线进行最小二乘拟合是微不足道的。给定具有 N
个元素的列向量 x
和 y
,b = [ones(N,1),x] \ y;
是最佳拟合线的参数。 [1,x1;1,x2]*b
是 x 坐标为 x1
和 x2
的直线上两点的 y 位置。因此你可以写(跟随
N = 100;
x = randn(N,1); y = 2*x + randn(N,1); % random, correlated data
h = plot(x, y, 'b.'); % scatter plot
hold on
b = [ones(N,1),x] \ y;
x = [min(x);max(x)];
plot(x,[ones(2,1),x] * b, 'b-')
x = 2*randn(N,1) - 5; y = 1.2*x + randn(N,1) + 6; % random, correlated data
plot(x, y, 'r.') % scatter plot
b = [ones(N,1),x] \ y;
x = [min(x);max(x)];
plot(x,[ones(2,1),x] * b, 'r-')