[R] Cumsum in Lattice Panel Function

Deepayan Sarkar deepayan.sarkar at gmail.com
Sun May 8 20:50:36 CEST 2011


On Fri, May 6, 2011 at 9:24 PM, Elliot Joel Bernstein
<elliot.bernstein at fdopartners.com> wrote:
> I'm trying to create an xyplot with a "groups" argument where the y-variable
> is the cumsum of the values stored in the input data frame. I almost have
> it, but I can't get it to automatically adjust the y-axis scale. How do I
> get the y-axis to automatically scale as it would have if the cumsum values
> had been stored in the data frame?
>
> Here is the code I have so far:
>
> require(lattice)
>
>
>
> dates <- seq(as.Date("2011-01-01"), as.Date("2011-04-30"), "days")
> g <- 1:3
>
>
> dat <- data.frame(date = rep(dates, length(g)),
>                  group = rep(g, each = length(dates)),
>                  value = rnorm(length(dates)*length(g)) + 0.05)
>
>
> xyplot(value ~ date, data = dat, group = group, type = 'l', grid = TRUE,
>       panel = panel.superpose,
>       panel.groups = function(x, y, ...) { panel.xyplot(x, cumsum(y), ...)
> })
>
>
> I want the result to look the same as if I had done
>
> dat$cumvalue <- with(dat, unsplit(lapply(split(value, group), cumsum),
> group))
> xyplot(cumvalue ~ date, data = dat, group = group, type = 'l', grid = TRUE)

You need something along the lines of

xyplot(value ~ date, data = dat, group = group, type = 'l', grid = TRUE,
       panel = panel.superpose,
       panel.groups = function(x, y, ...) {
           panel.xyplot(x, cumsum(y), ...)
       },
       prepanel = function(x, y, groups, ...) {
           yy <- unlist(tapply(y, groups, cumsum))
           list(ylim = range(yy, finite = TRUE))
       })

-Deepayan



More information about the R-help mailing list