[R] custom panel help in lattice

Deepayan Sarkar deepayan.sarkar at gmail.com
Tue Dec 9 01:50:57 CET 2008


On Sun, Dec 7, 2008 at 9:37 AM, Jon Loehrke <jloehrke at umassd.edu> wrote:
> Hi,
>
> I am having an issue with a custom panel for lattice.  The problem
> comes when I try passing a groups argument.
>
> Here is the custom panel, a wrapper for smooth spline.  I copied
> panel.loess and replaced the loess arguments with smooth.spline().
> [Note: I would like to use the cross-validation fitting properties of
> smooth.spline.]
>
> library(lattice)
>
> panel.smooth.spline<-function(x,y,w=NULL, df, spar = NULL, cv = FALSE,
>        lwd=plot.line$lwd, lty=plot.line$lty,col, col.line=plot.line$col,
>        type, horizontal=FALSE,... ){
>
>            x <- as.numeric(x)
>            y <- as.numeric(y)
>            ok <- is.finite(x) & is.finite(y)
>            if (sum(ok) < 1)
>                return()
>            if (!missing(col)) {
>                if (missing(col.line))
>                    col.line <- col
>            }
>            plot.line <- trellis.par.get("plot.line")
>            if (horizontal) {
>                spline <- smooth.spline(y[ok], x[ok], ...)
>                panel.lines(x = spline$y, y = spline$x, col = col.line,
>                    lty = lty, lwd = lwd, ...)
>            }
>            else {
>                spline <- smooth.spline(x[ok], y[ok],...)
>                panel.lines(x = spline$x, y = spline$y, col = col.line,
>                    lty = lty, lwd = lwd, ...)
>            }
>        }
>
>
> # Here is my test data frame
> set.seed(25)
> test<-data.frame(x=c(1:200), y=rnorm(200), groups=gl(4,200/4))
>
> # This call to xyplot works, but the smoother colors are not unique.
>
> xyplot(y~x|groups, data=test,
>        panel=function(...){
>                panel.xyplot(...)
>                panel.smooth.spline(...)
>                })
>
> # This call to xyplot doesn't work and results in an error "error
> using packet"
>
> xyplot(y~x|groups, data=test, groups=groups,
>        panel=function(...){
>                panel.xyplot(...)
>                panel.smooth.spline(...)
>                })
>
> I think this should be quite simple but I must be too simple minded.
> Thanks for any help.

You end up calling smooth.spline() with arguments it doesn't
recognize. One work-around is defining 'panel.smooth.spline' as
follows:

panel.smooth.spline <-
    function(x, y,
             w=NULL, df, spar = NULL, cv = FALSE,
             lwd=plot.line$lwd, lty=plot.line$lty,col, col.line=plot.line$col,
             type, horizontal=FALSE,... )
{
           x <- as.numeric(x)
           y <- as.numeric(y)
           ok <- is.finite(x) & is.finite(y)
           if (sum(ok) < 1)
               return()
           if (!missing(col)) {
               if (missing(col.line))
                   col.line <- col
           }
           plot.line <- trellis.par.get("plot.line")
           if (horizontal) {
               spline <-
                   smooth.spline(y[ok], x[ok],
                                 w=w, df=df, spar = spar, cv = cv)
               panel.lines(x = spline$y, y = spline$x, col = col.line,
                   lty = lty, lwd = lwd, ...)
           }
           else {
               spline <-
                   smooth.spline(x[ok], y[ok],
                                 w=w, df=df, spar = spar, cv = cv)
               panel.lines(x = spline$x, y = spline$y, col = col.line,
                   lty = lty, lwd = lwd, ...)
           }
       }

-Deepayan



More information about the R-help mailing list