2012-03-11 40 views
2

我想獲得多頁面二維格子面板圖在多個頁面上具有相同的調節佈局。垂直排列應該是多頁格子面板排列

CCC 
BBB 
AAA 

在每頁上。我知道如何手動執行此操作,但代碼很難看,特別是如果最後一頁未完全填充。

在2010年的SO線程中,我讀到這是ggplot2的「列表」。

library(lattice) 
d = expand.grid(f1 = as.factor(letters[1:10]), 
      f2 = as.factor(LETTERS[1:3]), 
      x = 0:10) 
d$y = rnorm(nrow(d)) 
xyplot(y~x|f1+f2,data=d,cex=0.5,pch=16,layout=c(5,3,2)) 

請注意,所有A位於第一頁,其次是B,然後是B和C在最後一頁。

編輯下面的Gabor的想法

library(lattice) 
library(latticeExtra) 

# Note: changed so that it does not fill the three pages 
d <- expand.grid(f1 = as.factor(letters[1:8]), 
      f2 = as.factor(LETTERS[1:3]), 
      x = 0:10) 
d$y <- rnorm(nrow(d)) 
page <- factor((as.numeric(d$f1) - 1) %/% 5 + 1) 
# The second (=last) page has different panel sizes 
# Using aspect does not help 
for(pg in levels(page)) { 
    p <- xyplot(y ~ x|f1+f2, data = d[pg == page, ], cex = .5, pch = 16, 
      layout = c(5, 3)) 
    print(useOuterStrips(p)) 
} 

回答

3

面板的佈局可以通過寫一個新packet.panel功能,可自動繪製的實現面板在所需的地方。

packet.panel.bycolumn <- function (layout, condlevels, page, row, column, skip) { 
    dims <- sapply(condlevels, length) 
    if(layout[2] != dims[2]) { 
    stop("rows in layout must be equal to rows of second conditioning variable") 
    } 
    panels.per.row <- layout[1] 
    panels.per.column <- layout[2] 
    total.columns <- dims[1] 
    panels.needed <- total.columns * panels.per.column 
    panels.per.page <- layout[1] * layout[2] 
    pages.needed <- ceiling(panels.needed/panels.per.page) 
    empty.columns <- (panels.per.row - total.columns) %% panels.per.row 
    panel.matrix <- rbind(matrix(1:panels.needed,ncol=panels.per.column), 
         matrix(NA, nrow=empty.columns, ncol=panels.per.column)) 
    panel.order <- as.vector(aperm(array(panel.matrix, 
             dim=c(panels.per.row, pages.needed, panels.per.column)), 
           c(1,3,2))) 
    packet.order <- do.call(expand.grid, condlevels)[panel.order,] 
    panel.number <- 1 + (page - 1) * panels.per.page + (row - 1) * panels.per.row + (column - 1) 
    out <- as.numeric(packet.order[panel.number, ]) 
    if (any(is.na(out))) out <- NULL 
    out 
} 

useOuterStrips將改變佈局,但它可以事後改回來。所期望的結果,可以實現這樣的:

p <- xyplot(y~x|f1+f2, data=d, cex=0.5, pch=16) 
p <- useOuterStrips(p) 
p <- update(p, layout=c(5,3)) 
plot(p, packet.panel=packet.panel.bycolumn) 

enter image description here

enter image description here

+0

中,我從來沒有在最後一頁上找到針對不同面板尺寸的滿意解決方案。非常好。我已經通過你的解決方案,這是對數據包功能的簡化。不知道它是否一般,但似乎在這裏工作:'packet.panel.bycolumn < - 函數(佈局,condlevels,頁面,行,列,跳過){x < - c(layout [1] *(page - 1 )+列,行); if(x [1] <= length(condlevels [[1]]))x}' – 2012-03-13 00:21:45

+0

很好的簡化,謝謝!我直接從默認函數中獲取代碼並根據需要進行修改;我應該更多地考慮它實際上在做什麼! – Aaron 2012-03-13 01:06:48

+0

太棒了!我會寫信給Deepayan,使之成爲latticeExtra的一部分。 – 2012-03-13 14:11:57

3

假設什麼都想有兩頁有:每個頁面的第二行中

  • C中的每個頁面
  • B的第一行
  • A在每頁的最後一行

  • ABCDE在第一頁列和
  • FGHIJ在第二頁列

那就試試這個:

p <- xyplot(y ~ x | f2:f1, data = d, cex = 0.5, pch = 16, layout = c(5, 3, 2)) 
ix <- c(aperm(array(1:30, c(5, 2, 3)), c(1, 3, 2))) 
p[ix] 

一定要注意平整變化xyplot公式。

頁面同時

另一種方法是輸出一次一個頁面:

page <- factor((as.numeric(d$f1) - 1) %/% 5 + 1) 
for(pg in levels(page)) { 
    p <- xyplot(y ~ x|f1+f2, data = d[pg == page, ], cex = .5, pch = 16) 
    plot(p, layout = c(5, 3)) 
} 
+0

謝謝,伽柏。這不是自動的,但面板索引的概念看起來非常靈活。 – 2012-03-12 07:02:38

+0

然而a:A形式的輸出沒有很好的面子(從另一個世界竊取)。替代建議,保護panal佈局歡迎;使用OuterStrip外觀首選。 – 2012-03-12 07:12:52

+0

問題是,Aa表單旨在顯示一個立方體,但這裏所要求的並不代表一個立方體(即沒有單獨的尺寸和水平的置換,這將給出期望的輸出),而是代表兩個切片多維數據集 - 每頁一個。已經添加了第二種方法分別繪製每個切片/頁面。 – 2012-03-12 15:12:06