使用ggplot2绘制每个级别的平均值

33

我正在使用ggplot2,试图生成一个显示以下数据的图表。

df=data.frame(score=c(4,2,3,5,7,6,5,6,4,2,3,5,4,8),
              age=c(18,18,23,50,19,39,19,23,22,22,40,35,22,16))
str(df)
df

我想生成一个每个x值的平均值的图表,而不是变量的频率图(见下面的代码)。所以我想绘制每个年龄水平上的平均分数。在x轴上18岁时,我们可能会有y轴上得分为3。 在23岁时,我们可能会有平均分数为4.5,等等(编辑:修正平均值)。最好使用条形图来表示。

ggplot(df, aes(x=factor(age), y=factor(score))) + geom_bar()
Error: stat_count() must not be used with a y aesthetic.

我不确定如何在R中使用ggplot2来完成这个任务,好像也找不到相关绘图的资料。从统计上讲,我也不知道我想要绘制的图是否正确,但这是另外一个问题。

谢谢!


您是想要平均值吗?因为根据您的数据集,18岁的平均值为3(而不是3.5),23岁的平均值为4.5(而不是6.2)。 - DrDom
是的,我想要平均数。在那个例子中,我只是随意编了一些数字而已,没有考虑过它们的实际含义。 - ATMathew
1
@ATMathew,既然您花费了精力提供一些样本数据,那么您也应该确保您的样本输出对于所提供的数据是准确的。否则,这会导致不必要的混淆... - A5C1D2H2I1M1N2O1R2T1
只是一条注释,如果您有不同的组,比如性别,并且想要一个带有组均值的图形,则可以使用aes(x=factor(age), y=score, group = gender, color = gender))group将样本分开,color只是为它们提供不同的颜色和图例。 - Jason Goal
4个回答

72

你可以在 ggplot 中使用汇总函数。下面是两种实现相同结果的方法:

# Option 1
ggplot(df, aes(x = factor(age), y = score)) + 
  geom_bar(stat = "summary", fun = "mean")

# Option 2
ggplot(df, aes(x = factor(age), y = score)) + 
  stat_summary(fun = "mean", geom = "bar")

enter image description here

ggplot 的旧版本使用 fun.y 代替 fun:

ggplot(df, aes(x = factor(age), y = score)) + 
  stat_summary(fun.y = "mean", geom = "bar")

添加一条注释,说明 OP 可能不想将分数转换为因子,那么你就完全得到了我的答案。 - joran
@DrDom,您现在发布了它,答案是如此明显! (+1) - A5C1D2H2I1M1N2O1R2T1
@joran,是的,我在我的回答中考虑了这一点。由于在这种情况下,因子的平均值将是无意义的值。 :) - DrDom
你好,你如何为每个条形图添加平均值标签? - Bustergun

8
如果我理解你的意思正确的话,你可以尝试像这样做:
library(plyr)
library(ggplot2)
ggplot(ddply(df, .(age), mean), aes(x=factor(age), y=factor(score))) + geom_bar()

1
".(age)"是什么意思/作用?这是基本的R语言还是ggplot(/tidyverse?)特有的? - Niki Herl

7

您也可以在基础R中使用aggregate()而不必加载其他包。

temp = aggregate(list(score = df$score), list(age = factor(df$age)), mean)
ggplot(temp, aes(x = age, y = score)) + geom_bar()

0
另一个选择是使用dplyr对x值进行group_by,并针对“age”汇总“mean_score”,以在一个管道中完成。此外,您可以使用geom_col而不是geom_bar。这里是一个可重现的示例:
df=data.frame(score=c(4,2,3,5,7,6,5,6,4,2,3,5,4,8),
              age=c(18,18,23,50,19,39,19,23,22,22,40,35,22,16))
library(dplyr)
library(ggplot2)
df %>%
  group_by(age) %>%
  summarise(mean_score = mean(score)) %>%
  ggplot(aes(x = factor(age), y = mean_score)) +
  geom_col() +
  labs(x = "Age", y = "Mean score")

使用reprex v2.0.2于2022年8月26日创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接