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

如何为ggplot绘制的带状图中柱状图添加SD或SEM误差棒?

给ggplot带状图的柱状图添加SD/SEM误差棒

针对你现有代码,要给符合abs(P)>=lim条件的柱状图添加误差棒,以下是两种实用方案:

方案1:直接用stat_summary在绘图时计算误差(推荐,无需预处理数据)

添加SD误差棒

利用mean_sdl函数计算均值±1标准差,直接在现有代码中添加stat_summary层:

ggplot(da_results, aes(x=ident, y=logFC))+
  geom_beeswarm(data = ~ filter(da_results, abs(P) < 0.9), color = "gray",cex = 0.2) +
  geom_beeswarm(aes(color = ident), data = ~ filter(da_results, abs(P) >= lim),cex = 0.2) +
  geom_bar(aes(color = ident), data = ~ filter(da_results, abs(P) >= lim),stat = "summary",alpha=0.5) +
  # 新增SD误差棒层,mult=1表示±1SD
  stat_summary(data = ~ filter(da_results, abs(P) >= lim),
               fun.data = function(x) mean_sdl(x, mult=1),
               geom = "errorbar", width=0.2) +
  coord_flip()+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black"))+geom_hline(yintercept = 0)

添加SEM误差棒

先定义计算均值±标准误的函数,再用stat_summary调用:

# 定义SEM计算函数
mean_se <- function(x) {
  se <- sd(x)/sqrt(length(x))
  data.frame(y=mean(x), ymin=mean(x)-se, ymax=mean(x)+se)
}

# 绘图代码
ggplot(da_results, aes(x=ident, y=logFC))+
  geom_beeswarm(data = ~ filter(da_results, abs(P) < 0.9), color = "gray",cex = 0.2) +
  geom_beeswarm(aes(color = ident), data = ~ filter(da_results, abs(P) >= lim),cex = 0.2) +
  geom_bar(aes(color = ident), data = ~ filter(da_results, abs(P) >= lim),stat = "summary",alpha=0.5) +
  # 新增SEM误差棒层
  stat_summary(data = ~ filter(da_results, abs(P) >= lim),
               fun.data = mean_se,
               geom = "errorbar", width=0.2) +
  coord_flip()+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black"))+geom_hline(yintercept = 0)

方案2:提前预处理数据再绘图

先通过dplyr筛选数据并计算统计量,再用预处理后的数据绘制柱状图和误差棒,适合需要复用统计结果的场景:

library(dplyr)

# 预处理数据:筛选符合条件的行,计算均值、SD、SEM
summary_data <- da_results %>%
  filter(abs(P) >= lim) %>%
  group_by(ident) %>%
  summarise(
    mean_logFC = mean(logFC),
    sd_logFC = sd(logFC),
    sem_logFC = sd(logFC)/sqrt(n())
  )

# 绘图代码
ggplot(da_results, aes(x=ident, y=logFC))+
  geom_beeswarm(data = ~ filter(da_results, abs(P) < 0.9), color = "gray",cex = 0.2) +
  geom_beeswarm(aes(color = ident), data = ~ filter(da_results, abs(P) >= lim),cex = 0.2) +
  # 用预处理数据绘制柱状图
  geom_bar(aes(x=ident, y=mean_logFC, color=ident), data=summary_data, stat="identity", alpha=0.5) +
  # 添加SD误差棒(要SEM就替换成sem_logFC)
  geom_errorbar(aes(x=ident, ymin=mean_logFC - sd_logFC, ymax=mean_logFC + sd_logFC),
                data=summary_data, width=0.2) +
  coord_flip()+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black"))+geom_hline(yintercept = 0)

注意事项

  • 误差棒的width参数可根据需求调整,让显示效果更协调
  • 确保误差棒的数据源过滤条件和柱状图完全一致(均为abs(P)>=lim)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:35:00