柱状图中按仓位划分的r百分比

柱状图中按仓位划分的r百分比,r,ggplot2,histogram,percentage,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)

我有一个这样的数据集->

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)
另外,为了验证我的示例,这里是我的特定采样的tabledf。 请不要担心匹配我的百分比

我想要一个显示性别的柱状图,但要按购买量划分。 我已经走了这么远->

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

按百分比划分的带分割箱的直方图,但不是我想要的聚合级别

Y轴有我想要的百分比,但它有图表的每个条形图作为整个图表的百分比。 我想要的是这两个女性酒吧分别占其购买量的百分比。所以在上面的图表中,我希望四条横线, 66%, 36%, 33%, 64% ,按那个顺序

我试过使用geom_直方图,但没有效果。我已经查过了,搜索过了,还有一些文档和几本书

关于研究前面关于方面的问题的建议;这确实有效,但我希望保持图表的视觉效果与上面一样,而不是分成两个图表。所以

有人知道怎么做吗


谢谢。

试试这样:

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行为“比例”创建一个列道具,该列道具跨性别聚合


为了达到这一目的,您首先按性别对每次购买进行计数,类似于tabledf的输出。取消分组,然后仅按性别重新分组,得到我们想要的聚合。

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

这肯定是可能的,但我不确定结果是否是直观的解释。我一时糊涂了

下面的技巧利用了重量美学。根据问题中描述的预期产出,我在这里使用了购买作为分组变量,尽管我认为根据TTNK的上述观点,性别更有意义:


@LoBu的可能副本,谢谢您的建议。各个方面都会起作用,如果需要的话,我可以应付,但我希望保持图表的完整性,就像问题中看起来的那样。但绝对谢谢,因为如果我不能得到我想要的东西,我会用它。谢谢@TTNK,这很好,但感觉它应该完全可以在GGPlot2内实现。我正在努力磨练我的ggplot技能,所以我希望找到一个明确的答案,它可以完成,也可以不完成。我一定会记住这是一个退路。或者有好几次我只想使用基本图形。@TTNK我已经尝试过了,但我得到了一个错误:wt_var必须是单个variable@TTNK当我将原始海报数据与您的代码一起使用时,我在FUNX[[I]]中得到此错误,…:找不到对象“Yes”运行脚本时出现此错误错误错误:应仅在数据上下文中调用n
ggplot(df) + 
       geom_bar(aes(y = (..count..)/sum(..count..)),position = "dodge") + 
       aes(gender, fill = purchase)
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")
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)