【发布时间】:2012-06-14 02:50:48
【问题描述】:
我正在寻求更好的方法来绘制不同类别的观察比例的建议。
我有一个看起来像这样的数据框:
cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low")
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young")
df <- as.data.frame(cbind(cat1, cat2))
在此处的示例中,我想绘制 每个年龄组具有“高”值的比例,以及 每个年龄组具有“高”值的比例价值“低”。更一般地,我想绘制,对于类别 2 的每个值,落入类别 1 的每个级别的观察百分比。
以下代码会产生正确的结果,但只能在绘图前手动计数和除法。有没有一个好方法可以在 ggplot 中即时执行此操作?
library(plyr)
count1 <- count(df, vars=c("cat1", "cat2"))
count2 <- count(df, "cat2")
count1$totals <- count2$freq
count1$pct <- count1$freq / count1$totals
ggplot(data = count1, aes(x=cat2, y=pct))+
facet_wrap(~cat1)+
geom_bar()
This previous stackoverflow question 提供了类似的功能,代码如下:
ggplot(mydataf, aes(x = foo)) +
geom_bar(aes(y = (..count..)/sum(..count..)))
但我不想要“sum(..count..)” - 它给出了 所有 箱的计数总和 - 在分母中;相反,我想要每个“cat2”类别的计数总和。我还研究了stat_bin 文档。
如果您有任何关于如何完成这项工作的提示和建议,我将不胜感激。
【问题讨论】:
-
除了我的答案之外,我还将向您指出this 答案可能有用。 (但请注意,随着 ggplot 更新到后续版本,这样的黑客可能无法生存。)
-
由于这不是典型的数据摘要,因此在 ggplot 内部没有简单的语法可以做到这一点。您最好的方法是预先汇总数据,就像您所做的那样。