On Fri, Oct 2, 2009 at 8:03 PM, Mark Dalphin <mark.dalp...@peblnz.com> wrote: > Hi, > > I'm having a problem getting the panel.average function to work as I > expect it to in a lattice plot. I wish to draw lines between the > averages of groups of y-values at specific x-values. I have created a > dataset below which is similar to my real data. I also show an example > of using panel.loess in place of panel.average; it performs in a > manner similar to what I want panel.average to do except it shows a > loess line rather than a straight line connecting the means of the > groups. > > Please see my coded examples, below. > > Regards, > Mark Dalphin > > ================================================================= > My system information: > >> library(lattice) >> print(sessionInfo()) > > R version 2.9.1 (2009-06-26) i686-pc-linux-gnu > locale: > LC_CTYPE=en_NZ.UTF-8;LC_NUMERIC=C;LC_TIME=en_NZ.UTF-8;LC_COLLATE=en_NZ.UTF-8; > LC_MONETARY=C;LC_MESSAGES=en_NZ.UTF-8;LC_PAPER=en_NZ.UTF-8;LC_NAME=C; > LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_NZ.UTF-8;LC_IDENTIFICATION=C > > attached base packages: > [1] stats graphics grDevices utils datasets methods base > other attached packages: > [1] lattice_0.17-25 > > loaded via a namespace (and not attached): > [1] grid_2.9.1 tools_2.9.1 > > ##-------------------------------------------------------------- > ## This dataset is too complicated, but it does show the type of plot I > want. > ## > ## Create a fake qPCR dataset: Eight 96-well plates over 4 days (2 per day), > ## 2 genes per plate (multiplexed), and 4 "Hi" positive control and > ## 4 "Lo" positive controls per plate. > ## Create the experimental data; by rights it is all identical, expect for > ## experimental errors with in days and between days. > ## For this simulation, each gene will be given a base value. > ## In qPCR the higher the "Ct" value, the lower the concentration. > library(lattice) # Add for ease of cut-n-paste of this code > date <- c('2009-09-07', '2009-09-08', '2009-09-10', '2009-09-14') > probe <- c('Gene.A1', 'Gene.A2', 'Gene.B1', 'Gene.B2') > conc <- c('Lo', 'Hi') > base.lo <- c(Gene.A1=29, Gene.A2=25, Gene.B1=28, Gene.B2=31) > base.hi <- base.lo - 8 > day.err <- c(Day.1=0, Day.2=1, Day.3=1.5, Day.4=1.0) > > d <- data.frame() > for(i in seq(along=date)) { > for(j in seq(along=probe)) { > for(k in seq(along=conc)) { > d <- rbind(d, data.frame(Date=rep(date[i], length=4), > Probe=rep(probe[j], length=4), > Conc=rep(conc[k], length=4), > Ct=rnorm(4, sd=0.5) + (k-1)*8 + > base.hi[j] + day.err[i] > )) > } > } > } > d$Date <- as.POSIXct(d$Date) > > ##-------------------------------------------------- > ## Example 1 > ## Print with LOESS line showing the 'means' for the groups. > ## This is close, but I don't want a loess line; I want straight lines > ## between mean values. > print(xyplot(Ct ~ Date|Probe, group=Conc, data=d, > panel="panel.superpose", > panel.groups=function(x, y, ...) { > panel.loess(x, y, ...) > panel.xyplot(x, y, ...) > }, > auto.key=TRUE)) > > ##-------------------------------------------------- > ## Example 2 > ## Parallel construction to the loess example, above. > ## Note the loss of the lines. The 'horizontal' default > ## is different between 'panel.loess' and 'panel.average'. > print(xyplot(Ct ~ Date|Probe, group=Conc, data=d, > panel="panel.superpose", > panel.groups=function(x, y, ...) { > panel.average(x, y, horizontal=FALSE, ...) > panel.xyplot(x, y, ...) > }, > auto.key=TRUE))
Unfortunately, the implicit type="p" argument in panel.superpose is overriding the type="l" in panel.average (may be it should be unmodifiable). So, you need print(xyplot(Ct ~ Date|Probe, group=Conc, data=d, panel="panel.superpose", panel.groups=function(x, y, ..., type) { panel.average(x, y, ..., type = "l", horizontal = FALSE) panel.xyplot(x, y, ..., type = type) }, auto.key=TRUE)) It's more common to use the syntactic sugar provided by panel.xyplot: print(xyplot(Ct ~ Date|Probe, group=Conc, data=d, type = c("p", "a"), auto.key=TRUE)) > > ##-------------------------------------------------- > ## Example 3 > ## Don't pass along the '...' to the panel.average. Now I > ## get lines, but not matching colours to the points. > print(xyplot(Ct ~ Date|Probe, group=Conc, data=d, > panel="panel.superpose", > panel.groups=function(x, y, ...) { > panel.average(x, y, horizontal=FALSE) > panel.xyplot(x, y, ...) > }, > auto.key=TRUE)) > > ##********************************************************************** > Main question: > > I want to create a plot that looks like Example 3, but with the > coloured lines of Example 1. Suggestions? I've looked in RSiteSearch() > for both "panel.average" and "panel.linejoin" but found nothing addressing > this. > > Side question: > > I also read the source code to panel.average, panel.loess and > panel.superpose. Which leads to a side question; how do I determine > what parameters are being passed within '...'? I tried recreating my > panel.groups function above as an explicit (non-anonymous) function > and using debug() on it, but running formals() within that debugging session > didn't seem to show me the huge list of arguments from > panel.superpose, "do.call(panel.groups, args)", coming into my panel > function. Is there some way to "see" these arguments? I usually put in str(list(...)) in the function. For interactive debugging, you could have dots <- list(...) and then debug. -Deepayan ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.