Как создать пирамиду населения в 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 population variable
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 1 M 2.424362
#2 2 M 1.794957
#3 3 M 1.589594
#4 4 M 1.556063
#5 5 M 1.053662
#6 6 M 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)) +
 coord_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") +
 coord_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_colour_manual(values = c("pink", "steelblue"),
 aesthetics = c("colour", "fill")) +
 coord_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 population variable
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 M A 11328
#2 2 M A 8387
#3 3 M A 7427
#4 4 M A 7271
#5 5 M A 4923
#6 6 M A 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") + 
 coord_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") + 
 coord_flip() +
 facet_wrap(~ country) +
 theme_classic() + 
 theme(axis.text.x = element_text(angle = 90, hjust = 1))

Или вы можете использовать пользовательские ggthemes. Полный список ggthemes можно найти на странице документации .