如何在R ggplot2分组条形图中添加分组均值水平线、图例及数值标签
完整实现代码
library(tidyverse) library(lubridate) library(ggplot2) # 原始数据 category <- c("apple", "apple", "apple","orange", "orange","orange") mean_diameter_cm <- c(5.2,6.4,6.0, 9.2,8.6,8.1) location <- c("Farm A","Farm B", "Farm C","Farm A","Farm B", "Farm C") myfruit_data <- data.frame(category, mean_diameter_cm, location) # 绘图逻辑 myfruit_data %>% # 自动计算每个类别的全局均值,无需手动录入 group_by(category) %>% mutate(cat_total_avg = mean(mean_diameter_cm)) %>% # 原有分组统计逻辑 group_by(category, location) %>% summarise(average_diameter = mean(mean_diameter_cm), cat_total_avg = first(cat_total_avg)) %>% ggplot(aes(x=location, y=average_diameter, fill=category)) + geom_col(position = "dodge") + # 添加均值水平线,映射参数放入aes自动生成图例 geom_hline(aes(yintercept = cat_total_avg, color = category), linetype = "dashed", linewidth = 1) + # 添加均值数值标签,show.legend设为FALSE避免文本进图例 geom_text(aes(x = 3.2, y = cat_total_avg, label = paste0("均值:", round(cat_total_avg,2)), color = category), vjust = -0.5, show.legend = FALSE) + # 统一条形和水平线的颜色,和你之前的设置对应 scale_fill_manual(values = c("apple" = "red", "orange" = "green")) + scale_color_manual(values = c("apple" = "red", "orange" = "green")) + # 可选:合并填充和线条的图例 labs(fill = "水果类别", color = "水果类别")
核心优化点
- 所有均值计算由代码自动完成,即使后续分组数量增加也无需修改逻辑
- 将
geom_hline的颜色、截距参数放入aes()映射,ggplot会自动生成对应图例,无需手动配置 - 数值标签自动关联对应类别的均值,位置可通过调整
x、vjust参数适配不同的图表尺寸
内容的提问来源于stack exchange,提问作者mathguy
相关产品推荐
相关产品推荐

