[R] Multiple lattice plots on a page: aligning x-axes vertically

baptiste auguie ba208 at exeter.ac.uk
Sun Jan 25 12:04:30 CET 2009


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
> http://www.vanderveer.org.nz/
>
> ______________________________________________
> R-help at 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.

_____________________________

Baptiste Auguié

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag




More information about the R-help mailing list