在使用加权数据时,如何对密度图进行分组并使每组的密度总和为 1?
ggplot2
对 geom_density()
的帮助建议使用加权数据的 hack:除以权重之和。但是当分组时,这意味着组的组合密度总计为 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
包的窗口功能为每个 Action 组的总票数创建一个新列,除以它:
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)
有没有更简洁的方法来做到这一点?由于我的表的大小,为了使用频率,我宁愿不按权重复制行。
最佳答案
使用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()
关于r - 每组加权geom_density总和为1的密度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342494/