gtable_add_grob():未显示linesGrob()
为什么线(通过gtable_add_grob():未显示linesGrob(),r,r-grid,gtable,R,R Grid,Gtable,为什么线(通过linesGrob)没有在下面的图中绘制 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,
linesGrob
)没有在下面的图中绘制
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)
require(gtable)
基本两个原因:
- 坐标位于视口之外
- rectGrob绘制在顶部并遮罩它
谢谢你,巴蒂斯特。第二个原因很清楚,但第一个(?)。所有视口都有默认的NULL
值,因此不应该像打开新页面时那样,仅在相应的矩形中绘制点。这件事我还不太明白。。。为什么(以及如何)我必须指定。。。在“经典”网格中,我会推动视口,然后它就可以工作了。GTTable的每个单元格都有一个视口,在其中绘制grob时,需要确保坐标适合视口。一个基本的例子是grid.newpage();grid.lines(x=1:4,y=4:1,default.units=“npc”)
:它不绘制任何内容,因为1:4
被解释为从0到1的标准化坐标。您需要重新缩放数据,或者指定视口并使用“本机”坐标。谢谢您的回答,Baptiste。重新缩放数据的解决方案也很有效(但不太直观/自然)。@Mariushofer我添加了一个更自然的版本,一次添加多个Grob,没有for循环。非常感谢,Baptiste,我会仔细看看。在gTree
中首先汇总某些部分是否可以避免对gTree
中的所有grob使用不同的名称?我问的原因是建议的解决方案在哪里为每个rectGrob
,textGrob
使用不同的名称。。。这很乏味。我希望所有rectGrob
、textGrob
和lineGrob
都有一个名称,比如“panel”。
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)
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)