Re: [R] Regression line limited by the rage of values

From: Greg Snow <Greg.Snow_at_intermountainmail.org>
Date: Thu 25 May 2006 - 07:33:20 EST


For single lines the usual method is to just use the lines or segments function, however I have been thinking that there may be some other uses for clipping within a plot region when adding info (abline, but others as well). So here is a first stab at a function to clip within the region, it needs the TeachingDemos package to work. I'll probably put in some more error checking, document it and include it in a future TeachingDemos release, but you are welcome to use it in the meantime.

For your case you would create your scatterplot the same as you already did, then add the lines like:

> clipplot( abline(lm(y1~x1),col="blue"), xlim=c(1,4) )
> clipplot( abline(lm(y2~x2),col="red"), xlim=c(5,8) )

Here is the function definition:

clipplot <- function(fun, xlim=par('usr')[1:2],

        ylim=par('usr')[3:4] ){
  old.par <- par(c('plt','xpd'))

  if( length(xlim) < 2 ) stop('xlim must be a vector with at least 2 elements')
  if( length(ylim) < 2 ) stop('ylim must be a vector with at least 2 elements')

  if( !require(TeachingDemos) ) stop('TeachingDemos package needed')

  xl <- range(xlim)
  yl <- range(ylim)

  pc <- cnvrt.coords(xl,yl)$fig

  par(plt=c(pc$x,pc$y),xpd=FALSE)

  fun

  par(old.par)
  box() # need to plot something to reset

}  

Hope this helps,

-- 
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow@intermountainmail.org
(801) 408-8111
 

-----Original Message-----
From: r-help-bounces@stat.math.ethz.ch
[mailto:r-help-bounces@stat.math.ethz.ch] On Behalf Of Andreas Svensson
Sent: Wednesday, May 24, 2006 10:52 AM
To: r-help@stat.math.ethz.ch
Subject: [R] Regression line limited by the rage of values

Hi

In R, using  plot(x,y)   followed by abline(lm(y~x)) produces a graph 
with a regression line spanning the whole plot . This means that the
line extends beyond the swarm of data points to the defined of default
plot region. With par(xpd=T) it will span the entire figure region. But
how can I limit a regression line to the data range, i.e between
(xmin,ymin) and  (xmax,ymax)?

Sorry for not knowing the lingo here. If you don't understand the
question, please run the following script:

x1<-c(1,2,3,4)
x2<-c(5,6,7,8)
y1<-c(2,4,5,8)
y2<-c(10,11,12,16)
plot(x1,y1,xlim=c(0,10),ylim=c(0,20),col="blue")
points(x2,y2,col="red")
abline(lm(y1~x1),col="blue")
abline(lm(y2~x2),col="red")

The resulting plot isn't very informative. There is no overlap in the
two groups of data, yet the two ablines overlap.
I instead  want the blue line to go from (1,2) to (4,8) and the red line
from (5,10) to (8,16).

So, how can I constrain the abline to the relevant region, i.e stop
abline from extrapolating beyond the actual range of data.
Or should I use a function line 'lines' to do this?

Cheers
Andres

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Received on Thu May 25 07:51:08 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Thu 25 May 2006 - 08:10:59 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.