Отредактируйте пределы x линии наименьших квадратов - PullRequest
2 голосов
/ 29 апреля 2019

Я создал два точечных графика, а затем использовал lsline, чтобы добавить линии регрессии для каждого графика.Я использовал этот код:

for i=1:2
  x = ..;
  y = ..;
  scatter(x, y, 50, 'MarkerFaceColor',myColours(i, :));
end
h_lines = lsline;

Тем не менее, более темная линия выходит далеко за пределы последней точки данных на этой диаграмме рассеяния (которая находится в области х = 0,3):

enter image description here

lsline, похоже, не обладает свойствами, позволяющими установить его горизонтальный диапазон.Есть ли обходной путь для установки этого отдельно для двух строк, в Matlab 2016a?

Ответы [ 3 ]

5 голосов
/ 29 апреля 2019

Для одного набора данных

Это обходной путь, а не решение. 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

enter image description here

Для нескольких наборов данных

В этом случае вы можете применять одну и ту же процедуру для каждого набора данных последовательно, но вам нужно сохранять только один набор данных видимым при вызове 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

enter image description here

4 голосов
/ 29 апреля 2019

Еще одно решение: реализовать свой собственный hsline.Это просто!

В MATLAB выполнение наименьших квадратов по прямой линии тривиально.Для заданных векторов столбцов x и y с элементами N, b = [ones(N,1),x] \ y; являются параметрами линии наилучшего соответствия.[1,x1;1,x2]*b - это координаты y двух точек вдоль линии с координатами x x1 и x2.Таким образом, вы можете написать (следуя примеру Луиса и получив точно такой же вывод):

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-')
2 голосов
/ 29 апреля 2019

Вы можете получить точки, которые определяют линию, используя

h_lines =lsline;

h_lines(ii).XData и h_lines(ii).YData будут содержать 2 точки, которые определяют линии для каждой линии ii=1,2. Используйте их, чтобы создать уравнение линии и построить линию в нужном диапазоне.

...