在 R 中,如何存储插图以供以后用 grid.arrange 排列?

In R, how can I store an inset graph for later arranging it with grid.arrange?

我创建了一个图表,其中我通过以下命令插入了另一个图表(两个 ggplot2 对象):

    vp=viewPort(...)
    print(ggplotobject1)
    print(ggplotobject2, vp=vp)

这完全符合我的要求(在 viewPort 中指定的区域绘制了一个大图和一个自定义小图)。

问题是我需要稍后使用这个组合图通过以下方式再次将其与其他图一起排列:

grid.arrange(arrangeGrob(..))

有谁知道如何将组合图存储为 grob?

非常感谢!

编辑: 在这里回复 baptiste 是一个可重现的例子:

library(ggplot2)
library(gtable)
library(grid)

data<-mtcars
main_plot<-ggplot(data,aes(hp,mpg,group=cyl))+
  geom_smooth(method="lm")+geom_point()+
  facet_grid(.~gear)
sub_plot<-ggplot(data,aes(disp,wt,color))+geom_point()

gtable_main<-ggplot_gtable(ggplot_build(main_plot))
gtable_sub<-ggplot_gtable(ggplot_build(sub_plot))
gtable_show_layout(gtable_main)
gtable_main2<-gtable_add_grob(gtable_main,gtable_sub,t=4,l=4,b=1,r=1) 
grid.draw(gtable_main2)

这生成了我想要的图表,但我没能使子图的大小合适(它应该是图表左下角的一个小图表)。这可能是非常基本的,但我之前没有使用过 gtable,只使用过一点点 grid/gridExtra

非常感谢!

您可以使用 annotation_custom 或编辑 gtable 而不是打印到不同的视口。

gm <- ggplotGrob(main_plot)
gs <- ggplotGrob(sub_plot)

library(gtable)
library(grid)
panel.id <- 1
panel <- gm$layout[gm$layout$name == "panel",][panel.id,]

inset <- grobTree(gs, vp=viewport(width=unit(1,"in"), x=0.8, y=0.8,
                                  height=unit(1,"in")))
gm <- gtable_add_grob(gm, inset, l=panel$l, t=panel$t)
grid.newpage()
grid.draw(gm)