Daniel Myall
2009-Jan-25 09:54 UTC
[R] Multiple lattice plots on a page: aligning x-axes vertically
Dear R-help, I am creating a two lattice plots (a densityplot() and xyplot()) that have the same x-axes and then 'printing' them onto the same page, one above the other (see end of email for an example to generate the graph). With different labels on the y-axis for each plot the left spacing is different, and the x-axes don't align vertically. Although I can manually modify the print region of the plots on the page to align the x-axes, this is not very robust; as can be expected changing the size of the plot device scales the x-axes differently in both plots. Additionally, changing devices also causes issues (i.e., the plots are aligned in quartz(width=12,height=6) but then slightly off with pdf(width=12,height=6)). As I'm using this inside Sweave to generate numerous plots of this form, I am after some robust way to vertically align the x-axes of the plots. With the approach I'm taking is there a way with lattice or grid to vertically align the x-axes? By somehow setting the internal plot width to be the same in both plots I think this would solve the issue (possibly by setting the right parameters in str(trellis.par.get("layout.widths")))? Alternatively, would another approach be better (i.e., is it possible to create a new panel function that does a panel.xyplot and panel.densityplot on slightly different data?). Thanks. Daniel ## BEGIN Example #OS: Mac OS X 10.5.5; R: 2.8.1; lattice 0.17-20 library(reshape) library(lattice) plotdensitymeans <- function(data,measure,factors=c('subject_group','task'), xlab="",xlim=NULL, ...) { # Create means by subject x.melted <- melt(data, id.var = append(factors,'subject_ID'), measure.var=measure,na.rm=T) formula.bysubject.cast <- paste(factors[1],"+",factors[2],"+ subject_ID ~ .") x.cast.subject <- data.frame(cast(x.melted,formula.bysubject.cast, mean)) # Plot means by subject text.formula <- paste(factors[1],":",factors[2],"~ X.all.") text.group <- paste(factors[1],":",factors[2]) formula.xyplot <- as.formula(text.formula) formula.group <- as.expression(formula.xyplot) environment(formula.xyplot) <- environment() plot.subject.means <- xyplot(formula.xyplot, group=eval(formula.group), xlim=xlim, pch=16, alpha=0.6,data = x.cast.subject,xlab=xlab,ylab="") # Plot distributions formula.densityplot <- as.formula(paste(" ~",measure[1])) environment(formula.densityplot) <- environment() plot.density <- densityplot(formula.densityplot,group=eval(formula.group),data=data, xlim=xlim,n=200,auto.key=list(columns = 4,line=TRUE),plot.points=F,xlab="",lty=1, scales=list(y=list(draw=FALSE),x=list(draw=FALSE))) # Plot both plots on a single page print(plot.subject.means, position = c(0,0,1,0.35)) print(plot.density, position = c(0.0988,0.22,0.98,1), newpage = FALSE) } example.data <- data.frame(subject_ID = c('A01','B01','A02','B02'), subject_group = c('pop1','pop2'), task= c(rep('task1',32),rep('task2',32)),dependent_measure=rnorm(64)) plotdensitymeans(example.data, measure=c('dependent_measure'), xlab="dependent measure (units)", xlim=c(-3,3)) ##END Example --- Daniel Myall PhD Student Department of Medicine University of Otago, Christchurch Van der Veer Institute for Parkinson's and Brain Research 66 Stewart St Christchurch New Zealand daniel.myall at vanderveer.org.nz vanderveer.org.nz
baptiste auguie
2009-Jan-25 11:04 UTC
[R] Multiple lattice plots on a page: aligning x-axes vertically
Have you tried c() from the latticeExtra package? It worked for me (see below)> library(grid) > library(lattice) > x <- seq(0, 10, length=100) > y <- sin(x) > y2 <- 10*sin(x) > f <- rep(c("1", "2"), each=50) > > p1 <- xyplot(y~x,groups=f, ylab="BIG LABEL", > # auto.key=list(space="right"), > par.settings = list(layout.width = list(panel=1, ylab = 2, axis.left > =1.0, left.padding=1, > ylab.axis.padding=1, axis.panel=1))) > > p2 <- xyplot(y2~x, ylab="a", > par.settings = list(layout.width = list(panel=1, ylab = 2, axis.left > =1.0, left.padding=1, > ylab.axis.padding=1, axis.panel=1))) > > library(latticeExtra) > > update(c(p2, p1, x.same = TRUE), > layout = c(1, 2), > ylab = list(c("a", "BIG LABEL"), y = c(1/6, 2/3)), > par.settings = list(layout.heights = list(panel = c(1, 2))))Hope this helps, baptiste On 25 Jan 2009, at 09:54, Daniel Myall wrote:> Dear R-help, > > I am creating a two lattice plots (a densityplot() and xyplot()) that > have the same x-axes and then 'printing' them onto the same page, one > above the other (see end of email for an example to generate the > graph). > With different labels on the y-axis for each plot the left spacing is > different, and the x-axes don't align vertically. Although I can > manually modify the print region of the plots on the page to align the > x-axes, this is not very robust; as can be expected changing the > size of > the plot device scales the x-axes differently in both plots. > Additionally, changing devices also causes issues (i.e., the plots are > aligned in quartz(width=12,height=6) but then slightly off with > pdf(width=12,height=6)). As I'm using this inside Sweave to generate > numerous plots of this form, I am after some robust way to vertically > align the x-axes of the plots. > > With the approach I'm taking is there a way with lattice or grid to > vertically align the x-axes? By somehow setting the internal plot > width > to be the same in both plots I think this would solve the issue > (possibly by setting the right parameters in > str(trellis.par.get("layout.widths")))? Alternatively, would another > approach be better (i.e., is it possible to create a new panel > function > that does a panel.xyplot and panel.densityplot on slightly different > data?). > > Thanks. > > Daniel > > > ## BEGIN Example > #OS: Mac OS X 10.5.5; R: 2.8.1; lattice 0.17-20 > > library(reshape) > library(lattice) > > plotdensitymeans <- > function(data,measure,factors=c('subject_group','task'), > xlab="",xlim=NULL, ...) { > > # Create means by subject > x.melted <- melt(data, id.var = append(factors,'subject_ID'), > measure.var=measure,na.rm=T) > formula.bysubject.cast <- paste(factors[1],"+",factors[2],"+ > subject_ID ~ .") > x.cast.subject <- data.frame(cast(x.melted,formula.bysubject.cast, > mean)) > > # Plot means by subject > text.formula <- paste(factors[1],":",factors[2],"~ X.all.") > text.group <- paste(factors[1],":",factors[2]) > formula.xyplot <- as.formula(text.formula) > formula.group <- as.expression(formula.xyplot) > > environment(formula.xyplot) <- environment() > plot.subject.means <- xyplot(formula.xyplot, > group=eval(formula.group), xlim=xlim, pch=16, alpha=0.6,data > x.cast.subject,xlab=xlab,ylab="") > > # Plot distributions > formula.densityplot <- as.formula(paste(" ~",measure[1])) > > environment(formula.densityplot) <- environment() > plot.density <- > densityplot(formula.densityplot,group=eval(formula.group),data=data, > xlim=xlim,n=200,auto.key=list(columns > 4,line=TRUE),plot.points=F,xlab="",lty=1, > scales=list(y=list(draw=FALSE),x=list(draw=FALSE))) > > # Plot both plots on a single page > print(plot.subject.means, position = c(0,0,1,0.35)) > print(plot.density, position = c(0.0988,0.22,0.98,1), newpage = > FALSE) > > } > > example.data <- data.frame(subject_ID = c('A01','B01','A02','B02'), > subject_group = c('pop1','pop2'), > task> c(rep('task1',32),rep('task2',32)),dependent_measure=rnorm(64)) > plotdensitymeans(example.data, measure=c('dependent_measure'), > xlab="dependent measure (units)", xlim=c(-3,3)) > > ##END Example > > --- > Daniel Myall > PhD Student > Department of Medicine > University of Otago, Christchurch > Van der Veer Institute for Parkinson's and Brain Research > 66 Stewart St > Christchurch > New Zealand > > daniel.myall at vanderveer.org.nz > vanderveer.org.nz > > ______________________________________________ > R-help at r-project.org mailing list > stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code._____________________________ Baptiste Augui? School of Physics University of Exeter Stocker Road, Exeter, Devon, EX4 4QL, UK Phone: +44 1392 264187 newton.ex.ac.uk/research/emag