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

如何自动调整ggplot箱线图中分组geom_text的垂直位置?

解决方案:自动对齐箱线图均值百分比标签

核心思路是预计算每个分组的均值和对应位置(箱线上须或箱体内部统计量位置),然后通过匹配position_dodge宽度让标签与箱线图精准对齐,彻底避免抖动导致的重叠问题。

步骤1:计算均值与标签位置

假设你的数据集包含分组变量group、类别变量category、数值变量value,先通过dplyr计算均值百分比,同时提取箱线图的上须位置(或箱体内部的中位数/上四分位数位置):

library(dplyr)
library(ggplot2)

# 示例数据集(可替换为你的真实数据)
set.seed(123)
df <- tibble(
  group = rep(c("Group1", "Group2", "Group3"), each = 100),
  category = rep(c("TypeA", "TypeB"), 150),
  value = rnorm(300, mean = 50, sd = 10)
)

# 计算均值百分比
mean_df <- df %>%
  group_by(group, category) %>%
  summarise(mean_pct = round(mean(value), 1), .groups = "drop")

# 计算每个分组的箱线上须位置(也可替换为中位数/上四分位数)
boxplot_stats_df <- df %>%
  group_by(group, category) %>%
  summarise(upper_whisker = boxplot.stats(value)$stats[5], .groups = "drop")

# 合并均值与位置数据
label_df <- left_join(mean_df, boxplot_stats_df, by = c("group", "category"))

步骤2:绘制带精准标签的箱线图

让geom_boxplot和geom_text使用相同的position_dodge宽度,确保标签与对应箱线图对齐:

标签放在上须顶端

ggplot(df, aes(x = group, y = value, fill = category)) +
  geom_boxplot(position = position_dodge(width = 0.7)) +
  # 均值标签:对齐箱线图,放在上须顶端上方
  geom_text(data = label_df,
            aes(x = group, y = upper_whisker, label = paste0(mean_pct, "%")),
            position = position_dodge(width = 0.7),
            vjust = -0.3,  # 向上微调避免与须线重叠
            size = 3,
            color = "black") +
  theme_minimal()

标签放在箱体内(以中位数位置为例)

如果需要把标签放在箱体内,只需将y映射改为中位数位置:

# 先计算中位数位置
median_df <- df %>%
  group_by(group, category) %>%
  summarise(median_val = median(value), .groups = "drop")
label_df <- left_join(mean_df, median_df, by = c("group", "category"))

ggplot(df, aes(x = group, y = value, fill = category)) +
  geom_boxplot(position = position_dodge(width = 0.7)) +
  geom_text(data = label_df,
            aes(x = group, y = median_val, label = paste0(mean_pct, "%")),
            position = position_dodge(width = 0.7),
            size = 3,
            color = "white") +  # 白色标签在箱体内更醒目
  theme_minimal()

关键注意事项

  • 必须保证geom_boxplot和geom_text的position_dodge(width = ...)参数值完全一致,否则标签会错位
  • 若标签仍有少量重叠,可微调vjust/hjust参数,或缩小标签字号
  • 横向箱线图只需交换x和y的映射,同时调整hjust替代vjust

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:28:28