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

ggplot2:绘制均值柱状图问题(含补充解法)

嘿,我懂你碰到的这个问题——用ggplot画柱状图时,默认会把同一bleach_time下的所有conc值加总,而不是你想要的均值对吧?下面给你两种实用的解决办法,其中第二种在多重复本分类数据的场景下更灵活好用:

首先先给出可复现的示例数据,方便你测试:

set.seed(123) # 设置随机种子保证结果一致
df <- data.frame(
  bleach_time = rep(c(10, 20, 30), each = 5), # 每个时间点5个重复样本
  conc = rnorm(15, mean = c(5, 8, 12), sd = 1)
)

解法1:直接在绘图时用stat_summary计算均值

这种方法不用提前处理数据,直接在ggplot里指定计算逻辑,适合快速出图:

library(ggplot2)

ggplot(df, aes(x = factor(bleach_time), y = conc)) +
  # 用mean函数计算均值,绘制成柱状图
  stat_summary(fun = mean, geom = "col", fill = "#4292c6", alpha = 0.8) +
  # 可选:添加标准误误差棒,展示数据的离散程度
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.2, color = "#2166ac") +
  labs(x = "Bleach Time", y = "Mean Concentration", title = "Average Concentration by Bleach Time") +
  theme_minimal()

小提示:stat_summary可以灵活替换统计函数,比如换成median就能画中位数柱状图,非常方便。

解法2:先预处理数据再绘图(多场景更实用)

如果你的数据需要额外清洗、过滤,或者后续要做更多统计分析,先分组计算均值再绘图的方式会更清晰可控:

library(dplyr)
library(ggplot2)

# 第一步:分组计算均值和标准误
summary_df <- df %>%
  group_by(bleach_time) %>%
  summarise(
    mean_conc = mean(conc),       # 计算均值
    se_conc = sd(conc)/sqrt(n())  # 计算标准误(可选)
  ) %>%
  ungroup()

# 第二步:基于预处理后的汇总数据绘图
ggplot(summary_df, aes(x = factor(bleach_time), y = mean_conc)) +
  geom_col(fill = "#4292c6", alpha = 0.8) +
  geom_errorbar(aes(ymin = mean_conc - se_conc, ymax = mean_conc + se_conc), 
                width = 0.2, color = "#2166ac") +
  labs(x = "Bleach Time", y = "Mean Concentration", title = "Average Concentration by Bleach Time") +
  theme_minimal()

这种方法的优势在于,你可以随时查看或修改汇总后的数据集,比如添加其他统计量(如最小值、最大值),或者对异常值做过滤,适配更多复杂场景。

为什么之前会画出总和?因为geom_col()(和旧版的geom_bar(stat="identity"))默认会对同一x分组下的所有y值进行求和聚合,而不是计算均值——这也是新手用ggplot画统计柱状图时很容易踩的坑哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:00:40