大图嵌小图

调包
r
ggplot2
Author
Published

Tuesday, August 20, 2024

由来

星球里不断有同学问到如何在一个大图中嵌入小图,这里简单介绍一下。

Q1

Q2

我们使用生存曲线及risk table作为例子,其中生存曲线是大图,risk table是小图。常见的图形为:

survival curve

想要把risk table嵌入到生存曲线中。

方法一

使用grid包,借助于grid包中的viewport函数。viewport用于定义一个绘图区域,可以在一个图形设备中创建多个独立的绘图区域,每个区域都有自己的坐标系和尺寸。

subvp <- viewport(width = 0.35, height = 0.35, x = 0.75, y = 0.75)
ggsurv$plot
print(ggsurv$table, vp = subvp)

viewport创建了一个子视口,它定义了一个相对主视口的区域。效果如下:

option 1

方法二

使用annotation_custom函数,它可以在图形中添加自定义的图形元素。

ggsurv$plot + annotation_custom(ggplotGrob(ggsurv$table), xmin=1900, xmax=3000, ymin=0.6, ymax=1)

ggplotGrob将ggsurv$table转换为grob对象,以便在图形中使用。效果如下:

option 2

方法三

使用ggpp包。

sub_plot= tibble::tibble(
    x= .98, y= .98, plot= list(ggsurv$table)
)
ggsurv$plot + 
    geom_plot_npc(data = sub_plot, aes(npcx = x, npcy = y, label = plot))

使用geom_plot_npc函数将子图添加到主图中,label表示要添加的子图。效果如下:

option 3

完整代码已经放在了星球里,感兴趣的同学可以自行查看。