如何使用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
相关产品推荐
相关产品推荐

