有没有一种方法可以将带有一系列grid。*的函数转换为对grob / gTree的视口调用?

时间:2020-02-25 19:28:04

标签: r r-grid

是否有一种简单的方法,可以通过对grid。*函数和视口操作的一系列调用来获取任意函数,如下面的第一个函数,并取回gTree / grob对象(如第二个函数生成的对象)?

我问,因为使用grid。*函数逐步创建图要比使用相当笨拙的语法来创建复杂的gTree容易得多。但是,当您需要在较大的绘图元素或组合绘图中使用绘图时,我倾向于将它们以gTree形式而不是自己写入绘图设备。

一段时间以来,我一直在苦苦挣扎grid,即使在深入研究文档之后,我仍觉得自己错过了一些东西,似乎必须有一种更简单的方法来创建复杂的gTree ?

library(grid)

plotter <- function(x){
  pushViewport(viewport(gp = gpar(fill = "white", col = "black", lwd = 2)))
  grid.rect(
    width = 0.3, height = 0.8,
    gp = gpar(fill = "red")
  )
}

grid.newpage()
plotter()


plotter2 <- function(x) {
  g <- gTree()
  g <- addGrob(
    g,
    rectGrob(
      width = 0.3, height = 0.8,
      gp = gpar(fill = "red"),
      vp = "vp"
    )
  )
  g$childrenvp <- viewport(name = "vp", gp = gpar(fill = "white", col = "black", lwd = 2))
  g
}

grid.newpage()
grid.draw(plotter2())

1 个答案:

答案 0 :(得分:0)

grid.grab()函数允许您在生成图形的绘图代码调用后将其捕获为gTreegrid.grabExpr()函数允许捕获gTree,而无需从描述它的表达式中进行绘制,如下所示:

library(grid)

plotter <- function(x) {
    grid.grabExpr(expr = {
        pushViewport(viewport(gp = gpar(fill = "white", col = "black", lwd = 2)))
        grid.rect(
            width = 0.3, height = 0.8,
            gp = gpar(fill = "red")
        )
    })
}

grid.newpage()
grid.ls(plotter()) # to see the structure of the gTree
grid.draw(plotter())