3

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

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

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

library(ggplot2)
library(ggplot2movies) # load the movies dataset

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")

明显的缺点是因子水平和美学的手动处理。我还尝试使用data.table包的窗口功能为每个操作组的总票数创建一个新列,然后除以:

movies.dt <- data.table(movies)
setkey(movies.dt, Action)
movies.dt[, votes.per.group := sum(votes), Action]
m <- ggplot(movies.dt, aes(x=rating, weight=votes/votes.per.group, group = Action, colour = Action))
m + geom_density(fill=NA)

有没有更简洁的方法来做到这一点?由于我的表的大小,为了使用频率,我宁愿不通过它们的权重来复制行。

4

2 回答 2

1

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

aes(weight=votes/sum(votes))

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

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

于 2013-12-03T04:43:27.020 回答
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()

代码输出的图形

于 2020-01-31T05:39:39.387 回答