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

如何将ggplot箱线图转为带均值、样本量和p值的柱状图?

解决方案:将ggplot箱线图转为带均值、样本量和p值的柱状图

核心实现思路

替换箱线图为均值柱状图,通过stat_summary系列函数直接计算并绘制均值、误差棒,保留原有的样本量标注和组间p值比较逻辑,同时修正y轴刻度的正确映射。

完整代码

library(ggplot2)
library(ggpubr)

p <- ggplot(data_stacked, aes(x = factor, y = attitude, fill = level)) +
  # 绘制分组均值柱状图
  stat_summary(fun = mean, geom = "col", position = position_dodge(0.9), width = 0.8) +
  # 添加均值±标准误误差棒(可替换为mean_sdl等自定义误差)
  stat_summary(fun.data = mean_se, geom = "errorbar", position = position_dodge(0.9), width = 0.2) +
  # 自定义填充颜色
  scale_fill_manual(values = c("dimgrey", "lightgrey")) +
  # 组间显著性p值标注
  stat_compare_means(aes(group = level), label = "p.format", vjust = 3) +
  # 标注每组均值(位置在柱状图上方)
  stat_summary(
    fun.data = function(x) data.frame(y = mean(x) + 0.3, label = paste("mean=", round(mean(x), 2))),
    geom = "text",
    aes(group = level),
    position = position_dodge(0.9),
    size = 3.5
  ) +
  # 标注每组样本量n(位置在柱状图底部)
  stat_summary(
    fun.data = function(x) data.frame(y = 0.8, label = paste("n=", length(x))),
    geom = "text",
    aes(group = level),
    position = position_dodge(0.9),
    size = 3.5
  ) +
  # 正确设置y轴刻度与标签(对应态度五级评分)
  scale_y_continuous(
    limits = c(0.7, 5.5),
    breaks = 1:5,
    labels = c("强烈反对", "反对", "中立", "同意", "强烈同意")
  ) +
  theme_bw(base_size = 12) +
  labs(y = "态度评分")

print(p)

关键细节说明

  1. 柱状图绘制:用stat_summary(fun = mean, geom = "col")替代geom_boxplot,直接基于原始数据计算均值并绘制柱子,position_dodge(0.9)保证分组元素(柱子、误差棒、标注)对齐。
  2. 误差棒设置:mean_se自动计算均值±标准误,若需要标准差可替换为mean_sdl(mult = 1)。
  3. 标注位置调整:均值标注放在柱子上方(mean(x)+0.3),样本量放在底部(y=0.8),避免与图形元素重叠;position_dodge(0.9)确保标注与对应柱子一一对应。
  4. y轴修正:原代码用ylim传入字符会导致y轴类型错误,改用scale_y_continuous映射数值刻度到文字标签,同时设置范围保证所有标注可见。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:45:40