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

如何使用ggplot2在同一图中绘制分组箱线图与每日均值折线图

实现方法

你需要在现有箱线图基础上叠加每日均值的点和折线图层,核心要注意因为x轴是离散的因子类型,需要显式指定group = 1才能正常生成连线,以下是两种实现方案:

方案1:直接用stat_summary无需提前汇总数据

不需要额外处理原始数据,直接在原有绘图代码基础上新增图层即可:

library(ggplot2)
dat <- data.frame(day = c(0,0,0,0,0,0,10,10,10,10,10,10,14,14,14,14,14,14,21,21,21,21,21,21,28,28,28,28,28,28,35,35,35,35,35,35,42,42,42,42,42,42), group = c('Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP'), score = c(37.5,43,7,63,26,15,17,16,43,26,53,26,26,26,43,10,6,15,18,9,10,4,8,18,60,26,20,12.5,9,43,43,43,11,10,7,60,43,43,32,10.5,8,57.5))


g1 = ggplot(data = dat, aes(x = factor(day), y = score)) +
  geom_boxplot(aes(fill = group))

# 叠加均值点和折线
g1 + 
  stat_summary(fun = mean, geom = "point", color = "red", size = 3, group = 1) +
  stat_summary(fun = mean, geom = "line", color = "red", linewidth = 1, group = 1) +
  labs(x = "day")

参数说明:

  • fun = mean 指定按x轴的分组(即每一天)计算score列的均值
  • group = 1 是离散x轴下绘制折线的必填参数,告知ggplot需要将所有x对应的均值点串联为一条线
  • 颜色、大小、线宽参数可以根据你的可视化需求自行调整

方案2:手动提前计算每日均值再叠加

如果你需要留存每日均值的计算结果,可以先做数据汇总再绘图:

library(ggplot2)
library(dplyr)

dat <- data.frame(day = c(0,0,0,0,0,0,10,10,10,10,10,10,14,14,14,14,14,14,21,21,21,21,21,21,28,28,28,28,28,28,35,35,35,35,35,35,42,42,42,42,42,42), group = c('Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP'), score = c(37.5,43,7,63,26,15,17,16,43,26,53,26,26,26,43,10,6,15,18,9,10,4,8,18,60,26,20,12.5,9,43,43,43,11,10,7,60,43,43,32,10.5,8,57.5))

# 按天计算所有样本得分的均值
day_mean <- dat %>% 
  group_by(day) %>% 
  summarise(mean_score = mean(score))

# 绘图
ggplot(data = dat, aes(x = factor(day), y = score)) +
  geom_boxplot(aes(fill = group)) +
  geom_point(data = day_mean, aes(x = factor(day), y = mean_score), color = "red", size = 3, group = 1) +
  geom_line(data = day_mean, aes(x = factor(day), y = mean_score), color = "red", linewidth = 1, group = 1) +
  labs(x = "day")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:54:04