You need to enable JavaScript to run this app. R语言:如何绘制基于lsmeans两两均值差的ggplot版森林图
优惠活动
大模型
产品
解决方案
定价
更多

R语言:如何绘制基于lsmeans两两均值差的ggplot版森林图

基于ggplot实现两两均值比较的森林图

你完全可以从lsmeans的输出对象中提取结构化统计结果,用ggplot复刻与默认绘图等价的森林图,不需要依赖内置的plot方法,同时可以灵活调整样式匹配目标图表的风格。

提取绘图所需的结构化数据

lsmeans生成的两两对比结果本身包含所有绘图需要的核心统计量,无需手动计算,通过as.data.frame()即可将结果转换为可直接用于ggplot绘图的表格:

library(ggplot2)
library(lsmeans)

# 复现原有数据与模型
typing = data.frame(
 type = rep(c("A","B","C"), each=4),
 hours = c(60,72,61,50, 54,68,66,59, 56,56,55,51),
 pain = c(85,95,69,58, 41,74,71,52, 41,34,50,40))

typing.lm = lm(pain ~ hours + type, data = typing)
typing.lsm = lsmeans(typing.lm, pairwise ~ type )

# 提取两两对比的结果表
comparison_df <- as.data.frame(typing.lsm[[2]])

提取的表格会自动包含对比项名称、调整后均值差估计值、95%置信区间上下限、p值等核心字段,完全覆盖绘图需求。

基础森林图实现

这套绘制逻辑完全基于lsmeans返回的原始计算结果,和默认plot函数得到的统计输出没有任何数值差异,只是绘图方式换成了ggplot的灵活图层体系。按照森林图的标准逻辑搭建图层:

  • 绘制x=0的垂直虚线作为“无均值差异”的参考基准
  • 用横向误差线映射每个对比项的95%置信区间范围
  • 用实心点映射调整后的均值差估计值
  • 固定纵轴的对比项顺序,保证与默认lsmeans绘图的排版逻辑一致
ggplot(comparison_df, aes(y = contrast, x = estimate)) +
  # 0值参考线
  geom_vline(xintercept = 0, linetype = "dashed", color = "gray50") +
  # 置信区间横线
  geom_errorbar(aes(xmin = lower.CL, xmax = upper.CL), width = 0.2, linewidth = 0.8) +
  # 均值差点位
  geom_point(size = 3, color = "#2c3e50") +
  # 坐标轴标签
  labs(x = "Adjusted Mean Difference", y = "Pairwise Comparisons") +
  # 简洁主题
  theme_bw() +
  # 固定纵轴顺序匹配默认绘图排版
  scale_y_discrete(limits = rev(comparison_df$contrast))

可选样式优化

  • 可根据p值对显著性结果做高亮:将p<0.05的对比项点位和误差线用区分色标记,降低结果解读成本
  • 可在绘图区域右侧直接标注每个对比的均值差和95%CI的数值文本,避免读者反复对照坐标轴
  • 可手动调整x轴范围,匹配所有置信区间的极值,减少不必要的留白

示例优化代码(增加显著性高亮):

# 增加显著性高亮的优化版本
comparison_df$significance <- ifelse(comparison_df$p.value < 0.05, "Significant", "Not Significant")

ggplot(comparison_df, aes(y = contrast, x = estimate, color = significance)) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "gray50") +
  geom_errorbar(aes(xmin = lower.CL, xmax = upper.CL), width = 0.2, linewidth = 0.8) +
  geom_point(size = 3) +
  scale_color_manual(values = c("Significant" = "#e74c3c", "Not Significant" = "#2c3e50")) +
  labs(x = "Adjusted Mean Difference", y = "Pairwise Comparisons", color = "Test Result") +
  theme_bw() +
  scale_y_discrete(limits = rev(comparison_df$contrast))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 23:24:01