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

使用ggcompetingrisks绘图时如何修改置信区间的美学映射

问题说明

使用survminer包ggcompetingrisks()函数绘制竞争风险累计发生率曲线时,若直接覆写图对象的顶层mapping调换线条颜色、线型的映射分组,会出现置信区间颜色与对应曲线颜色不匹配的问题。原因是置信区间为独立的geom_ribbon图层,其美学映射在图层生成时已在本地定义,不会自动继承后续修改的顶层映射规则。

置信区间与曲线颜色不匹配的效果图
注:示例仅使用小部分数据子集,图示结果参考性有限

原有问题代码
p3 <- ggcompetingrisks(fit = x, 
                       multiple_panels = F, 
                       ggtheme = theme_minimal(),
                       coef = 1.96, # 95%置信区间
                       conf.int = T,
                       xlim = c(0, 15),
                       ylim = c(0, 0.1),
                       xlab = "Days", 
                       ylab = "Probability",
                       title = "Cumulative Incidence by Time Period") +
  theme(plot.title = element_text(hjust = 0.5), # 标题居中
        axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 0)), # 调整y轴标签边距
        axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 0, l = 0))) + # 调整x轴标签边距
  scale_color_manual(labels = c("Period 1","Period 2","Period 3"),  
                     values = c("#9ef0f0", "#08bdba", "#0f62fe"), 
                     name = element_blank())   # 隐藏图例标题
# 仅修改顶层映射,未同步更新置信区间图层
p3$mapping <- aes(x = time, y = est, colour = group, linetype = event) 

p3

可复现示例数据

以下代码可构造绘图所用的cuminc对象:

x <- 
structure(list(`1 1` = list(time = c(0, 6, 6, 7, 7, 8, 8, 10, 10, 11, 11, 14, 14, 15, 15), 
                            est = c(0, 0, 0.002714939, 0.002714939, 0.025168630, 0.025168630, 0.029488245, 0.029488245, 0.035423797, 0.035423797, 0.04164908, 0.04164908, 0.04553497, 0.04553497, 0.04689997), 
                            var = c(0, 0, 2.452515e-06, 2.452515e-06, 2.289665e-05, 2.289665e-05, 2.734325e-05, 2.734325e-05, 3.402077e-05, 3.402077e-05,4.129261e-05, 4.129261e-05, 4.597699e-05, 4.597699e-05, 4.770832e-05)), 
               
               `2 1` = list(time = c(0, 5, 5, 6, 6, 7, 7, 10, 10, 11, 11, 12, 12, 14, 14), 
                            est = c(0, 0, 0.001256405, 0.001256405, 0.005138794, 0.005138794, 0.013189197, 0.013189197, 0.016127006, 0.016127006,0.02671412, 0.02671412, 0.02829462, 0.02829462, 0.04365371), 
                            var = c(0, 0, 1.578565e-06, 1.578565e-06, 6.577619e-06, 6.577619e-06, 1.719998e-05, 1.719998e-05, 2.140657e-05, 2.140657e-05, 3.681209e-05, 3.681209e-05, 3.918992e-05, 3.918992e-05, 6.379430e-05)), 
               
               `3 1` = list(time = c(0, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,  9,  9, 10, 10), 
                            est = c(0, 0, 0.001532092, 0.001532092, 0.004695122, 0.004695122, 0.007942922, 0.007942922, 0.011258385, 0.011258385, 0.01647932, 0.01647932, 0.01826306, 0.01826306, 0.02565641), 
                            var = c(0,0,2.347337e-06,2.347337e-06,7.326912e-06,7.326912e-06,1.254441e-05,1.254441e-05,1.794701e-05,1.794701e-05, 2.681038e-05, 2.681038e-05, 2.989403e-05, 2.989403e-05, 4.302871e-05)),
              
               Tests = structure(c(74.0658010607094, 89.5877719522838, 3.10862446895044e-15, 0, 4, 4), 
                                 .Dim = 2:3, 
                                 .Dimnames = list(c("1", "2"), c("stat", "pv", "df")))), class = "cuminc") 
修复方法

需要同步修改置信区间图层的本地美学映射,同时配置填充色标度和线条色保持一致,步骤如下:

  • 生成基础图时,新增scale_fill_manual配置,填充色取值、标签、图例设置与scale_color_manual完全一致
  • 修改顶层映射时,补充fill = group的映射规则
  • 遍历图中所有图层,定位到置信区间对应的GeomRibbon图层,将其颜色、填充的映射分组同步修改为group,和主曲线规则保持一致

修复后的完整代码:

library(survminer)
library(ggplot2)

p3 <- ggcompetingrisks(fit = x, 
                       multiple_panels = F, 
                       ggtheme = theme_minimal(),
                       coef = 1.96,
                       conf.int = T,
                       xlim = c(0, 15),
                       ylim = c(0, 0.1),
                       xlab = "Days", 
                       ylab = "Probability",
                       title = "Cumulative Incidence by Time Period") +
  theme(plot.title = element_text(hjust = 0.5),
        axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 0, l = 0))) +
  scale_color_manual(labels = c("Period 1","Period 2","Period 3"),  
                     values = c("#9ef0f0", "#08bdba", "#0f62fe"), 
                     name = element_blank()) +
  # 填充色标度与线条色完全匹配
  scale_fill_manual(labels = c("Period 1","Period 2","Period 3"),  
                    values = c("#9ef0f0", "#08bdba", "#0f62fe"), 
                    name = element_blank())

# 修改顶层映射,补充fill分组规则
p3$mapping <- aes(x = time, y = est, colour = group, linetype = event, fill = group)

# 同步修改置信区间ribbon图层的本地映射
for (i in seq_along(p3$layers)) {
  if (inherits(p3$layers[[i]]$geom, "GeomRibbon")) {
    p3$layers[[i]]$mapping <- aes(
      x = time,
      ymin = low,
      ymax = up,
      colour = group,
      fill = group,
      linetype = event
    )
  }
}

p3

运行代码后,置信区间的填充色、描边色将与对应分组的曲线颜色完全匹配,同时保留线型区分事件类型的设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:48:25