【发布时间】:2013-07-13 09:36:53
【问题描述】:
如何在 ggplot2 中使用填充美学绘制两组的相对比例?
我在这里问这个问题是因为关于这个主题的其他几个答案似乎不正确(ex1、ex2 和 ex3),但 Cross Validated 似乎在功能上禁止了 R 特定问题(CV meta)。 ..density.. 在概念上与比例相关,但与比例不同(ex4 和 ex5)。所以正确答案似乎不涉及密度。
例子:
set.seed(1200)
test <- data.frame(
test1 = factor(sample(letters[1:2], 100, replace = TRUE,prob=c(.25,.75)),ordered=TRUE,levels=letters[1:2]),
test2 = factor(sample(letters[3:8], 100, replace = TRUE),ordered=TRUE,levels=letters[3:8])
)
ggplot(test, aes(test2)) + geom_bar(aes(y = ..density.., group=test1, fill=test1) ,position="dodge")
#For example, the plotted data shows level a x c as being slightly in excess of .15, but a manual calculation shows a value of .138
counts <- with(test,table(test1,test2))
counts/matrix(rowSums(counts),nrow=2,ncol=6)
似乎产生correct 输出的答案求助于不使用 ggplot2(在 ggplot2 之外计算)或要求使用面板而不是填充美学的解决方案。
编辑:深入 stat_bin 会得出最终调用的函数是 bin,但 bin 只传递了 x aes 中的值。在不重写 stat_bin(或制作另一个 stat_)的情况下,在上面引用的答案中应用的 hack 可以推广到填充 aes在没有组 aes 的情况下,y aes 的代码如下:@ 987654330@。这只是用填充替换了 PANEL(StatBin 末尾的隐藏列)。据推测,其他隐藏变量也可以得到相同的处理。
【问题讨论】:
-
这如何推广到我有,比如说,一个情节分成组然后分面成面板的情况?
-
@RoyalTS:我相信同样的问题也适用,因为问题是 ggplot2 中没有(或至少没有)适当的 stat_ 函数。我写了一个草稿解决方案,它可以作为 ggplot2 的插件使用......但我不确定它有多可靠,所以我没有发布它。
标签: r ggplot2 statistics visualization data-visualization