我有一个多变量时间序列,其中一些变量的范围较大。我希望制作一个单页图,其中每个变量具有多个堆叠图,其中一些变量的y轴比例为log10。我对晶格还比较陌生,还无法弄清楚如何有效地将log10缩放比例与未转换的轴混合使用,并获得出版质量图。如果使用print.trellis,则图未对齐且填充需要做一些工作;如果使用c.trellis,则布局良好,但仅使用来自一个图的y缩放。关于有效解决方案的任何建议,在这里我可以为每个(原始)对象使用不同的y缩放比例来复制c.trellis的输出?
下面的例子:
require(lattice)
require(latticeExtra)
# make data.frame
d.date <- as.POSIXct(c("2009-12-15", "2010-01-15", "2010-02-15", "2010-03-15", "2010-04-15"))
CO2dat <- c(100,200,1000,9000,2000)
pHdat <- c(10,9,7,6,7)
tmp <- data.frame(date=d.date ,CO2dat=CO2dat ,pHdat=pHdat)
# make plots
plot1 <- xyplot(pHdat ~ date, data=tmp
, ylim=c(5,11)
, ylab="pHdat"
, xlab="Date"
, origin = 0, border = 0
, scales=list(y=list(alternating=1))
, panel = function(...){
panel.xyarea(...)
panel.xyplot(...)
}
)
# make plot with log y scale
plot2 <- xyplot(CO2dat ~ date, data=tmp
, ylim=c(10,10^4)
, ylab="CO2dat"
, xlab="Date"
, origin = 0, border = 0
, scales=list(y=list(alternating=1,log=10))
, yscale.components = yscale.components.log10ticks
, panel = function(...){
panel.xyarea(...)
panel.xyplot(...)
# plot CO2air uatm
panel.abline(h=log10(390),col="blue",type="l",...)
}
)
# plot individual figures using split
print(plot2, split=c(1,1,1,2), more=TRUE)
print(plot1, split=c(1,2,1,2), more=F)
# combine plots (more convenient)
comb <- c(plot1, plot2, x.same=F, y.same=F, layout = c(1, 2))
# plot combined figure
update(comb, ylab = c("pHdat","log10 CO2dat"))
最佳答案
使用@joran的想法,我可以使轴更接近但不精确。同样,减少填充可使它们靠得更近,但会改变长宽比。在下面的图片中,我已经减少了太多的填充以显示不正确;如果需要关闭,您显然也希望删除顶部的x轴标签。
我查看了设置布局的代码,左侧的边距是根据标签的宽度计算得出的,因此@joran的想法可能是唯一可以基于split
进行打印的东西,除非重写plot.trellis
命令。也许c
方法可以工作,但是我还没有找到一种方法来根据面板分别设置比例分量。不过,这似乎确实更有希望。
mtheme <- standard.theme("pdf")
mtheme$layout.heights$bottom.padding <- -10
plot1b <- update(plot1, scales=list(y=list(alternating=1, at=5:10, labels=paste(" ",c(5:10)))))
plot2b <- update(plot2, par.settings=mtheme)
pdf(file="temp.pdf")
print(plot2b, split=c(1,1,1,2), more=TRUE)
print(plot1b, split=c(1,2,1,2), more=F)