【问题标题】:Plotting the average values for each level in ggplot2在 ggplot2 中绘制每个级别的平均值
【发布时间】:2012-08-05 04:11:16
【问题描述】:

我正在使用 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)?
  • 是的,我想要平均值。在那个例子中,我只是想出了一些数字。
  • @ATMathew,但是由于您要努力提供一些示例数据,您还应该确保您的示例输出对于所提供的数据是准确的。否则,会导致不必要的混乱......
  • 就像评论一样,如果你有不同的组,比如性别,并且你想要一个带有组均值的图,aes(x=factor(age), y=score, group = gender, color = gender))group 将样本分开color 只是给它们不同的颜色和图例

标签: r ggplot2


【解决方案1】:

您可以在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")

旧版本的ggplot 使用fun.y 而不是fun

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

【讨论】:

  • 添加一条关于 OP 可能不想将分数转换为因子的注释,您将得到我的答案。
  • @DrDom,答案很明显,因为您已经发布了它! (+1)
  • @joran,是的,我在回答中考虑到了这一点。因为在这种情况下,因子的平均值将是无意义的值。 :)
  • 您好,如何将均值添加为每个条形的标签?
【解决方案2】:

如果我没听错的话,你可以试试这样的:

library(plyr)
library(ggplot2)
ggplot(ddply(df, .(age), mean), aes(x=factor(age), y=factor(score))) + geom_bar()

【讨论】:

  • “.(age)”是什么意思/做什么?这是一个基本的 R 东西还是 ggplot (/tidyverse?) 特定的?
【解决方案3】:

您也可以在基础 R 中使用aggregate(),而不是加载另一个包。

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

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 2021-08-28
    • 2017-04-25
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2020-03-27
    • 2021-03-03
    相关资源
    最近更新 更多