为何无法修改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"))
问题原因
- ggsurvplot的
size参数设计逻辑:该参数仅支持两种输入——单一数值(统一设置所有线条粗细)或字符串"strata"(让ggplot自动为每个分层分配不同粗细),不支持直接传入数值向量指定分层的线条粗细,因此直接传c(1,1,3,...)不会生效。 - 直接使用
scale_size_manual失败的原因:ggsurvplot生成的默认绘图对象中,并未将size美学映射到分层变量(severity_fac),因此单独添加scale_size_manual无法找到对应的映射关系,导致设置无效。
解决方案
步骤说明
- 先正常生成ggsurvplot对象,无需在初始参数中设置
size。 - 查看分层变量的顺序,确保后续指定的粗细向量与分层顺序完全对应。
- 提取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
相关产品推荐
相关产品推荐

