如何在 r 中创建人口金字塔


人口金字塔是显示给定人口的年龄和性别分布的图表。这是一个有用的图表,可以轻松了解人口构成以及当前的人口增长趋势。

如果人口金字塔呈矩形,则表明人口增长速度较慢;老一代被大小大致相同的新一代所取代。

如果人口金字塔的形状像金字塔,则表明人口增长速度较快;老一代产生了新的、更大的一代。

在该图中,性别显示在左侧和右侧,年龄显示在y轴上,人口百分比或数量显示在x轴上。

本教程介绍如何在 R 中创建人口金字塔。

在 R 中创建人口金字塔

假设我们有以下数据集,显示基于年龄(0 到 100 岁)和性别(M =“男性”,F =“女性”)的人口百分比构成:

 #make this example reproducible
set.seed(1)

#create data frame
data <- data.frame(age = rep(1:100, 2), gender = rep(c("M", "F"), each = 100))

#add variable population
data$population <- 1/sqrt(data$age) * runif(200, 10000, 15000)

#convert population variable to percentage
data$population <- data$population / sum(data$population) * 100

#view first six rows of dataset
head(data)

# age gender population
#1 1M 2.424362
#2 2M 1.794957
#3 3M 1.589594
#4 4M 1.556063
#5 5M 1.053662
#6 6M 1.266231

我们可以使用ggplot2库为此数据集创建一个基本的人口金字塔:

 #load ggplot2
library(ggplot2)

#create population pyramid
ggplot(data, aes(x = age, fill = gender,
                 y = ifelse(test = gender == "M",
                            yes = -population, no = population))) + 
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = abs, limits = max(data$population) * c(-1,1)) +
  coordinate_flip()

添加标题和标签

我们可以使用labs()参数将标题和轴标签添加到人口金字塔中:

 ggplot(data, aes(x = age, fill = gender,
                 y = ifelse(test = gender == "M",
                            yes = -population, no = population))) + 
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = abs, limits = max(data$population) * c(-1,1)) +
  labs(title = "Population Pyramid", x = "Age", y = "Percent of population") +
  coordinate_flip()

改变颜色

我们可以使用scale_color_manual()参数更改用于表示性别的两种颜色:

 ggplot(data, aes(x = age, fill = gender,
                 y = ifelse(test = gender == "M",
                            yes = -population, no = population))) + 
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = abs, limits = max(data$population) * c(-1,1)) +
  labs(title = "Population Pyramid", x = "Age", y = "Percent of population") +
  scale_color_manual(values = c("pink", "steelblue"),
aesthetics = c("color", "fill")) +
  coordinate_flip()

多时代金字塔

还可以使用facet_wrap()参数将多个人口金字塔绘制在一起。例如,假设我们有A、B、 C三个国家的人口数据。以下代码说明了如何为每个国家创建人口金字塔:

 #make this example reproducible
set.seed(1)

#create data frame
data_multiple <- data.frame(age = rep(1:100, 6),
                   gender = rep(c("M", "F"), each = 300),
                   country = rep(c("A", "B", "C"), each = 100, times = 2))

#add variable population
data_multiple$population <- round(1/sqrt(data_multiple$age)*runif(200, 10000, 15000), 0)

#view first six rows of dataset
head(data_multiple)

# age gender country population
#1 1 MA 11328
#2 2 MA 8387
#3 3 MA 7427
#4 4 MA 7271
#5 5 MA 4923
#6 6 MA 5916

#create one population pyramid per country
ggplot(data_multiple, aes(x = age, fill = gender,
                          y = ifelse(test = gender == "M",
                                     yes = -population, no = population))) + 
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = abs, limits = max(data_multiple$population) * c(-1,1)) +
  labs(y = "Population Amount") + 
  coordinate_flip() +
  facet_wrap(~country) +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) #rotate x-axis labels

改变主题

最后,我们可以更改图形的主题。例如,以下代码使用theme_classic()使图形看起来更加简约:

 ggplot(data_multiple, aes(x = age, fill = gender,
                          y = ifelse(test = gender == "M",
                                     yes = -population, no = population))) + 
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = abs, limits = max(data_multiple$population) * c(-1,1)) +
  labs(y = "Population Amount") + 
  coordinate_flip() +
  facet_wrap(~country) +
theme_classic() + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

或者您可以使用自定义 ggthemes。有关 ggthemes 的完整列表,请参阅文档页面

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注