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

