如何在R的ggplot2中为发散条形图添加双侧误差棒?
解决ggplot2发散条形图添加误差棒的问题
问题根源
你把一类fire.binary的standard.abundance设为负值后,geom_col会把同一species下的两个类别条形叠加,导致误差棒无法对应到各自的独立条形上。以下是几种简洁的解决方法,不用依赖繁琐的facet_wrap或后期处理:
方法1:手动调整x轴偏移(原生ggplot2实现)
通过给不同fire.binary类别的条形添加x轴偏移量,让同一物种下的两个条形分开,从而为每个条形单独添加误差棒:
1.1 预处理数据(添加偏移量)
library(dplyr) # 假设fire.binary的两个水平为"yes"和"no",根据类别设置偏移量 fig1 <- fig1 %>% mutate( species_num = as.numeric(factor(species)), x_pos = species_num + ifelse(fire.binary == "yes", 0.2, -0.2) )
1.2 绘图代码(包含误差棒)
ggplot(fig1, aes(x = x_pos, y = standard.abundance, fill = fire.binary)) + # 绘制条形,宽度匹配偏移量 geom_col(width = 0.4) + # 添加误差棒(替换se为你的误差列名,比如sd、ci等) geom_errorbar( aes(ymin = standard.abundance - se, ymax = standard.abundance + se), width = 0.2 ) + # 添加0值参考线 geom_hline(yintercept = 0, linetype = "dashed") + # 重置x轴标签为物种名 scale_x_continuous( breaks = unique(fig1$species_num), labels = unique(fig1$species) ) + coord_flip() + scale_y_continuous(trans = pseudolog10_trans)
方法2:用ggalt包绘制金字塔图(推荐)
ggalt的geom_barh专门支持双向金字塔图,无需将数值设为负值,结构更规整,误差棒添加更直观:
2.1 安装并加载包
install.packages("ggalt") library(ggalt) library(tidyr)
2.2 转换数据为宽格式
# 将长格式数据转为宽格式,方便对应左右两侧的条形和误差 fig1_wide <- fig1 %>% pivot_wider( names_from = fire.binary, values_from = c(standard.abundance, se) # se为你的误差列名 )
2.3 绘制金字塔图
ggplot(fig1_wide, aes(y = species)) + # 左侧条形(fire.binary = "no") geom_barh( aes(x = standard.abundance_no), fill = "#6baed6", width = 0.4, position = position_nudge(y = -0.2) ) + # 右侧条形(fire.binary = "yes",取负值实现发散) geom_barh( aes(x = -standard.abundance_yes), fill = "#fc8d59", width = 0.4, position = position_nudge(y = 0.2) ) + # 左侧误差棒 geom_errorbarh( aes(xmin = standard.abundance_no - se_no, xmax = standard.abundance_no + se_no), height = 0.2, position = position_nudge(y = -0.2) ) + # 右侧误差棒 geom_errorbarh( aes(xmin = -standard.abundance_yes - se_yes, xmax = -standard.abundance_yes + se_yes), height = 0.2, position = position_nudge(y = 0.2) ) + # 添加0值参考线 geom_vline(xintercept = 0, linetype = "dashed") + scale_x_continuous(trans = pseudolog10_trans)
方法3:用ggcharts包快速生成(极简)
ggcharts的diverging_bar_chart函数可以一键生成带误差棒的发散条形图,无需手动调整:
3.1 安装并加载包
install.packages("ggcharts") library(ggcharts)
3.2 绘图代码
# 直接指定x(物种)、y(丰度)、fill(分组)、error_y(误差列) diverging_bar_chart( data = fig1, x = species, y = standard.abundance, fill = fire.binary, error_y = se # 替换为你的误差列名 ) + geom_hline(yintercept = 0, linetype = "dashed") + scale_y_continuous(trans = pseudolog10_trans)
内容的提问来源于stack exchange,提问作者Jonathan Webb
相关产品推荐
相关产品推荐

