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

在分面Ggplot2直方图中添加不重叠的分类样本量geom_text

分面直方图添加样本量标签的问题解决

数据集与初始绘图代码

首先生成示例数据集:

set.seed(123) # 固定随机种子保证结果可复现
dat <- data.frame(value = sample(0:5, 20, replace = TRUE),
                  struct = rep(LETTERS[1:4], 5),
                  category = rep(letters[1:5], 4))

初始分面直方图代码:

library(ggplot2)
plot <- ggplot(dat, aes(x = value, y = ..count..)) +
  geom_histogram(binwidth = 1, alpha = 0.5, position = position_dodge(width = 0.8), 
                 aes(color = category, fill = category)) +
  facet_wrap(~ struct)

遇到的问题

  1. 每个分面内的样本量文本相互重叠;
  2. 文本颜色无法与对应category的直方图颜色匹配。

解决方案

步骤1:预处理标签数据

统计每个struct-category组合的样本量,同时计算每个分面的最大计数,为每个标签分配不重叠的y坐标,保留category信息用于颜色映射:

library(dplyr)
# 统计样本量并计算标签位置
label_data <- dat %>%
  # 统计每个struct-category的样本量
  group_by(struct, category) %>%
  summarize(n = n(), .groups = "drop") %>%
  # 按分面分组,计算每个分面的最大计数,生成垂直排列的y坐标
  group_by(struct) %>%
  mutate(
    # 获取当前分面的最大计数
    max_count = max(with(dat[dat$struct == cur_group()$struct, ], table(value))),
    # 为每个category分配递减的y坐标,避免重叠
    y_pos = max_count + 1 - row_number()
  )

步骤2:添加样本量标签到绘图

使用预处理后的label_data绘制文本,同时映射color=category实现颜色匹配:

plot +
  geom_text(
    data = label_data,
    aes(x = 5, y = y_pos, label = paste0("n = ", n), color = category),
    size = 4,
    inherit.aes = FALSE # 不继承主图的aes设置
  )

关键说明

  • 解决重叠问题:通过row_number()为每个分面内的category生成依次递减的y坐标,标签会从分面的最大计数上方开始垂直排列,避免相互覆盖;
  • 解决颜色匹配问题:预处理的label_data保留了category列,在geom_text的aes中映射color=category,标签颜色会自动与对应category的直方图颜色保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:57:25