R:使用三个分类变量创建高级条形图,并在图的底部附加汇总表

Arne

这是我关于stackoverflow的第一个问题。我有一个关于使用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")

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

  • 年龄阶层
  • 性别(男/女)
  • 位置(位置1 /步速2)
  • 百分比(每个地点和每个年龄段的男性/女性人数比例)

从这个数据框中,我想创建一个图形,看起来完全像在这里可以找到的图:

在此处输入图片说明

它是带有以下内容的条形图:

  • x轴:地点和性别嵌套在年龄段内。例如在一个年龄段内;男性的颜色较浅(左侧的两个横栏),女性的颜色较深(右侧的两个横栏);在每个性别类别中,我们都有两个条形:place1 =绿色和place2 =蓝色。
  • y轴:百分比(比例)

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

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()),但是我想将它们组合成一个列图作为示例图。另外,如何在示例中在条形图下方创建此漂亮的表格?

我希望我的意思很清楚。有没有创造过此类数字的经验?

艾伦·卡梅伦

您可以使用“鬼nea面孔”方法。

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

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轴按年龄组进行分面,删除面板和每个面板边界之间的间距。最后,我们将小平面条的位置切换到底部(在外部),并删除其背景,使其看起来像辅助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())

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章