R:使用三个分类变量创建高级条形图 + 总结 table 附在图的底部

R: Creating advanced bar plot with three categorical variables + summarizing table attached at the bottom of figure

这是我关于 Whosebug 的第一个问题。我有一个关于使用 R 创建包含三个分类变量的条形图的问题。我只使用 R 三个星期,所以我希望你能帮助我解决这个问题。

我有一个数据框,它汇总了每个年龄段两个地方(地点 1 和地点 2)的女性和男性人数。我对两个地方和每个年龄组的男性和女性比例感兴趣,以便进行比较。数据如下所示:

# Females
data_female <- data.frame(agegroup = c("0-4","5-14","15-24","25-44","45-64","65-74","75-120"),
                          number_place1 = c(7000, 12000, 15000,40000, 36000, 10000, 13000),
                          number_place2 = c(163000, 360000, 350000,800000, 900000, 360000, 370000))
# Extra columns
data_female <- data_female %>%
               mutate(percentage_place1 = number / sum(number) * 100,
                      percentage_place2 = number / sum(number) * 100,
                      gender = "F") %>%
               select(agegroup, percentage_place1, percentage_place2, gender)

# Males
data_male <- data.frame(agegroup = c("0-4","5-14","15-24","25-44","45-64","65-74","75-120"),
                          number_place1 = c(6000, 13000, 13000,38000, 37000, 9000, 12000),
                          number_place2 = c(161000, 340000, 320000,699000, 900230, 330600, 385000))
# Extra columns
data_male <- data_male %>%
               mutate(percentage_place1 = number / sum(number) * 100,
                      percentage_place2 = number / sum(number) * 100,
                      gender = "M") %>%
               select(agegroup, percentage_place1, percentage_place2, gender)

然后将两个数据帧合并为一个,'pivot_longer' 用于创建一个 'long' 数据帧:

data <- rbind(data_females, data_males)

data_long <- data %>%
              rename(place1 = percentage_place1, place2 = percentage_place2) %>%
              pivot_longer(cols = c("place1","place2"),names_to = "place", values_to = "percentage")

最后我有一个包含以下列的数据框:

根据这个数据框,我想创建一个看起来与可以在此处找到的图完全一样的图:

这是一个条形图:

现在,我有一个代码如下的图形:

ggplot(data_long, aes(x= agegroup, y=percentage, fill=interaction(place,sex))) +   
  geom_bar(position='dodge', stat='identity') +
  facet_wrap( ~ name)

这个图有两个较大的列,“place1”和“place2”(因为face_wrap()),但我想将它们组合成一个列图作为示例图。另外,我怎样才能像示例中那样在条形图下方创建漂亮的 table?

希望大家明白我的意思。有没有人有制作过这样的人物的经验?

您可以使用“鬼鬼祟祟的方面”方法。

首先确保您的分类变量处于所需的顺序:

agelevels <- c("0-4", "5-14", "15-24", "25-44", "45-64", "65-74", "75-120")
data_long <- data_long %>% mutate(agegroup = factor(agegroup, agelevels),
                                  gender = factor(gender, c("M", "F")))

然后我们在x轴上绘制性别,并根据性别和地点之间的相互作用进行填充。然后,我们沿 x 轴按年龄组分面,移除面板和每个面板边框之间的间距。最后我们将 facet strip 的位置切换到底部(在外面)并移除它的背景,使它看起来像一个次要的 x 轴:

ggplot(data_long, aes(x = gender, y = percentage, 
                      fill = interaction(place, gender))) +   
  geom_col(position = 'dodge', color = "gray50") +
  facet_grid( ~ agegroup, switch = "x") +
  scale_fill_manual(values = c("#a8d094", "#9fc0e7", "#97a891", "#95a5c2"),
                    labels = c("Male, place 1", "Male, place 2",
                               "Female, place 1", "Female, place 2")) +
  labs(fill = "", x = "Age group") +
  theme_bw() +
  theme(panel.spacing = unit(0, "points"),
        panel.border = element_blank(),
        axis.line = element_line(),
        strip.placement = "outside",
        strip.background = element_blank(),
        legend.position = "bottom",
        panel.grid.major.x = element_blank())