如何为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
相关产品推荐
相关产品推荐

