lattice или latticeExtra объединяют несколько графиков с разным масштабированием (log10 и без преобразования) - PullRequest
5 голосов
/ 27 февраля 2012

У меня есть несколько переменных временных рядов, где некоторые переменные имеют довольно большие диапазоны. Я хочу сделать одностраничный график с несколькими сложенными графиками для каждой переменной, где некоторые переменные имеют масштабирование по оси y log10. Я относительно новичок в решетке и не смог понять, как эффективно смешать масштабирование log10 с нетрансформированными осями и получить график качества публикации. Если используется print.trellis, графики не выровнены, и заполнение требует некоторой работы, если используется c.trellis, компоновка хороша, но используется только y-масштабирование только из одного графика. Какие-нибудь предложения для эффективного решения, где я могу воспроизвести выходные данные c.trellis, используя различное y-масштабирование для каждого (оригинального) объекта? Пример ниже:

    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 Ответ

1 голос
/ 29 февраля 2012

Используя идею @ 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)   

enter image description here

...