r在柱状图ggplot中的bin百分比

时间:2017-08-17 20:06:38

标签: r ggplot2 histogram percentage

我有这样的数据集 - >

library(ggplot2)

response <- c("Yes","No")
gend <- c("Female","Male")

purchase <- sample(response, 20, replace = TRUE)
gender <- sample(gend, 20, replace = TRUE)

df <- as.data.frame(purchase)
df <- cbind(df,gender)

所以head(df)看起来像这样 - &gt;

  purchase gender
1      Yes Female
2       No   Male
3       No Female
4       No Female
5      Yes Female
6       No Female

另外,您可以验证我的示例,这里有table(df)我的特定样本   (请不要担心匹配我的百分比)

         gender
purchase Female Male
     No       6    3
     Yes      4    7

我想要&#34;直方图&#34;显示性别,但按购买分开。 我走了这么远 - &gt;

ggplot(df) + 
       geom_bar(aes(y = (..count..)/sum(..count..)),position = "dodge") + 
       aes(gender, fill = purchase)

生成 - &gt;

具有拆分箱的直方图,按百分比计算,但不是我想要的总计水平 histogram with split bins, by percentage, but not the aggregate level I want

Y轴具有我想要的百分比,但它具有图表中每个条形图占整个图表的百分比。 我想要的是两个&#34;女性&#34;每个栏都是各自&#34;购买&#34;的百分比。所以在上面的图表中我想要四个吧, 66%, 36%, 33%, 64% , 以该顺序。

我尝试使用geom_histogram无济于事。我检查了SO,搜索过的,ggplot文档和几本书。

关于查看关于方面的上一个问题的建议;这确实有效,但我希望将图表保持在视觉上,而不是分成两个图表&#34;。所以......

任何人都知道怎么做?

感谢。

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

library(tidyverse)

df %>% 
count(purchase, gender) %>% 
ungroup %>% 
group_by(gender) %>% 
mutate(prop = prop.table(n)) %>% 
ggplot(aes(gender, prop, group = purchase)) + 
geom_bar(aes(fill = purchase), stat = "identity", position = "dodge")

enter image description here

前5行创建了一列prop(用于“比例”),该列聚合gender

要实现这一目标,首先count purchase gender table(df)(类似于gender的输出。取消组合然后仅按{{1}}重新组合给出我们想要的聚合。

答案 1 :(得分:0)

关于您想要的百分比,分母是基于性别还是购买?在上面给出的例子中,女性和女性为66%。没有购买将是6的结果除以没有购买的总和(6 + 3)而不是所有女性的总和(6 + 4)。

绝对有可能对此进行描绘,但我不确定结果是否可以直观地解释。我有一段时间困惑自己。

以下黑客利用了weight美学。我根据问题中描述的预期输出使用了购买作为分组变量,尽管我认为性别更有意义(根据上面的TTNK的answer):

df <- data.frame(purchase = c(rep("No", 6), rep("Yes", 4), rep("No", 3), rep("Yes", 7)),
                 gender = c(rep("Female", 10), rep("Male", 10)))

ggplot(df %>% 
         group_by(purchase) %>% #change this to gender if that's the intended denominator
         mutate(w = 1/n()) %>% ungroup()) + 
  aes(gender, fill = purchase, weight = w)+ 
  geom_bar(aes(x = gender, fill = purchase), position = "dodge")+
  scale_y_continuous(name = "percent", labels = scales::percent)

bar plot with weights