如何让ggsurvplot图例文字颜色匹配线条色并保留风险表
解决ggsurvplot图例文字颜色匹配线条颜色并保留风险表的方案
核心思路
ggsurvplot是包含plot(生存曲线)和table(风险表)的列表对象,我们需要单独修改生存曲线的图例文字颜色,再将修改后的曲线与原风险表重新组合,避免破坏原对象结构。
步骤与代码示例
1. 加载依赖包并生成基础数据与模型
library(survival) library(survminer) library(ggplot2) library(gridExtra) # 生成示例生存数据 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", "C"), 100, replace = TRUE)) ) # 拟合生存模型 fit <- survfit(Surv(time, status) ~ group, data = df) # 生成带风险表的ggsurvplot对象 gg_obj <- ggsurvplot(fit, data = df, risk.table = TRUE)
2. 修改生存曲线的图例文字颜色
从原plot中提取线条颜色,动态设置图例文字颜色,避免覆盖自定义配色:
# 提取原plot的线条颜色 plot_build <- ggplot_build(gg_obj$plot) group_colors <- plot_build$data[[1]]$colour %>% unique() # 修改图例文字颜色 modified_plot <- gg_obj$plot + theme( legend.text = element_text(colour = group_colors) )
3. 重新组合生存曲线与风险表
用ggarrange保持原布局比例:
# 组合图形与风险表,调整高度比例匹配原ggsurvplot样式 final_plot <- ggarrange(modified_plot, gg_obj$table, ncol = 1, nrow = 2, heights = c(3, 1))
4. 自定义配色场景适配
如果使用了自定义调色板,方法完全兼容,无需额外修改:
# 生成带自定义配色的ggsurvplot gg_obj_custom <- ggsurvplot(fit, data = df, risk.table = TRUE, palette = c("#E41A1C", "#377EB8", "#4DAF4A")) # 提取自定义颜色并修改图例 plot_build_custom <- ggplot_build(gg_obj_custom$plot) group_colors_custom <- plot_build_custom$data[[1]]$colour %>% unique() modified_plot_custom <- gg_obj_custom$plot + theme( legend.text = element_text(colour = group_colors_custom) ) # 组合最终图形 final_plot_custom <- ggarrange(modified_plot_custom, gg_obj_custom$table, ncol = 1, nrow = 2, heights = c(3, 1))
为什么之前的方法失效?
- 直接替换
ggsurvplot$plot会破坏对象内部关联数据,导致报错; plot1 + fitgraph$table无效是因为ggplot的加法不支持直接拼接风险表的grob对象,必须用网格布局工具组合。
内容的提问来源于stack exchange,提问作者Timmo83
相关产品推荐
相关产品推荐

