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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:36:02