Dear expeRts,
I would like to have four plots appearing in one figure. The minimal example
shows this. However, the four figures are not properly aligned. Why? If I
comment out the scales=... arguments, then it works, but I would like to use
this... :-)
Cheers,
Marius
library(lattice)
set.seed(1)
## plot: xyplot, histogram, qqplot, acf
res.plots <- function(x){
x.max <- max(abs(min(x)),abs(max(x)))
## xyplot
x0 <- 1
x1 <- length(x)
y0 <- -x.max
y1 <- x.max
xy <- xyplot(x~(1:length(x)),xlim=c(x0,x1),ylim=c(y0,y1),
aspect=1,scales=list(relation="free",alternating=c(1,1),tck=c(1,0)))
## histogram
x0 <- -x.max
x1 <- x.max
h <- histogram(x,xlim=c(x0,x1),aspect=1,type="density",
scales=list(relation="free",alternating=c(1,1),tck=c(1,0)))
## qqplot
y0 <- -x.max
y1 <- x.max
qq <-
qqmath(x,ylim=c(y0,y1),aspect=1,scales=list(tck=c(1,0),y=list(rot=90)),
panel=function(...){
panel.qqmath(...)
panel.qqmathline(x)
})
## ACF
myacf <- acf(x,plot=F,lag.max=24)
x0=0
x1=24
y0=-1
y1=1
ACF <- xyplot(0~0,xlim=c(x0,x1),ylim=c(y0,y1),aspect=1,
scales=list(tck=c(1,0),y=list(rot=90)),
panel=function(...){
for(i in 1:24){
panel.segments(i,0,i,myacf$acf[i])
}
panel.abline(h=0)
})
## plot function
plot.list <- list(xy,qq,h,ACF)
counter <- 1
trellis.device(pdf,paper="special",width=6,height=6,file="myplot.pdf")
for(i in 1:2){
for(j in 1:2){
if(i==2 && j==2) print(plot.list[[counter]],
split=c(j,i,2,2))
else print(plot.list[[counter]], split=c(j,i,2,2), more=TRUE)
counter <- counter + 1
}
}
dev.off()
}
x <- rexp(1000)
res.plots(x)
Okay, I solved it. After using the same arguments for "scales" (in particular: relation="free"), the plots are perfectly aligned. Cheers, Marius On 2010-08-24, at 20:39 , Marius Hofert wrote:> Dear expeRts, > > I would like to have four plots appearing in one figure. The minimal example shows this. However, the four figures are not properly aligned. Why? If I comment out the scales=... arguments, then it works, but I would like to use this... :-) > > Cheers, > > Marius > > > > library(lattice) > set.seed(1) > > ## plot: xyplot, histogram, qqplot, acf > res.plots <- function(x){ > > x.max <- max(abs(min(x)),abs(max(x))) > > ## xyplot > x0 <- 1 > x1 <- length(x) > y0 <- -x.max > y1 <- x.max > xy <- xyplot(x~(1:length(x)),xlim=c(x0,x1),ylim=c(y0,y1), > aspect=1,scales=list(relation="free",alternating=c(1,1),tck=c(1,0))) > > ## histogram > x0 <- -x.max > x1 <- x.max > h <- histogram(x,xlim=c(x0,x1),aspect=1,type="density", > scales=list(relation="free",alternating=c(1,1),tck=c(1,0))) > > ## qqplot > y0 <- -x.max > y1 <- x.max > qq <- qqmath(x,ylim=c(y0,y1),aspect=1,scales=list(tck=c(1,0),y=list(rot=90)), > panel=function(...){ > panel.qqmath(...) > panel.qqmathline(x) > }) > > ## ACF > myacf <- acf(x,plot=F,lag.max=24) > x0=0 > x1=24 > y0=-1 > y1=1 > ACF <- xyplot(0~0,xlim=c(x0,x1),ylim=c(y0,y1),aspect=1, > scales=list(tck=c(1,0),y=list(rot=90)), > panel=function(...){ > for(i in 1:24){ > panel.segments(i,0,i,myacf$acf[i]) > } > panel.abline(h=0) > }) > > ## plot function > plot.list <- list(xy,qq,h,ACF) > counter <- 1 > trellis.device(pdf,paper="special",width=6,height=6,file="myplot.pdf") > for(i in 1:2){ > for(j in 1:2){ > if(i==2 && j==2) print(plot.list[[counter]], split=c(j,i,2,2)) > else print(plot.list[[counter]], split=c(j,i,2,2), more=TRUE) > counter <- counter + 1 > } > } > dev.off() > > } > > > x <- rexp(1000) > res.plots(x) >