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

如何用ggplot绘制多分组/多亚组森林图(R语言)

R多亚组森林图绘制求助

我是R与RStudio新手,正在做咖啡摄入量与认知表现(MoCA评分)的亚组分析:咖啡摄入量分为<1杯/天、1杯/天、2-3杯/天、4-5杯/天、>5杯/天,计划按性别(女性vs男性)和年龄(<80岁vs>80岁)拆分亚组。目前只能单独绘制单个亚组的森林图,无法将多个亚组结果整合到同一图中,细节如下:

1. 亚组数据拆分代码

dt_bsl_women <- dt_bsl[dt_bsl$pat.sex=="Female",]
dt_bsl_men <- dt_bsl[dt_bsl$pat.sex=="Male",]
dt_bsl_old <- dt_bsl[dt_bsl$age.bl>80,]
dt_bsl_young <- dt_bsl[dt_bsl$age.bl<=80,]
dt_bsl_men_old <- dt_bsl[dt_bsl$pat.sex=="Male"&dt_bsl$age.bl>80,]
dt_bsl_men_young <- dt_bsl[dt_bsl$pat.sex=="Male"&dt_bsl$age.bl<=80,]
dt_bsl_women_old <- dt_bsl[dt_bsl$pat.sex=="Female"&dt_bsl$age.bl>80,]
dt_bsl_women_young <- dt_bsl[dt_bsl$pat.sex=="Female"&dt_bsl$age.bl<=80,]

2. 单个亚组(仅男性)的模型与绘图代码

# 构建混合效应模型
mod_bsl <- lmer (moca.merged ~ exposure + age.bsl.centered + education + 
                  bmi.centered + sport + active_smoker + prev.stroke + prev.diabetes + 
                  prev.hypertonie + gds.cat + 
                    (1|center) + crphs + il6, data= subset(dt_bsl_men , dt_bsl_women))
# 计算置信区间
ci <- confint(mod_bsl, oldNames=FALSE)
output <- tidy(mod_bsl, conf.int=TRUE, exponentiate=FALSE, effects="fixed")[,1]
kable(output[,c(1,2,7,8,6)], digits=c(2,2,2,2,3))

# 绘制单个亚组森林图
res <- data.frame("term"=c("1", "2-3", "4-5", ">5"), 
                  "estimate" = summary(mod_bsl)$coefficients[2:5,1], 
                  "conf.low" = ci[4:7,1], 
                  "conf.high"= ci[4:7,2])
res$term <- factor(res$term, levels=c("1", "2-3", "4-5", ">5"))

ggplot(res, aes(y = estimate, x = term, col=term)) +
    geom_pointrange(aes(ymin = conf.low, ymax = conf.high), size = 0.8)+
    geom_hline(yintercept = 0, linetype = "dotted", size = 1) +
    labs(title="MoCA-Scores in men with different coffee consumption", y = "Effect estimate on MoCA-score", x = "Consumed cups of coffee per day") +
    coord_flip(ylim = c(-6, 8)) +
    theme_bw()+
    theme(legend.position="none", axis.text=element_text(size=14, face = "bold"), axis.title=element_text(size=18), plot.title = element_text(size=22))

3. 当前输出效果

单个男性亚组的MoCA评分森林图

4. 目标效果

希望绘制类似下图的多亚组森林图,将仅男性、仅女性、80岁以上男性、80岁以上女性等所有亚组的结果整合到同一图中:

目标多亚组森林图

已尝试的方法(未成功)

  • 在lmer函数中直接添加多个数据集(如dt_bsl_women、dt_bsl_men)
  • 使用groupby()函数尝试批量处理亚组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:55:12