[R] add trend line to each group of data in: xyplot(y1+y2 ~ x | grp...

Deepayan Sarkar deepayan.sarkar at gmail.com
Mon Mar 13 19:30:41 CET 2006

On 3/13/06, Andy Bunn <abunn at whrc.org> wrote:
> Deepayan:
> I'm really trying to understand how to access the different groups in this
> type of plot. Imagine I have the same scenario as above, an xyplot of the
> form y1+y2 ~ x | grp. Now, how can I modify the call to panel.text to write,
> say, the correlation coeff from each model to different portions of each
> panel (the upper left corner for the correlation of (x,y2) and the lower
> right corner for x,y2). The code below, if uncommented, executes but
> obviously doesn't do what I want it to do. Thoughts appreciated and
> gratitude as always. -Andy
> foo <- data.frame(y1 = 1:25+rnorm(100, -3, 1), y2 = 1:25+rnorm(100,3,1), x =
> rep(1:25,4), grp = rep(letters[1:4],25))
> y.range <- range(foo$y1, foo$y2)
> x.range <- range(foo$x)
> xyplot(y1+y2~x|grp, data = foo, panel = panel.superpose,
>        col.line=c('red','blue'), col.symbol=c('red','blue'), panel.groups =
> function(x,y,col.line,col.symbol,...)
>           { panel.points(x,y,col=col.symbol)
>             panel.lmline(x,y,col=col.line)
> #            # if the data being plotted are from y1 then
> #            # write the cor coef in the lower right corner
> #            aCor=round(cor(x,y),digits=2)
> #
> panel.text(x.range[2],y.range[1],paste("r=,",aCor),pos=2,col="red")
> #            # if the data being plotted are from y2 then
> #            # write the cor coef in the upper left corner
> #            aCor=round(cor(x,y),digits=2)
> #
> panel.text(x.range[1],y.range[2],paste("r=,",aCor),pos=4,col="blue")
>           })

There was a very similar question off-list a few days back. My response was:

There's no good way I can think of. 'panel.groups' simply does not
have any information about which level of 'groups' is being used. I
think it should, and I've changed the behaviour so that from R 2.3.0
'panel.groups' will be called with an argument called 'group.number'
which will specify the level. There are many ways to work around this
for now (e.g. write your own panel function that eventualy calls
panel.superpose). The simplest is to use a global counter variable;
increment it inside panel.groups using <<- (needless to say, this is
not good programming practice in general).


More information about the R-help mailing list