Есть ли способ конвертировать функцию с последовательностью grid. * И вызовами viewport в grob / gTree? - PullRequest
1 голос
/ 25 февраля 2020

Есть ли простой способ взять произвольную функцию с серией вызовов функции grid. * И действиями в области просмотра, как первая функция ниже, и вернуть объект gTree / grob, подобный тому, который сгенерирован второй функцией?

Я спрашиваю, так как гораздо проще экспериментировать с поэтапным созданием графиков с использованием функций grid. *, Чем использовать довольно громоздкий синтаксис для создания сложных gTrees. Однако тогда, когда вам нужно использовать свои графики в рамках более крупных элементов графика или комбинированных графиков, я стремлюсь получить их в форме gTree, а не записывать их на устройство печати самостоятельно.

Я изо всех сил пытался ухватиться grid на какое-то время, и я чувствую, что что-то упустил даже после того, как углубился в документацию, кажется, что должен быть более простой способ создания сложных gTrees?

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 голосов
/ 28 февраля 2020

Функция grid.grab() позволяет вам захватить существующий чертеж как gTree при вызове после кода построения, который его создал. Функция grid.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())
...