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

如何在ggplot分组箱线图中添加每组样本量标签?

解决分组箱线图添加样本量标签时的美学不匹配错误

你遇到的Error in check_aesthetics()报错,核心原因是标注数据和主绘图数据的行数不匹配,且标注层未单独指定数据源。ggplot会默认沿用主图层的x、fill等美学映射,但标注数据是按分组统计后的聚合数据(行数远少于原始样本),和主数据的行数不一致,触发了美学长度检查失败。

先重现你的场景

先构建示例数据和标注数据,模拟你的情况:

library(tidyverse)

# 构建含bin、category、val的示例数据集
set.seed(123)
df <- tibble(
  bin = rep(c("A", "B"), each = 30),
  category = rep(c("X", "Y", "X", "Y"), times = c(15,15,20,10)),
  val = rnorm(60, mean = rep(c(5, 7, 6, 8), times = c(15,15,20,10)), sd = 1)
)

# 生成样本量标注数据:按bin+category分组统计行数
label_data <- df %>%
  count(bin, category, name = "n") %>%
  mutate(label = paste("n =", n))

如果直接像下面这样同时添加箱线图和标签,就会触发你遇到的报错:

# 错误代码:未给geom_label指定单独数据源
ggplot(df, aes(x = bin, y = val, fill = category)) +
  geom_boxplot(position = position_dodge(width = 0.8)) +
  geom_label(aes(label = label)) # 报错:美学长度不匹配

两种解决方法

方法1:给标注层单独指定数据源

给geom_label()/geom_text()明确传入data = label_data,同时调整位置偏移和箱线对齐:

# 正确代码:指定标注数据源,对齐箱线位置
ggplot(df, aes(x = bin, y = val, fill = category)) +
  geom_boxplot(position = position_dodge(width = 0.8)) +
  geom_label(
    data = label_data, # 单独指定标注数据
    aes(y = max(df$val) + 0.5, label = label), # 设置标签y轴位置(箱线上方)
    position = position_dodge(width = 0.8), # 和箱线的偏移宽度一致,保证对齐
    fill = "white",
    size = 3
  )

方法2:用stat_summary直接计算并添加标签

无需提前生成标注数据,直接在绘图时用stat_summary计算每组样本量:

# 更简洁的方式:stat_summary自动计算样本量
ggplot(df, aes(x = bin, y = val, fill = category)) +
  geom_boxplot(position = position_dodge(width = 0.8)) +
  stat_summary(
    fun.data = function(x) tibble(y = max(x) + 0.3, label = paste("n =", length(x))),
    geom = "label",
    position = position_dodge(width = 0.8),
    fill = "white",
    size = 3
  )

关键注意点

  • 标注层必须单独指定data,避免和主绘图数据的行数冲突
  • position_dodge(width)参数要和geom_boxplot的保持一致,确保标签和对应箱线对齐
  • y轴位置可以根据你的数据分布调整偏移量,避免标签和箱线重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:31:08