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

如何用geom_line连接不同分组箱线图的均值(position identity/side)

解决geom_line连接不同分组箱线图均值的问题

没问题,要实现在position=identity的箱线图上,用geom_line连接不同side分组下每个箱线图的均值,核心思路是先提前计算好各组的均值,再把均值点用线按side分组连接起来。下面我用示例数据一步步给你演示:

1. 准备示例数据

我用mtcars数据集模拟你的场景:把cyl作为x轴的箱线图分组,am对应你的side分组(自动/手动变速箱),mpg作为y轴数值。

library(ggplot2)
library(dplyr)

# 提前计算每个cyl和am分组的均值
mean_df <- mtcars %>%
  group_by(cyl, am) %>%
  summarise(mean_mpg = mean(mpg), .groups = "drop")

2. 绘制箱线图+均值连线

先画position=identity的箱线图,再叠加均值点和连线:

ggplot() +
  # 绘制position=identity的箱线图,用颜色区分side(am),调整透明度避免重叠
  geom_boxplot(data = mtcars, 
               aes(x = factor(cyl), y = mpg, color = factor(am)),
               position = "identity", alpha = 0.5) +
  # 添加均值点,用更醒目的样式
  geom_point(data = mean_df, 
             aes(x = factor(cyl), y = mean_mpg, color = factor(am)),
             size = 3, shape = 18) +
  # 关键:按side(am)分组连接均值点,确保每个side的线独立
  geom_line(data = mean_df, 
            aes(x = factor(cyl), y = mean_mpg, group = factor(am), color = factor(am)),
            linewidth = 1) +
  # 美化标签
  labs(x = "气缸数", y = "油耗(mpg)", color = "变速箱类型") +
  theme_minimal()

关键细节说明

  • 提前计算均值:因为geom_line需要明确的分组映射(group = side),提前用dplyr计算均值能让我们更精准地控制连线逻辑,避免stat_summary在position=identity下可能出现的分组混乱。
  • position=identity的箱线图:如果多个side的箱线图重叠严重,可以调整width参数缩小箱线图宽度,或者用alpha降低透明度,让所有箱线图都能看清。
  • group映射:geom_line必须指定group = side,否则ggplot会把所有均值点当成一个组连线,这就不是你想要的效果了。

如果你的实际数据结构和示例不同(比如x是连续变量),只需要调整group_by的变量和x轴的映射即可,核心逻辑是一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:30:02