[R] abline and plot(augPred) help

Paul Murrell p.murrell at auckland.ac.nz
Mon Sep 4 22:19:02 CEST 2006


Petr Pikal wrote:
> Dear all
> as I did not get any response on my post about abline and 
> plot(augPred)) I try again. I hope I do not break some posting guide 
> rules. I would try to contact package maintainer directly but there 
> is stated to be R-core people, so I feel R-help list shall be OK.
> I need to draw straight lines through augPred plotted panels 
> (vertical or horizontal) at specified point. I know I shall probably 
> use panel.abline but I am missing correct syntax. Below you can see 
> my attempts together with results. I hope somebody can point me to 
> right direction.
> I am probably somewhere close but I have no clue, which parameter I
> shall modify to get measured points, fitted lines and vertical lines
> in panels together.

The problem is that you do not know about the default panel function
that nlme:::plot.augPred() uses, so your panel functions are not
replicating all of the default behaviour as well as adding your vertical
lines.  Some possible solutons suggested below ...

> fm1 <- lme(Orthodont)
> # standard plot
> plot(augPred(fm1, level = 0:1, length.out = 2))
> #plot with vertical but without points and fitted lines
> plot(augPred(fm1, level = 0:1, length.out = 2),
> panel=function(v,...) {
> panel.abline(v=10)}
> )
> # plot with vertical but without fitted lines
> plot(augPred(fm1, level = 0:1, length.out=2),
> panel=function(x,y,...) {
> panel.xyplot(x,y,...)
> panel.abline(v=10)}
> )
> # plot with vertical and with all points (fitted lines are drawn as 
> points)
> plot(augPred(fm1, level = 0:1),
> panel=function(x,y,...) {
> panel.xyplot(x,y,...)
> panel.abline(v=10)}
> )

One option is to take a sneak a peek at nlme:::plot.augPred() to see
what the default panel function is doing.  Here I have replicated the
default panel function and added a call to panel.abline().

plot(augPred(fm1, level = 0:1, length.out = 2),
  panel=function(x, y, subscripts, groups, ...) {
                orig <- groups[subscripts] == "original"
                panel.xyplot(x[orig], y[orig], ...)
                panel.superpose(x[!orig], y[!orig], subscripts[!orig],
                                groups, ..., type = "l")

The problem with this approach is that you need to crawl around in the
code of nlme:::plot.augPred().  An alternative approach is to annotate
the plot after-the-fact.  This is shown below.

plot(augPred(fm1, level = 0:1, length.out = 2))
for (i in 1:5) {
  for (j in 1:6) {
    if (i < 5 || j < 4) {
      trellis.focus("panel", j, i, highlight=FALSE)

This avoids crawling around in code, but the problem with this is
knowing how many rows and columns of panels there are.  If you
explicitly controlled the 'layout' of the original plot, you could
guarantee that your annotation works properly.

Hope that helps.

Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
New Zealand
64 9 3737599 x85392
paul at stat.auckland.ac.nz

More information about the R-help mailing list