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

如何在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))

代码说明

  1. 数据转换:用pivot_longer将两列AGB数据合并,生成AGB_Type分组列和AGB_Value数值列,自动关联每个数据点的分组信息
  2. 箱线图绘制:基于长格式数据,x轴直接映射到AGB_Type,无需手动指定位置
  3. 水平须添加:stat_boxplot会自动识别所有分组的箱线图位置,为每个箱线图生成水平须

这样就能得到两个带水平须的并列箱线图,完全符合需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:26:04