Search code examples
matlabregressionleast-squares

Edit the x limits of least squares line


I created two scatter plots and then used lsline to add regression lines for each plot. I used this code:

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

However, the darker line extends far beyond the last data point in that scatter plot (which is at around x=0.3):

enter image description here

lsline doesn't seem to have properties that allow its horizontal range to be set. Is there a workaround to set this separately for the two lines, in Matlab 2016a?


Solution

  • For a single data set

    This is a workaround rather than a solution. lsline internally calls refline, which plots a line filling the axis as given by their current limits (xlim and ylim). So you can change those limits to the extent you want for the line, call lsline, and then restore the limits.

    Example:

    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

    For several data sets

    In this case you can apply the same procedure for each data set sequentially, but you need to keep only one data set visible when you call lsline; otherwise when you call it to create the second line it will also create a new version of the first (with the wrong range).

    Example:

    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