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

如何调整ggsurvplot风险表分层颜色指示器位置并导出PDF?

调整ggsurvplot风险表分层指示器位置的解决方案

针对使用coord_cartesian限制x轴范围后,风险表中分层色块(黄色、蓝色指示器)偏右的问题,提供两种可行方案:

方案一:替换coord_cartesian为scale_x_continuous(推荐)

如果不需要保留超出x轴限制范围的生存曲线数据显示,直接用scale_x_continuous设置x轴范围,同时通过expand参数固定零点位置,避免偏移,且风险表的色块会自动对齐:

library(survival)
library(survminer)

# 拟合生存曲线(示例数据)
set.seed(123)
df <- data.frame(
  time = sample(1:100, 100, replace = TRUE),
  status = sample(0:1, 100, replace = TRUE),
  group = factor(sample(c("A", "B"), 100, replace = TRUE))
)
fit <- survfit(Surv(time, status) ~ group, data = df)

# 生成生存图+风险表,用scale_x_continuous限制x轴
p <- ggsurvplot(fit, data = df, risk.table = TRUE, ggtheme = theme_bw())
p$plot <- p$plot + scale_x_continuous(limits = c(0, 80), expand = c(0, 0))

# 导出PDF
ggsave("surv_plot.pdf", p, width = 8, height = 6)

说明

  • limits = c(0, 80):直接设置x轴显示范围,会裁剪超出该范围的数据
  • expand = c(0, 0):取消坐标轴默认的扩展间距,保证零点与绘图区域左边界对齐,避免偏移

方案二:手动调整风险表的grob元素(适配coord_cartesian场景)

如果必须保留coord_cartesian(比如需要显示超出限制范围的曲线,但仅放大指定区域),可以直接修改风险表的底层grob对象,调整色块的x轴位置:

# 生成带coord_cartesian的生存图
p <- ggsurvplot(fit, data = df, risk.table = TRUE, ggtheme = theme_bw())
p$plot <- p$plot + coord_cartesian(xlim = c(0, 80))

# 提取风险表grob并调整色块位置
adjust_indicator_pos <- function(grob, x_shift = -0.05) {
  if (inherits(grob, "gList")) {
    grob$children <- lapply(grob$children, adjust_indicator_pos, x_shift = x_shift)
  } else if (inherits(grob, "rect")) {
    # 向左偏移色块,x_shift值根据实际情况调整
    grob$x <- grob$x + unit(x_shift, "npc")
  }
  return(grob)
}

p$table <- adjust_indicator_pos(p$table, x_shift = -0.05)

# 导出PDF
ggsave("surv_plot_adj.pdf", p, width = 8, height = 6)

说明

  • 不同版本的survminer可能风险表的grob结构有差异,若上述函数未命中色块元素,可通过grid::grid.ls(p$table)查看grob层级,找到对应rect类型的元素后精准调整
  • x_shift的取值需根据实际偏移程度微调,负数为向左偏移,正数为向右偏移

内容的提问来源于stack exchange,提问作者geek45

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:11:02