2013-08-03 71 views
2

爲什麼這些行(通過linesGrob)未繪製在下面的圖中?gtable_add_grob():linesGrob()not displayed

require(gtable) 
base <- gtable(widths=unit(rep(1, 2), "null"), 
       heights=unit(rep(1, 3), "null")) 
grid.newpage() 
g <- 1 
for(i in 1:3) { 
    for(j in 1:2) { 
     base <- gtable_add_grob(base, 
           grobs=list(linesGrob(x=1:4, y=4:1), 
              rectGrob(gp=gpar(fill="#FF0000")), 
              textGrob(label=g)), i, j, name=1:3) 
     g <- g+1 
    } 
} 
grid.draw(base) 

回答

5

兩個原因:

  • 座標檢視區以外

  • 的rectGrob繪製在頂部和口罩它


require(gtable) 
# let's fix this name before it's too late 
gtable_add_grobs <- gtable_add_grob 

base <- gtable(widths=unit(rep(1, 2), "null"), 
       heights=unit(rep(1, 3), "null")) 
grid.newpage() 
g <- 1 
for(i in 1:3) { 
    for(j in 1:2) { 
     base <- gtable_add_grobs(base, 
           grobs=list(rectGrob(gp=gpar(fill="#FF0000")), 
              linesGrob(x=1:4, y=4:1, def="native", 
                vp=dataViewport(1:4, 1:4)), 
              textGrob(label=g)), i, j, name=1:3) 
     g <- g+1 
    } 
} 
grid.draw(base) 

注意gtable_add_grobs被矢量化,這意味着你不應該使用for循環,理想情況下。如果你把所有的grobs先組合在一起,對於一個給定的單元格,在gTree中更容易。這裏有一個簡化版本,

library(gtable) 

g <- gtable(widths = unit(c(1,1), "null"), 
      heights = unit(c(1,1), "null")) 


cell <- function(ii) 
    grobTree(rectGrob(), 
      linesGrob(1:4, 1:4, default.units="native"), 
      textGrob(ii), 
      vp=dataViewport(c(1,4), c(1,4))) 

gl <- lapply(1:4, cell) 

xy <- expand.grid(1:2, 1:2) 

g <- gtable_add_grobs(g, gl, 
         l=xy[,1], 
         r=xy[,1], 
         t=xy[,2], 
         b=xy[,2]) 


grid.newpage() 
grid.draw(g) 
+0

謝謝,巴蒂斯特。第二個原因很明顯,但第一個(?)。所有的視口都有它們默認的'NULL'值,所以不應該像在打開新頁面的情況下那樣在相應的矩形中繪製點。這是我並不真正瞭解的東西......爲什麼(以及如何)我必須指定...在'古典'網格中,我將推動視口,然後它將工作。 –

+0

gtable的每個單元格都有一個視口,當您在其中繪製一個grob時,您需要確保座標在視口內適合。一個基本的例子是'grid.newpage(); grid.lines(x = 1:4,y = 4:1,default.units =「npc」):它沒有畫任何東西,因爲'1:4'被解釋爲標準座標,從0到1。要麼重新調整數據,要麼指定視口並使用「本地」座標。 – baptiste

+0

感謝您的回答,Baptiste。重新縮放數據的解決方案也可以運行(但不那麼直觀/自然)。 –