在ggplot中使用geom_bar()显示频率而不是计数

42

这个页面上,他们给出以下示例

library(ggplot2)
library(reshape2)
ggplot(data=tips, aes(x=day)) + geom_bar(stat="bin")

我希望在y轴上显示频率而不是数量,该如何实现?

2个回答

57

以下是在相关问题中找到的解决方案:

pp <- ggplot(data=tips, aes(x=day)) + 
      geom_bar(aes(y = (..count..)/sum(..count..)))

如果您想将频率标记为百分比,请添加此内容(参见这里)。
library(scales)
pp + scale_y_continuous(labels = percent)

5
".."在 ..count.. 中代表什么意思?你有相关的参考资料吗?" - mcrisc
1
@mcrisc 请看一下这个问题 - tonytonov
你如何获取频率的数据标签,以便在每个条形图上方显示? - user2716568
4
我很希望 geom_bar 函数能像它的近亲函数 geom_histogram 一样生成 ..density.. 变量。 - aaiezza
1
我认为 scale_y_continuous(labels = percent) 中的 labels=percent 不再起作用了。 - dieHellste
@dieHellste 在 ggplot2_3.1.0 上运行,scales_1.0.0 仍然可以正常使用(R 3.5.1,Win 10)。 - tonytonov

22

现在..prop..已经可用。

ggplot(data=tips, aes(x=day)) + 
  geom_bar(aes(y = ..prop.., group = 1))

1
如果您正在使用 facets,则此方法有效,而 ..count.. 选项则无效! - r_alanb
@r_alanb 你的意思是添加例如 facet_wrap(~sex) 吗?对我来说两种方式都可以。 - Dambo
1
我应该定义“works”。如果您使用..count../sum(..count..),它将创建一个图形,但是频率将在所有方面上总和为1(我想)。如果您使用..prop..,则每个方面的频率将总和为1。也许这取决于您要展示什么。 - r_alanb
@r_alanb 只要将 group=1,那么 ..count../sum(..count..)..prop 对我来说完全一样。 - Dambo
ggplot(data=tips, aes(x=day)) + geom_bar(aes(y = ..prop.., group = 1)) + facet_wrap(~sex)ggplot(data=tips, aes(x=day)) + geom_bar(aes(y = (..count..)/sum(..count..), group = 1)) + facet_wrap(~sex) 对我来说不产生相同的图形。您还可以在 ..count.. 版本中删除 group=1,它看起来是一样的。 - r_alanb

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