пакет сетки: сохранить график нескольких grobs в одном объекте

Собираю несколько гробов в один образ. Я могу сохранить вывод в файл в RStudio, но как я могу назначить его объекту внутри R?

Вот пример:

library(ggplot2)
library(grid)

#create the plot
plot <- ggplot(mtcars) +
          geom_point(aes(x = disp, y = mpg)) 

#create two grobs
rect <- rectGrob(gp = gpar(alpha = 0.5, col = "white"))
circle <- circleGrob(x = 0.5, y = 0.5, r = 0.2, gp = gpar(fill = "darkred"))


#create the viewport
vipo <- viewport(x = 0.8, y = 0.8, 
                just = c("centre", "centre"),
                width = 0.3, height = 0.3)

Я пробовал gTree(), где я могу передавать grobs и viewports, но вывод неверен:

plot_gtree <- gTree(children = gList(ggplotGrob(plot), rect, circle), vp = vipo)
grid.draw(plot_gtree)

введите здесь описание изображения

Конечно, он не знает, какой гроб принадлежит какому видовому экрану.

Если я нарисую его так, он отлично работает:

grid.draw(ggplotGrob(plot))

pushViewport(vipo)

grid.draw(rect)
grid.draw(circle)

popViewport()

Как я могу сохранить это, как я могу сохранить ggplot?


person Humpelstielzchen    schedule 22.08.2019    source источник


Ответы (1)


Пара вариантов:

Добавьте его на график с помощью annotation_custom:

plot = plot + annotation_custom(grobTree(rect, circle), 
                                xmin=300, xmax=400, ymin=25, ymax=30) 

но тогда вам нужно указать координаты x и y.

Или добавить его в сюжет gtable:

g = gtable::gtable_add_grob(x=ggplotGrob(plot),
                            grobs=grobTree(rect, circle, vp=vipo), 
                            t=7, l=5)

grid.newpage(); grid.draw(g)
person user20650    schedule 22.08.2019
comment
Хорошо, большое спасибо. Не могли бы вы добавить имена аргументов внутри gtable_add_grob()? - person Humpelstielzchen; 22.08.2019