并排条形图,其中各列按组比例(相对频率条形图)

ayo*_*rgo 2 r bar-chart ggplot2 dplyr

数据集

gender <- c('Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Female', 'Female', 'Male', 'Female', 'Female', 'Male', 'Female', 'Female')
answer <- c('Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'No', 'No', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes')
df <- data.frame(gender, answer)
Run Code Online (Sandbox Code Playgroud)

对女性有偏见:

df %>% ggplot(aes(gender, fill = gender)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我的任务是构建一个图表,以便轻松找出两种性别中哪一种更有可能说出来'Yes'

但是,考虑到偏见,我不能只是这样做

df %>% ggplot(aes(x = answer, fill = gender)) + geom_bar(position = 'dodge')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

甚至

df %>% ggplot(aes(x = answer, y = ..count../sum(..count..), fill = gender)) +
geom_bar(position = 'dodge')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

为了减轻偏差,我需要将每个计数分别除以男性或女性总数,以便条形图'Female'加起来1'Male'条形图一样。就像这样:

df.total <- df %>% count(gender)
male.total <- (df.total %>% filter(gender == 'Male'))$n
female.total <- (df.total %>% filter(gender == 'Female'))$n

df %>% count(answer, gender) %>% 
mutate(freq = n/if_else(gender == 'Male', male.total, female.total)) %>% 
ggplot(aes(x = answer, y = freq, fill = gender)) + 
geom_bar(stat="identity", position = 'dodge')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这描绘了一幅完全不同的画面。

问题

  1. dplyr有没有办法仅使用and来简化前一段代码ggplot2
  2. 还有其他库可以做得更好吗?
  3. 上述类型的图表有约定的名称吗?

谢谢。

Jak*_*upp 5

问题一:

df %>%  
  count(gender, answer) %>% 
  group_by(gender) %>% 
  mutate(freq = n/sum(n)) %>% 
  ggplot(aes(x = answer, y = freq, fill = gender)) + 
  geom_bar(stat="identity", position = 'dodge')
Run Code Online (Sandbox Code Playgroud)

问题2:

您可能可以使用其他包以更少的行数完成此操作。

问题3:

相对频率条形图。