lattice或latticeExtra结合多个不同的yscaling(log10和non-transformed)

时间:2012-02-27 16:12:56

标签: r lattice

我有一个多变量时间序列,其中一些变量的范围相当大。我希望制作一个单页图,其中每个变量的多个堆积图都有一些变量具有log10 y轴缩放。我对格子比较陌生,并且无法弄清楚如何有效地将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"))

1 个答案:

答案 0 :(得分:1)

使用@joran的想法,我可以让轴更近但不精确;此外,减少填充会使它们更紧密,但会改变纵横比。在下面的图片中,我已经减少了填充量太多,以显示不准确;如果需要这种关闭,你显然也想要删除顶部的x轴标签。

我查看了设置布局的代码,左侧的边距是根据标签的宽度计算出来的,所以@joran的想法可能是基于使用{{1}进行打印的唯一方法除非有人重写split命令。也许plot.trellis方法可以工作,但我还没有找到一种方法来根据面板单独设置比例组件。但这似乎更有希望。

c

enter image description here