绘制4组 - 女性入院和未入学,男性入学,未入学ggplot2

GaB*_*GaB 2 r ggplot2

我正面临一个问题.我想在RStudio中绘制所有四个变量.我似乎有2组3个变量和一个Count.然而,不知道如何使用ggplot2来做到这一点.在xlim轴上应该是age_band和sex.在y轴上承认和未被录取的人数.我希望这个传说落在叠加的条形图上.贝娄我因为分析和数据的机密性而添加了绘制的图片.有人可以帮忙吗?我搜索了stackoverflow,但找不到一个好的可重现代码.

这是我操作技术后的两种数据.

第一类数据:

 structure(list(age_band = c("0 yrs", "0 yrs", "0 yrs", "0 yrs", 
                       "1-4 yrs", "1-4 yrs", "1-4 yrs", "1-4 yrs", 
                     "10-14 yrs", "10-14 yrs", "10-14 yrs", "10-14 yrs",                              
                      "15-19 yrs", "15-19 yrs", "15-19 yrs","15-19 yrs"), 
            sex = c("Female", "Female", "Male", "Male", "Female", 
                     "Female", "Male", "Male", "Female", "Female", 
                    "Male", "Male", "Female", "Female", "Male", "Male"), 
            patient.class = c("Not Admitted", "ORDINARY ADMISSION", 
                              "Not Admitted", "ORDINARY ADMISSION", "Not 
                               Admitted", "ORDINARY ADMISSION", "Not 
                               Admitted", "ORDINARY ADMISSION", 
                               "Not Admitted", "ORDINARY ADMISSION", "Not 
                                Admitted", "ORDINARY ADMISSION", "Not 
                               Admitted", "ORDINARY ADMISSION", 
                               "Not Admitted", "ORDINARY ADMISSION"), 
            Count = c(5681L, 1458L, 7667L, 2154L, 8040L, 2481L, 11737L, 
                      3601L, 2904L, 938L, 3883L, 1233L, 3251L, 1266L, 
                      2465L, 1031L)), 
            row.names = c(NA, -16L), class = c("tbl_df", "tbl", 
           "data.frame"
         ))
Run Code Online (Sandbox Code Playgroud)

第二类数据:

   structure(list(age_band = c("0 yrs", "0 yrs", "0 yrs", "0 yrs", 
                               "1-4 yrs", "1-4 yrs", "1-4 yrs", "1-4 yrs", 
                               "10-14 yrs", "10-14 yrs", 
                               "10-14 yrs", "10-14 yrs", "15-19 yrs", 
                               "15- 19 yrs", "15-19 yrs", "15-19 yrs"), 
         sex_patient_class = c("female_admitted", "female_not_admitted", 
                                "male_admitted", "male_not_admitted", 
                               "female_admitted", "female_not_admitted", 
                               "male_admitted", "male_not_admitted", 
                               "female_admitted", "female_not_admitted", 
                               "male_admitted", "male_not_admitted", 
                               "female_admitted", "female_not_admitted", 
                               "male_admitted", "male_not_admitted"), 
         Count = c(1458L, 5681L,  2154L, 7667L, 2481L, 8040L, 3601L, 11737L, 
                   938L, 2904L, 1233L, 3883L, 1266L, 3251L, 1031L, 2465L)), 
         row.names = c(NA, -16L), class = c("grouped_df", "tbl_df", "tbl", 
                                            "data.frame"), 
        vars = "age_band", drop = TRUE, indices = list( 0:3, 4:7, 8:11, 
                                                        12:15), 
        group_sizes = c(4L, 4L, 4L, 4L), biggest_group_size = 4L, labels = 
        structure(list(age_band = c("0 yrs", "1-4 yrs", "10-14 yrs", "15-19 
                                     yrs")), 
         row.names = c(NA, -4L), class = "data.frame", vars = "age_band", 
         drop = TRUE))
Run Code Online (Sandbox Code Playgroud)

kat*_*ath 6

要将入院患者的栏目叠加到未入院的患者身上,您可以通过两种方式过滤数据.我在开头指定美学以具有共同的填充图例.

library(tidyverse)

ggplot(my_data2, aes(age_band, Count, fill = sex_patient_class)) +
  geom_col(data = filter(my_data2, sex_patient_class %in% c("male_not_admitted", "female_not_admitted")), 
           position = position_dodge()) +
  geom_col(data = filter(my_data2, sex_patient_class %in% c("male_admitted", "female_admitted")), 
           position = position_dodge(0.9), width = 0.5) +
  scale_fill_manual(name = "", 
                    breaks = c("male_admitted", "male_not_admitted", 
                               "female_admitted", "female_not_admitted"),
                    labels = c("Male Admitted", "Male Not admitted", 
                               "Female Admitted", "Female Not admitted"), 
                    values = c("grey80", "black", "red", "orange"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

详细解释

实际叠加发生在两个geom_col调用中.调用的顺序很重要,因为第二个绘制在第一个上面.因此,我们从"后退"列开始:

随着filter我们只能选择not_admitted患者,并以此作为该数据geom_col.我们不需要从初始 - ggplot调用重复美学,因为如果没有另外指定,则继承.position_dodge()将列放在每个年龄组中.

p <- ggplot(my_data2, aes(age_band, Count, fill = sex_patient_class)) +
  geom_col(data = filter(my_data2, sex_patient_class %in% c("male_not_admitted", "female_not_admitted")), 
           position = position_dodge()) 
p
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在要在顶部添加其他列,我们将过滤器语句更改为允许的患者.由于我们希望"前"列比"后"列窄,我们指定width=0.5.

p + geom_col(data = filter(my_data2, sex_patient_class %in% c("male_admitted", "female_admitted")), 
             position = position_dodge(), width = 0.5)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在我们差不多完成了.要在"后"列的中心移动"前"列,我们需要指定宽度position_dodge().在这种情况下,以它们为中心,值为0.9.要在"保存侧"(即确保真正居中在后列的前面)为两个geom_col-calls 指定相同的闪避宽度.然后,我们更改不那么漂亮的颜色(这里使用brewer-palette"Paired")和图例信息并完成:

p + geom_col(data = filter(my_data2, sex_patient_class %in% c("male_admitted", "female_admitted")), 
             position = position_dodge(0.9), width = 0.5) +
  scale_fill_brewer(name = "", 
                    breaks = c("male_admitted", "male_not_admitted", 
                               "female_admitted", "female_not_admitted"),
                    labels = c("Male Admitted", "Male Not admitted", 
                               "Female Admitted", "Female Not admitted"), 
                    palette = "Paired")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述