将类别平均值添加到 ggplot 中的分面散点图

问题描述

我正在使用 facet wrap 来绘制四种不同饮食的体重增加与热量摄入的关系。饮食是一个四级因素,体重增加和热量摄入是数字。我正在向每个绘图方面添加一条回归线。我想要做的是为图中每种饮食的组平均体重增加添加一条水平线(4 个不同的平均值)。问题是当我使用 geom_hline 函数时,它会将全局平均值放在所有图上,这不是我想要的。

我尝试使用 stat_summary(fun.y=mean,geom="line"),但它为我提供了连接每个图中每个点的线段。

下面是我正在使用的代码,它为我提供了所有图上的单一全局平均值。还有我正在使用的数据集。为了完整起见,我已经包含了贴标机代码,但我真的只需要帮助绘制组平均线。

在此先感谢您的帮助。

# Calculate slopes and means to use for facet labels
#
wgSlope<-rep(NA,nlevels(vitaminData$Diet))
dietMeans<-rep(NA,nlevels(vitaminData$Diet))
for (i in 1:nlevels(vitaminData$Diet)){
  dietMeans[i]<-mean(filter(vitaminData,Diet==i)$WeightGain)
#
# Get regression lines and coefficients for each facet 
#
lm<-lm(WeightGain~CaloricIntake,data=filter(vitaminData,Diet==i))
wgSlope[i]<-lm$coefficients[2]
}
#
# Build facet labels
#
dietLabel<-c(`1`=
               paste("Diet 1,Slope=",round(wgSlope[1],2),",Mean=",round(dietMeans[1],1)),`2`=paste("Diet 2,round(wgSlope[2],round(dietMeans[2],`3`=paste("Diet 3,Slope =",round(wgSlope[3],round(dietMeans[3],`4`=paste("Diet 4,round(wgSlope[4],round(dietMeans[4],1)))
#
# Draw the plots
#
ggplot(data=vitaminData,aes(y=WeightGain,x=CaloricIntake,color=Diet))+
theme_bw()+
geom_point(aes(color=Diet,fill=Diet,shape=Diet))+
  geom_smooth(method="lm",se=FALSE,linetype=2,alpha=0.5)+
    labs(x="Caloric Intake",y="Weight Gain")+
  scale_color_manual(values=c("red","blue","orange","darkgreen"))+
  geom_hline(yintercept=mean(vitaminData$WeightGain))+
  facet_wrap(~Diet,labeller=labeller(Diet=dietLabel))+
  theme(legend.position="none")
 Diet  WeightGain CaloricIntake
   <fct>      <dbl>         <dbl>
 1 1             48            35
 2 1             67            44
 3 1             78            44
 4 1             69            51
 5 1             53            47
 6 2             65            40
 7 2             49            45
 8 2             37            37
 9 2             73            53
10 2             63            42
11 3             79            51
12 3             52            41
13 3             63            47
14 3             65            47
15 3             67            48
16 4             59            53
17 4             50            52
18 4             59            52
19 4             42            45
20 4             34            38

enter image description here

解决方法

这是一种使用 dplyr 的方法。 (如果尚未加载,请添加 library(dplyr)library(tidyverse)。)

  geom_hline(data = vitaminData %>% 
               group_by(Diet) %>%
               summarize(mean = mean(WeightGain)),aes(yintercept = mean)) +

enter image description here