使用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
相关产品推荐
相关产品推荐

