每组加权geom_density的密度总和为1

时间:2013-12-03 03:45:06

标签: r ggplot2 density-plot

当使用加权数据时,如何对密度图进行分组并使每组的密度总和为1?

ggplot2的{​​{1}}帮助建议使用加权数据:除以权重之和。但是,当分组时,这意味着组的总密度总计为1。我希望每组的密度合计为一。

我发现了两种笨拙的方法。第一种是将每个组视为单独的数据集:

geom_density()

显而易见的缺点是手动处理因子水平和美学。我还尝试使用m <- ggplot() m + geom_density(data = movies[movies$Action == 0, ], aes(rating, weight = votes/sum(votes)), fill=NA, colour="black") + geom_density(data = movies[movies$Action == 1, ], aes(rating, weight = votes/sum(votes)), fill=NA, colour="blue") 包的窗口功能为每个Action组的总投票创建一个新列,而不是除以该列:

data.table

有更简洁的方法吗?由于我的表的大小,为了使用频率,我宁愿不按重量复制行。

2 个答案:

答案 0 :(得分:1)

我认为辅助表可能是您唯一的选择。我遇到了类似的问题here。似乎问题是,当ggplot使用aes(...)中的聚合函数时,它会将它们应用于整个数据集,而不是子集化数据。所以当你写

aes(weight=votes/sum(votes))

分子中的votes是基于Action的子集,但分母​​sum(votes)中的投票不是。对于使用facet的隐式分组也是如此。

如果其他人有办法解决这个问题,我很乐意听到。

答案 1 :(得分:1)

使用dplyr

library(dplyr)
library(ggplot2)
library(ggplot2movies)

movies %>% 
  group_by(Action) %>% 
  mutate(votes.grp = sum(votes)) %>% 
  ggplot(aes(x=rating, weight=votes/votes.grp, group = Action, colour = Action)) +
  geom_density()

graph output by the code