You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:57:48