我有这样的数据集 - >
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;
具有拆分箱的直方图,按百分比计算,但不是我想要的总计水平
Y轴具有我想要的百分比,但它具有图表中每个条形图占整个图表的百分比。
我想要的是两个&#34;女性&#34;每个栏都是各自&#34;购买&#34;的百分比。所以在上面的图表中我想要四个吧,
66%, 36%, 33%, 64%
, 以该顺序。
我尝试使用geom_histogram无济于事。我检查了SO,搜索过的,ggplot文档和几本书。
关于查看关于方面的上一个问题的建议;这确实有效,但我希望将图表保持在视觉上,而不是分成两个图表&#34;。所以......
任何人都知道怎么做?
感谢。
答案 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")
前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)