2013-07-15 35 views
5

如何在ggplot2中使用填充美學來繪製兩組的相對比例?如何在ggplot2中使用填充美學來繪製兩組的相對比例?

我問這裏這個問題,因爲在這個題目其他幾個答案似乎不正確(ex1ex2ex3),但交叉驗證似乎有功能禁止[R具體問題(CV meta)。 ..density..在概念上與相關但不同於比例(ex4ex5)。所以正確的答案似乎不涉及密度。

實施例:

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_),其在上述參考答案施加的黑客可以推廣到填充AES 在不存在該組的AES與Y AES以下代碼:y = ..count../sapply(fill, FUN=function(x) sum(count[fill == x]))。這只是用填充替代PANEL(StatBin結尾處的隱藏列)。大概其他隱藏的變量可能會得到相同的處理。

+0

如何這並推廣到情況下,我有,比方說,一個地塊分成組,然後刻面成面板? – RoyalTS

+0

@Ryall:我認爲同樣的問題適用,因爲問題是ggplot2中沒有(或者至少沒有)適當的stat_函數。我寫了一個可以作爲ggplot2插件的草稿解決方案......但我不確定它有多堅實,所以我沒有發佈它。 – russellpierce

回答

5

這是一個aweful黑客攻擊,但似乎你想要做什麼......

ggplot(test, aes(test2)) + geom_bar(aes(y = ..count../rep(c(sum(..count..[1:6]), sum(..count..[7:12])), each=6), 
            group=test1, fill=test1) ,position="dodge") + 
             scale_y_continuous(name="proportion") 
+4

+1,即使它是一個可敬的黑客。你是如何確定..count的基礎數據結構以便提出這個問題的?知道這是提出任何看起來像一般解決方案的關鍵。 – russellpierce

相關問題