折线图x轴数据分箱:按8周间隔统计各治疗组平均logCD4
要实现按8/16/24/32/40周标准化随访节点展示各治疗组logCD4均值,有两种常用实现方案:
方案1:直接用ggplot内置统计变换,无需提前汇总数据
无需修改原始数据集,通过stat_summary直接在绘图时分组计算均值,代码更简洁:
library(dplyr) library(ggplot2) # 先清理字段:提取随访周数的数值格式,过滤无有效随访标识的基线数据 dataset2_clean <- dataset2 %>% filter(!is.na(week_int)) %>% mutate(visit_week = as.numeric(sub(" weeks", "", week_int))) # 绘图 ggplot(dataset2_clean, aes(x = visit_week, y = logCD4, color = treatment, group = treatment)) + # 绘制均值点 stat_summary(fun = mean, geom = "point", size = 2) + # 绘制均值连线 stat_summary(fun = mean, geom = "line", linewidth = 1) + # 可选:添加误差棒显示标准误,不需要可删除该行 stat_summary(fun.data = mean_se, geom = "errorbar", width = 1) + # 固定x轴刻度为预设随访节点 scale_x_continuous(breaks = c(8,16,24,32,40), labels = paste0(c(8,16,24,32,40), "周")) + labs(x = "随访周数", y = "logCD4均值", color = "治疗方案")
方案2:提前手动汇总统计量再绘图
自由度更高,方便后续复用汇总后的统计结果:
library(dplyr) library(ggplot2) # 按治疗组+随访节点分组计算均值、标准误 summary_data <- dataset2 %>% filter(!is.na(week_int)) %>% mutate(visit_week = as.numeric(sub(" weeks", "", week_int))) %>% group_by(treatment, visit_week) %>% summarise( mean_logCD4 = mean(logCD4, na.rm = TRUE), se_logCD4 = sd(logCD4, na.rm = TRUE)/sqrt(n()), .groups = "drop" ) # 用汇总后的数据绘图 ggplot(summary_data, aes(x = visit_week, y = mean_logCD4, color = treatment)) + geom_point(size = 2) + geom_line(linewidth = 1) + # 可选:添加误差棒,不需要可删除该行 geom_errorbar(aes(ymin = mean_logCD4 - se_logCD4, ymax = mean_logCD4 + se_logCD4), width = 1) + scale_x_continuous(breaks = c(8,16,24,32,40), labels = paste0(c(8,16,24,32,40), "周")) + labs(x = "随访周数", y = "logCD4均值", color = "治疗方案")
注意事项
- 你原有代码中y变量写的是
logcd4,但数据集列名是logCD4,注意大小写匹配否则会报错 - 如果需要保留0周基线数据,可先把基线对应的
week_int空值替换为0 weeks后再处理即可
内容的提问来源于stack exchange,提问作者shibainu16
相关产品推荐
相关产品推荐

