柱状图中按仓位划分的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)