使用加权数据时,如何对密度图进行分组并使每组的密度之和为一?
ggplot2
的geom_density()
帮助提示使用加权数据的技巧:除以权重之和。但是,当分组时,这意味着组的合并密度总计为1。我希望每组的密度总计为一。
我发现了两种笨拙的方法。第一种是将每个组视为单独的数据集:
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)
是否有更整洁的方法?由于表的大小,为了使用频率,我宁愿不按权重复制行。
我认为辅助表可能是您唯一的选择。我有类似的问题here。似乎存在的问题是,当ggplot
在aes(...)
中使用聚合函数时,会将其应用于整个数据集,而不是子集数据。所以当你写
aes(weight=votes/sum(votes))
分子中的votes
是基于Action
的子集,但分母sum(votes)
中的投票不是。对于包含构面的隐式分组也是如此。
如果有人可以解决这个问题,我很想听听。