我有一个数据框,它有两种类型的'组',我希望在同一图表上叠加密度。
使用ggplot,我尝试使用以下两行代码绘制密度图:
full$group <- factor(full$group)
ggplot(full, aes(x=income, fill=group)) + geom_density()
这个问题是它没有考虑频率变量(freq),只是计算频率本身。这是一个问题,因为每个收入组合组合只有一行。
我相信我有两个选择,每个选项都有一个问题:
a)我应该使用当前格式化数据的方式绘制图表吗?如果是这样,我该怎么做?
b)我应该重新格式化数据,使每组/收入组合的频率等于分配给它的频率变量吗?如果是这样,我该怎么做?
这是我想要的图表,其中“income”=“rating”和“group”=“cond”:
'完整'的输入:
full <- structure(list(income = c(10000, 19000, 29000, 39000, 49000, 75000, 99000, 1e+05, 10000, 19000,29000, 39000, 49000, 75000, 99000, 1e+05),
group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("one", "two"), class = "factor"),
freq = c(1237, 1791, 743, 291, 256, 212, 29, 11, 921, 1512, 614, 301, 209, 223, 48, 1)), .Names = c("income", "group", "freq"),
row.names = c(NA, 16L), class = "data.frame")
答案 0 :(得分:2)
你可以用
的频率重复观察ggplot(full[rep(1:nrow(full), full$freq),]) +
geom_density(aes(x=income, fill=group), color="black", alpha=.75, adjust=4)
当然,对于你的数据,这会产生一个非常糟糕的情节
估算密度时,您的数据应该是连续分布的观察结果。在这里,你真的有一个带有重复观察的离散分布(在真正的连续分布中,看到任何值不止一次的概率为0)。
您可以尝试通过将adjust=
参数设置为数字&gt; 1(如3或4)来平滑此曲线。但实际上,您的输入数据不适合密度图。条形图将是更好的选择。也许像是
ggplot(full, aes(as.factor(income), freq, fill=group)) +
geom_bar(stat="identity", position="dodge")