首页 > 解决方案 > 在 ggplot r 中为两组女性创建直方图

问题描述

我想创建一个直方图,显示每个年龄组(x 轴)的女性比例(y 轴)。我想为每个年龄组设置两个条形图,分别代表患有“N”疾病和没有“N”疾病的女性。

数据:

示例数据

我审查过的与该主题相关的其他帖子:

r 在直方图中按 bin 的百分比 ggplot

具有多个因子分组和这些因子变量平均值的条形图

我试过的代码:

ggplot(N_group, aes(x=Age_2, fill=Sex))+
  geom_bar(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..]), position="dodge" ) +
  geom_text(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..], 
label=scales::percent(..count../tapply(..count.., ..x.. ,sum)[..x..]) ),
            stat="count", position=position_dodge(0.9), vjust=-0.5)

这比较了患有“N”病的男性和女性。

标签: rggplot2histogramgeom-bar

解决方案


在这里,一个可能的解决方案是计算 的比例ggplot2

在这里,一个使用以下假数据框的示例:

df <- data.frame(ID = 1:40,
                 N = sample(c(0,1),40,replace = TRUE),
                 age_group = sample(1:4,40, replace = TRUE),
                 sex = sample(c("M","F"),40,replace = TRUE))

使用dplyr包,您可以计算每个性别的每个年龄组的每个 N 组的比例:

library(dplyr)

df %>% 
  #group_by(sex, age_group, N, .drop = FALSE) %>% 
  count(sex, age_group, N) %>% 
  filter(sex =="F") %>%
  group_by(age_group) %>%
  mutate(Percent = n / sum(n))


# A tibble: 8 x 5
# Groups:   age_group [4]
  sex   age_group     N     n Percent
  <fct>     <int> <dbl> <int>   <dbl>
1 F             1     0     1   0.167
2 F             1     1     5   0.833
3 F             2     0     2   0.4  
4 F             2     1     3   0.6  
5 F             3     0     2   0.4  
6 F             3     1     3   0.6  
7 F             4     0     1   0.5  
8 F             4     1     1   0.5 

传递此管道序列为ggplot2您提供以下图表:

library(dplyr)
library(ggplot2)

df %>% 
  count(sex, age_group, N) %>% 
  filter(sex =="F") %>%
  group_by(age_group) %>%
  mutate(Percent = n / sum(n)) %>%
  ggplot(aes(x = age_group, y = Percent, fill = factor(N)))+
  geom_col(position = position_dodge())+
  scale_y_continuous(labels = scales::percent)

在此处输入图像描述

它回答了你的问题吗?


推荐阅读