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

为何无法修改ggsurvplot特定线条尺寸?求解决方法

关于ggsurvplot自定义特定生存曲线线条粗细的问题

问题描述

使用R语言的ggsurvplot绘制生存曲线时,设置size = 1可以正常生成统一粗细的曲线,但尝试将size改为c(1, 1, 3, 1, 1, 1, 1)以加粗某一条特定线条时操作无效;设置size = "strata"会让所有线条呈现不同粗细,但无法指定目标线条。提取ggsurvplot的plot对象后使用scale_size_manual也未成功。

原代码:

res.cox_sam = survfit(Surv(time, event) ~ severity_fac, data = spec_variant_samples)

sp = ggsurvplot(res.cox_sam,
       size = 1,
       fun = "event",
       conf.int =  F,
       xlim = c(40, 100), risk.table = "abs_pct", pval = TRUE, surv.median.line = "hv",
       xlab = "Age in years", 
       ylab = "Cumulative event",
       break.time.by = 10,
       font.legend = c(15),
       legend.title="",
       font.tickslab = c(15),
       font.x = c(15, "bold"),
       font.y = c(15, "bold"))

修改后无效的代码:

res.cox_sam = survfit(Surv(time, event) ~ severity_fac, data = spec_variant_samples)

sp = ggsurvplot(res.cox_sam,
       size = c(1, 1, 3, 1, 1, 1, 1),
       fun = "event",
       conf.int =  F,
       xlim = c(40, 100), risk.table = "abs_pct", pval = TRUE, surv.median.line = "hv",
       xlab = "Age in years", 
       ylab = "Cumulative event",
       break.time.by = 10,
       font.legend = c(15),
       legend.title="",
       font.tickslab = c(15),
       font.x = c(15, "bold"),
       font.y = c(15, "bold"))

问题原因

  1. ggsurvplot的size参数设计逻辑:该参数仅支持两种输入——单一数值(统一设置所有线条粗细)或字符串"strata"(让ggplot自动为每个分层分配不同粗细),不支持直接传入数值向量指定分层的线条粗细,因此直接传c(1,1,3,...)不会生效。
  2. 直接使用scale_size_manual失败的原因:ggsurvplot生成的默认绘图对象中,并未将size美学映射到分层变量(severity_fac),因此单独添加scale_size_manual无法找到对应的映射关系,导致设置无效。

解决方案

步骤说明

  1. 先正常生成ggsurvplot对象,无需在初始参数中设置size。
  2. 查看分层变量的顺序,确保后续指定的粗细向量与分层顺序完全对应。
  3. 提取ggsurvplot内部的ggplot对象,显式将size美学映射到分层变量,再用scale_size_manual指定各分层的线条粗细。

示例代码

res.cox_sam = survfit(Surv(time, event) ~ severity_fac, data = spec_variant_samples)

# 查看分层顺序,确保后续values向量顺序正确
print(names(res.cox_sam$strata))

# 生成基础生存曲线
sp = ggsurvplot(res.cox_sam,
       fun = "event",
       conf.int = F,
       xlim = c(40, 100), risk.table = "abs_pct", pval = TRUE, surv.median.line = "hv",
       xlab = "Age in years", 
       ylab = "Cumulative event",
       break.time.by = 10,
       font.legend = c(15),
       legend.title="",
       font.tickslab = c(15),
       font.x = c(15, "bold"),
       font.y = c(15, "bold"))

# 修改特定分层的线条粗细
sp$plot = sp$plot +
  aes(size = severity_fac) +  # 将size映射到分层变量
  scale_size_manual(values = c(1, 1, 3, 1, 1, 1, 1))  # 对应分层顺序设置粗细

# 展示修改后的生存曲线
print(sp)

注意事项

  • 必须保证scale_size_manual中values向量的顺序与names(res.cox_sam$strata)输出的分层顺序完全一致,否则会出现粗细对应错误的情况。
  • 如果不需要在图例中显示线条粗细的区分,可以添加guides(size = "none")来隐藏相关图例项。

内容的提问来源于stack exchange,提问作者M. waal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:35:39