Re: [R] wrapping lattice xyplot

From: hadley wickham <>
Date: Fri, 08 Jun 2007 22:14:06 +0200

On 6/8/07, Zack Weinberg <> wrote:
> This is an expanded version of the question I tried to ask last night
> - I thought I had it this morning, but it's still not working and I
> just do not understand what is going wrong.
> What I am trying to do is write a wrapper for lattice xyplot() that
> passes a whole bunch of its secondary arguments, so that I can produce
> similarly formatted graphs for several different data sets. This is
> what I've got:
> graph <- function (x, data, groups, xlab) {
> g <- eval(substitute(groups), data, parent.frame())
> pg <- function(x, y, group.number, ...) {
> panel.xyplot(x, y, ..., group.number=group.number)
> panel.text(2, unique(y[x==2]),
> levels(g)[group.number],
> pos=4, cex=0.5)
> }
> xyplot(x, data=data, groups=substitute(g),
> type='l',
> ylab=list(cex=1.1, label='Mean RT (ms)'),
> xlab=list(cex=1.1, label=xlab),
> scales=list(
> x=list(alternating=c(1,1), tck=c(1,0)),
> y=list(alternating=c(1,0))
> ),
> panel=panel.superpose,
> panel.groups=pg
> )
> }
> "pg" is supposed to pick "g" up from the lexical enclosure. I have no
> idea whether that actually works, because it never gets that far. A
> typical call to this function looks like so:
> > graph(est ~ pro | hemi, sm, obs, "Probe type")
> (where 'sm' is a data frame that really does contain all four columns
> 'est', 'pro', 'hemi', and 'obs', pinky swear) and, as it stands above,
> invariably gives me this error:
> Error in eval(expr, envir, enclos) : object "est" not found
> I tried substitute(x) (as that seems to have cured a similar problem
> with "g") but then x is not a formula and method dispatch fails.
> Help?
> zw

It's not lattice, but ggplot2,, is designed to make this easy because you don't have to specify the data set when creating the plot. e.g.

install.packages("ggplot2", dep=T)

# This is an abstract definition of a plot - it doesn't have any data yet p <- ggplot(mapping = aes(x=cyl, y=mpg)) + geom_point() + geom_smooth(method="lm")

mt2 <- mtcars * 2
mt3 <- ^ 2)

# Add datasets

p %+% mtcars
p %+% mt2
p %+% mt3

# (the syntax isn't great, but you get the idea)

# Or even changing the default mapping from data to visual properties p %+% mt3 + aes(x = mpg, y=wt)

Obviously, you can do even more within a function, and the aes call is relatively easy to create programmatically (although not well documented currently, so please ask me for more details if you are interested).

Hadley mailing list PLEASE do read the posting guide and provide commented, minimal, self-contained, reproducible code. Received on Fri 08 Jun 2007 - 20:30:11 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 08 Jun 2007 - 20:33:38 GMT.

Mailing list information is available at Please read the posting guide before posting to the list.