网格包:在一个对象中保存多个 grobs 的图

grid package: Save plot of multiple grobs in one object

我正在将多个 grob 组合到一张图像中。我可以将输出保存到 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() 我可以在其中传递 grob 和视口,但输出是错误的:

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

当然它不知道哪个grob属于哪个viewport。

如果我这样画就可以了:

grid.draw(ggplotGrob(plot))

pushViewport(vipo)

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

popViewport()

我怎样才能像保存 ggplot 那样保存它?

几个选项:

使用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)