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

如何使用ggplot2在条形图顶部添加另一数据集的文本标注

ggplot2条形图添加学校双行标注解决方案

完整可运行代码

# 加载所需包
library(ggplot2)
library(dplyr)

# 原始数据定义
school <- c("A","A","A","B","B","B","C","C","C")
satisify <- c("yes","yes","no","no","no","yes","no","no","yes")
evaluate <- as.data.frame(cbind(c("A","B","C"),c("good","terrible","terrible"),c("open","close","close")))
colnames(evaluate) <- c("school","evaluate","decision")
data <- as.data.frame(cbind(school, satisify))

# 统计每个学校各满意度的占比
data_summary <- data %>%
  group_by(school, satisify) %>%
  summarise(count = n(), .groups = "drop_last") %>%
  mutate(prop = count / sum(count)) %>%
  ungroup()

# 构造标注数据集
label_data <- data_summary %>%
  group_by(school) %>%
  # 取学校最高条形高度上浮10%作为标注位置,避免重叠
  summarise(max_y = max(prop) * 1.1, .groups = "drop") %>%
  left_join(evaluate, by = "school") %>%
  # 用换行符拼接两个标注字段,实现上下两行显示
  mutate(full_label = paste(evaluate, decision, sep = "\n"))

# 绘图
ggplot(data_summary, aes(x = school, y = prop, fill = satisify)) +
  geom_col(position = position_dodge(0.9), width = 0.8) +
  geom_text(
    data = label_data,
    aes(x = school, y = max_y, label = full_label),
    inherit.aes = FALSE,
    size = 3.5
  )

关键调整说明

  • 提前汇总条形占比数据,比在geom_bar中使用..prop..实时统计的逻辑更可控,也更容易匹配标注位置
  • 单独构造标注专用数据集,通过\n拼接两个标注内容,自动实现上下两行的显示效果
  • geom_text层设置inherit.aes = FALSE,避免继承全局的fill等映射规则导致报错
  • 标注高度预留10%的空隙,避免和条形顶部重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 17:15:03