如何在R中绘制NEJM风格嵌套放大Y轴的生存曲线?
复刻NEJM风格嵌套放大生存曲线的解决方案
我明白你想要复刻《新英格兰医学杂志》那种在主生存图中嵌套Y轴放大子图的风格,之前用viewport没成功,核心原因是ggsurvplot返回的不是单一ggplot对象,而是包含生存图、风险表等元素的复合列表,直接对整个列表使用print+viewport会导致渲染异常。下面给你两种可行的实现方案:
方案一:用annotation_custom嵌入子图(更简洁)
这种方法直接把放大子图作为元素添加到主生存图中,再和风险表组合,代码更易维护:
library("survival") library("survminer") library("ggplot2") library("grid") library("gridExtra") # 1. 拟合生存模型 fit <- survfit(Surv(time, status) ~ sex, data = lung) # 2. 生成带风险表的主生存图 p_main <- ggsurvplot( fit, data = lung, pval = TRUE, fun = "pct", risk.table = TRUE, size = 1, tables.theme = theme_cleantable() ) # 3. 生成Y轴放大的子图(仅保留生存曲线,去掉冗余元素) p_zoom <- ggsurvplot( fit, data = lung, fun = "pct", ylim = c(50, 100), pval = FALSE, risk.table = FALSE, legend = FALSE )$plot # 提取纯ggplot对象 # 4. 将子图转换为grob并嵌入主图右上角 zoom_grob <- ggplotGrob(p_zoom) p_main_with_zoom <- p_main$plot + annotation_custom( grob = zoom_grob, xmin = max(lung$time)*0.6, xmax = max(lung$time), # X轴位置范围 ymin = 0, ymax = 50 # Y轴位置范围,对应主图的下部区域 ) # 5. 组合带嵌入子图的主图和风险表 ggarrange(p_main_with_zoom, p_main$table, ncol = 1, nrow = 2, heights = c(3, 1))
方案二:用grid的viewport手动控制(更灵活)
如果需要更精确地调整子图的位置和大小,推荐用这种手动绘制的方式:
library("survival") library("survminer") library("ggplot2") library("grid") library("gridExtra") fit <- survfit(Surv(time, status) ~ sex, data = lung) # 1. 生成主图并转换为复合grob(包含生存图+风险表) p1 <- ggsurvplot( fit, data = lung, pval = TRUE, fun = "pct", risk.table = TRUE, size = 1, tables.theme = theme_cleantable() ) p1_grob <- arrangeGrob(p1$plot, p1$table, ncol = 1, nrow = 2, heights = c(3, 1)) # 2. 生成放大子图的纯ggplot对象并转成grob p2_plot <- ggsurvplot( fit, data = lung, pval = FALSE, fun = "pct", ylim = c(50, 100), legend = FALSE )$plot p2_grob <- ggplotGrob(p2_plot) # 3. 手动绘制主图+嵌入子图 grid.newpage() grid.draw(p1_grob) # 创建自定义viewport(调整参数控制子图大小和位置) vp <- viewport(width = 0.35, height = 0.35, x = 0.8, y = 0.75) pushViewport(vp) grid.draw(p2_grob) popViewport()
关键注意事项
- 调整
viewport的width/height/x/y参数,或者annotation_custom的坐标范围,可以精准控制子图的位置和大小,直到匹配NEJM的风格 - 如果需要在子图中保留p值或图例,修改
ggsurvplot的对应参数即可 - 确保子图的X轴范围和主图一致,这样嵌套的曲线逻辑更连贯
内容的提问来源于stack exchange,提问作者hqgu
相关产品推荐
相关产品推荐

