如何在R基础plot()函数中实现类似ggplot的position = "dodge"效果?
用R基础绘图实现cuminc曲线的分组避让(类似ggplot的position="dodge")
我明白你遇到的问题——ggcompetingrisks()的美学效果不符合需求,又没法直接用ggplot搭配cuminc(),只能靠基础绘图来实现分组曲线的避让。下面我给你一套手动实现的方案,核心思路是给不同组的x轴坐标添加偏移量,让曲线错开不重叠:
步骤1:准备数据与提取cuminc结果
首先确保你加载了cmprsk包,先获取cuminc()的输出对象。这里我用模拟数据做示例,你可以替换成自己的真实数据:
library(cmprsk) # 模拟示例数据 set.seed(123) time <- rexp(200) # 生存时间 status <- sample(0:2, 200, replace = TRUE) # 结局状态(0=删失,1/2=不同事件) group <- factor(sample(c("对照组", "干预组"), 200, replace = TRUE)) # 分组变量 # 计算累积发生率 cm_obj <- cuminc(time = time, status = status, group = group)
步骤2:设置避让偏移量
我们需要给每个组的时间轴坐标添加一个小偏移,让曲线横向错开。偏移量的大小可以根据你的时间范围灵活调整:
# 选择要可视化的终点(比如第一个事件类型,对应cm_obj$`1`) target_endpoint <- cm_obj$`1` group_names <- names(target_endpoint$est) n_groups <- length(group_names) # 定义避让宽度(可根据x轴范围调整,比如时间范围大就调大一点) dodge_width <- 0.03 # 生成每个组对应的偏移值,让各组居中分布 offsets <- seq(-(n_groups-1)*dodge_width/2, (n_groups-1)*dodge_width/2, by = dodge_width)
步骤3:用基础绘图实现避让效果
先初始化画布,再依次叠加各组曲线,每个组都加上对应的偏移量:
# 初始化绘图(先画第一组) plot( x = target_endpoint$time + offsets[1], y = target_endpoint$est[[1]], type = "s", # 阶梯线,符合累积发生率曲线的样式 xlab = "随访时间", ylab = "累积发生率", ylim = c(0, max(unlist(target_endpoint$est))), # 统一y轴范围 col = "#1f77b4", # 自定义颜色 lwd = 2, main = "分组累积发生率曲线(基础绘图避让版)" ) # 叠加其他组的曲线 for (i in 2:n_groups) { lines( x = target_endpoint$time + offsets[i], y = target_endpoint$est[[i]], type = "s", col = c("#ff7f0e")[i-1], # 对应第二组的颜色 lwd = 2 ) } # 添加网格(可选,提升可读性) grid(lty = 2, col = "gray80") # 添加图例 legend( "bottomright", legend = group_names, col = c("#1f77b4", "#ff7f0e"), lwd = 2, bty = "n" # 去掉图例边框 )
关键细节说明
- 偏移量
dodge_width:如果你的时间轴范围很大(比如以年为单位,范围0-10),可以把这个值调到0.2左右,确保曲线明显错开但不违和;如果时间范围小,就用更小的值。 - 多终点处理:如果要展示多个事件类型,你可以用不同的线型(
lty参数)区分,或者分画布绘制。 - 样式自定义:基础绘图的优势就是自由度高,你可以通过
col、lwd、font等参数完全自定义图形美学,解决ggcompetingrisks()的样式问题。
内容的提问来源于stack exchange,提问作者aiali
相关产品推荐
相关产品推荐

