2013-08-03 70 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。重新缩放数据的解决方案也可以运行(但不那么直观/自然)。 –