如何在R的ggplot中为并列箱线图添加水平须?
问题:绘制带水平须的AGB并列箱线图
需求
- 基于
processed_AGB_BA数据框,对比AGB_patch_conv和AGB_patch_arboreal两列数据,绘制带水平须的并列箱线图 - 水平须需对应四分位距1.5倍的须线末端
数据结构
> dput(head(processed_AGB_BA)) structure(list(patch_ID = c("1st near school", "SRB_OUT_01_M", "SRB_OUT_01_NM", "SRB_OUT_02_M", "SRB_OUT_02_NM", "SRB_OUT_21_M" ), AGB_patch_conv = c(66295.8445967275, 49135.973074405, 51484.2294385078, 41572.738788761, 71509.7267936017, 28132.3367655501), BA_patch_conv = c(36.5263013888889, 24.1978819444444, 27.54125, 21.865337037037, 45.5953240740741, 14.8647916666667), AGB_patch_arboreal = c(51387.2269090947, 53555.0952762403, 64546.2000860895, 38690.7951211127, 43723.8206226884, 25208.3905166321 ), BA_patch_arboreal = c(28.2327368055556, 20.7482475974128, 23.4128590199378, 30.5281148491577, 30.4031276527036, 12.8046908575741 )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" ))
现有代码及问题
当前代码通过手动叠加两个geom_boxplot实现并列,但添加水平须时只有第一个箱线图生效:
ggplot(processed_AGB_BA, aes(x = factor(1), y = AGB_patch_conv)) + geom_boxplot(fill = "transparent", color = "black", coef = 1.5) + geom_boxplot(aes(x = factor(2), y = AGB_patch_arboreal), fill = "transparent", color = "black", coef = 1.5) + labs(x = "", y = "AGB [kg/ha]") + scale_x_discrete(labels = c("Conventional", "Arboreal Forest")) + ggtitle("Comparison of AGB: Conventional vs. Arboreal") + theme_minimal() + theme(panel.background = element_rect(fill = "white"), axis.text.x = element_text(size = 12))
问题原因:手动指定x=factor(1)和x=factor(2)属于硬编码,stat_boxplot只能识别初始图层的x映射,无法关联第二个箱线图的位置。
解决方案:转换为长格式数据绘制
ggplot的设计逻辑更适配长格式数据,先把两列AGB数据合并为一列,同时保留分组标识,再统一绘制即可解决水平须问题。
完整代码
# 加载必要包 library(ggplot2) library(tidyr) # 转换数据为长格式 processed_AGB_long <- processed_AGB_BA %>% select(patch_ID, AGB_patch_conv, AGB_patch_arboreal) %>% pivot_longer( cols = starts_with("AGB_patch"), names_to = "AGB_Type", values_to = "AGB_Value" ) %>% # 替换分组名称为友好标签 mutate(AGB_Type = recode(AGB_Type, "AGB_patch_conv" = "Conventional", "AGB_patch_arboreal" = "Arboreal Forest" )) # 绘制带水平须的箱线图 ggplot(processed_AGB_long, aes(x = AGB_Type, y = AGB_Value)) + geom_boxplot(fill = "transparent", color = "black", coef = 1.5) + # 添加水平须,width控制须线宽度 stat_boxplot(geom = "errorbar", width = 0.5, color = "black") + labs(x = "", y = "AGB [kg/ha]") + ggtitle("Comparison of AGB: Conventional vs. Arboreal") + theme_minimal() + theme(panel.background = element_rect(fill = "white"), axis.text.x = element_text(size = 12))
代码说明
- 数据转换:用
pivot_longer将两列AGB数据合并,生成AGB_Type分组列和AGB_Value数值列,自动关联每个数据点的分组信息 - 箱线图绘制:基于长格式数据,x轴直接映射到
AGB_Type,无需手动指定位置 - 水平须添加:
stat_boxplot会自动识别所有分组的箱线图位置,为每个箱线图生成水平须
这样就能得到两个带水平须的并列箱线图,完全符合需求。
内容的提问来源于stack exchange,提问作者AVWP
相关产品推荐
相关产品推荐

