2017-10-05 84 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