В последние годы мы видим всё меньше карт России в официальных аналитических отчётах. Связано это в том числе с тем, что институты, которые делают качественные карты и имеют удобный API не меняли карту России с 2014 г. В 2022 году в соства России вступили ещё 4 региона и на доступных картах России их нет. Я предлагаю простое решение этой проблемы.
В этой статье я не пытаюсь никого оскорбить. Эта статья про работу с данными и красивые картинки в форме карт.
Для работы нам понадобятся библиотеки:
library(GADMTools) # Работа с картами GADM
library(terra) # Библиотека для обработки карт
library(tidyverse)
library(geodata) # Выгрузка карт GADM
library(tidyterra) # Для рисования объектов SpatVector в ggplot
library(readxl) # загрузка excel
library(rcartocolor) # Цвета для карт
library(sysfonts) # биллиотека для работы с шрифтами
library(showtext) # для компиляции шрифтов в ggplot
showtext_auto() # использовать showtext для рендера текста
font_add_google('Rampart One') # Красивый шрифт для графика
Библиотеки, связанные с картами, обновляются чаще прочих. Чтобы всё работало, используйте update.packages()
.
Выгрузим карту России с GADM. Аргумент level = 1
означает, что мы хотим карту на уровне регионов.
rus <- gadm(country = 'RUS', level = 1, path=tempdir()) %>%
project('+proj=lcc +lat_1=0 +lat_2=1 +lon_0=15 +datum=WGS84')
Мы уже можем построить карту России, но опубликовать её не получится.
plot(rus)

Загрузим карту Украины.
ukr <- gadm(country = 'UKR', level = 1, path = tempdir()) %>%
project('+proj=lcc +lat_1=0 +lat_2=1 +lon_0=15 +datum=WGS84')
russia_with_crimea <- rbind(rus, ukr[which(ukr$NAME_1 == 'Crimea')])
plot(russia_with_crimea)

russia_with_crimea <- rbind(russia_with_crimea, ukr[c(7, 10, 16, 27)])
Мы сделали карту России в примерно текущих границах. По крайней мере, такую карту мы сможем опубликовать.
На следующем этапе встаёт вопрос о том, насколько такую карту удобно использовать вместе с Российской статистикой. Дело в том, что для построения карт на основе данных Российской статистики нужно объединить объект SpatVector
и data.frame
с данными, например, Росстата. Мы можем сделать это при сопоставлении названий регионов в двух объектах. Проблема в том, что названы они по-разному. Я проделал небольшую работу и переназвал регионы в новой карте так, чтобы они соответствовали официальным названиям в статистике. Новую карту вы можете скачать из моего GitHub
хранилища.
map <- vect('rwc.shp')
Графики в ggplot
Для примера совмещения карт c данными Росстата мы возьмём статистику ЕМИСС об индексе потребительских цен.
data <- rio::import('https://github.com/ETymch/Econometrics_2023/blob/main/Datasets/data_reg_cpi.xls?raw=true') %>%
dplyr::glimpse() %>%
na.omit()
colnames(data)[c(1,5)] <- c('NL_NAME_1', 'ИПЦ')
data <- data %>% select(NL_NAME_1, ИПЦ) %>%
mutate(ИПЦ = as.numeric(ИПЦ) - 100)
Поскольку мы проделали работу и теперь данные Росстата полностью совместимы с нашей картой, это действие занимает одну строчку кода:
map <- map %>% merge(data)
Наконец, можно нарисовать карту:
ggplot() +
geom_spatvector(data = map, aes(fill = ИПЦ, color = ИПЦ)) +
theme_classic() +
rcartocolor::scale_color_carto_c(palette = 'TealRose') +
rcartocolor::scale_fill_carto_c(palette = 'TealRose') +
theme(axis.line=element_blank(),axis.text.x=element_blank(),
axis.text.y=element_blank(),axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),legend.position="bottom",
legend.title=element_blank(),
plot.title = element_text(family = 'Rampart One', size = 23, hjust = 0.5, color = '#d0587e'),
plot.subtitle = element_text(family = 'Rampart One', size = 18, hjust = 0.5, color = '#d0587e'),
legend.text = element_text(family = 'Rampart One', size = 16, color = '#d0587e')
) +
labs(title = 'Рост цен в регионах России',
subtitle = 'март 2022 - март 2023, (%)')

Ура! Теперь рисовать статистические карты в R - проще простого. Надеюсь, вам помог этот текст.