2017-10-05 82 views
2

我想用facelet來使用geo_bar,獲得的百分比而不是絕對計數,但百分比應該是相對於每個方面,而不是相對於整體計數。ggplot2:geom_bar,計算方面的百分比

這已經討論了很多(example),建議使用geom_bar(aes(y = (..count..)/sum(..count..)))。這不適用於facet(即會給出總計數)。有人提出了更好的解決方案, 改爲使用​​。

這似乎是工作,如果x數字,但如果x字符:所有的酒吧都在100%!爲什麼?難道我做錯了什麼?謝謝!

library(tidyverse) 
df <- data_frame(val_num = c(rep(1, 60), rep(2, 40), rep(1, 30), rep(2, 70)), 
      val_cat = ifelse(val_num==1, "cat", "mouse"), 
      group=rep(c("A", "B"), each=100)) 

#works with numeric 
ggplot(df) + stat_count(mapping = aes(x=val_num, y=..prop..)) + facet_grid(group~.) 

# does not work? 
ggplot(df) + stat_count(mapping = aes(x=val_cat, y=..prop..)) + facet_grid(group~.) 
+0

如果您的x軸是類別,您基本上會問「哪些貓是貓的百分比以及哪個百分比的小鼠是老鼠?」 – lebelinoz

+0

我認爲這個問題是在小組/面A內,貓(或值1)與小鼠(值2)的比例是多少。對於B組也一樣,不是嗎?但是,是的,也許我的問題是不適當的?我仍然不明白爲什麼數字而不是字符的行爲是不同的? – Matifou

回答

3

添加group=group告訴ggplot通過group來計算比例,而不是默認的,這將是單獨爲的val_cat每個級別。

ggplot(df) + 
    stat_count(aes(x=val_cat, y=..prop.., group=group)) + 
    facet_grid(group~.) 

enter image description here

當X變量是連續的,它看起來像stat_count默認計算過在小面的所有數據的百分比。然而,當x變量是分類時,stat_count分別在每個x水平內計算百分比。看看下面的例子會發生什麼:

加上val_num作爲集團審美導致百分比計算在每個x水平,而不是在一個方面的所有值。

ggplot(df) + 
    stat_count(aes(x=val_num, y=..prop.., group=val_num)) + 
    facet_grid(group~.) 

車削val_num成因子同樣導致要每個x水平內,而不是通過在小面的所有值計算的百分比。

ggplot(df) + 
    stat_count(aes(x=factor(val_num), y=..prop..)) + 
    facet_grid(group~.) 
+0

很棒,很好看!有趣的是,你需要爲字符值指定'group',而不是數字值。 – Matifou