Картограммы в R. Часть 2 | OTUS
🔥 Начинаем BLACK FRIDAY!
Максимальная скидка -25% на всё. Успейте начать обучение по самой выгодной цене.
Выбрать курс

Курсы

Программирование
iOS Developer. Basic
-25%
Python Developer. Professional
-25%
Разработчик на Spring Framework
-25%
Golang Developer. Professional
-25%
Python Developer. Basic
-25%
iOS Developer. Professional
-25%
Node.js Developer
-25%
Unity Game Developer. Professional
-25%
React.js Developer
-25%
Android Developer. Professional
-25%
Software Architect
-25%
C++ Developer. Professional
-25%
Backend-разработчик на PHP Web-разработчик на Python Алгоритмы и структуры данных Framework Laravel PostgreSQL Team Lead Разработчик голосовых ассистентов и чат-ботов Архитектура и шаблоны проектирования Agile Project Manager Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер-практикум по использованию и настройке GIT IoT-разработчик Подготовка к сертификации Oracle Java Programmer (OCAJP) Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Azure для разработчиков"
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK
-25%
DevOps практики и инструменты
-25%
Архитектор сетей
-25%
Инфраструктурная платформа на основе Kubernetes
-25%
Супер-интенсив «ELK»
-16%
Супер-интенсив «IaC Ansible»
-16%
Administrator Linux. Professional MS SQL Server Developer Безопасность Linux PostgreSQL Reverse-Engineering. Professional CI/CD VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Administrator Linux.Basic Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Картограммы в R. Часть 2

R_Deep_17.07_site-5020-0e15f9.png

Перед тем как приступить к самому главному — рисованию карт, хочу обратить внимание, что чем детальнее границы регионов, тем «сложнее» полигоны и больше необходимо времени для отрисовки. Поэтому все регионы РФ без предварительного упрощения границ лучше не изображать. Предлагаю оставить только Центральный федеральный округ.

cfo_map <- map_shp[str_detect(map_shp$ADM3_NAME, "Центральный"), ]

Наконец-то, рисуем!

Добавим цвет, чтобы не было слишком грустно:

plot(cfo_map, main = "Центральный федеральный округ", 
     col = colorRampPalette(brewer.pal(8, "Dark2"))(nrow(cfo_map)))

Снимок_экрана_2019_07_01_в_17.40.15-5020-a90ce4.pngТо же можно проделать и в ggplot. Тут понадобится сделать одно дополнительное действие с помощью функции fortify() (из списка полигонов она сделает единый датафрейм).

Перевод проекции карты в dataframe:

map.df <- fortify(cfo_map, region = "NAME")

Создание объекта карты:

cfo.map <- ggplot(map.df, aes(long, lat, group = group, fill = id)) +

Добавим alpha = 0.7, чтобы полигоны слегка просвечивали:

            geom_polygon(color = "white", alpha = 0.7) +
            coord_map() +
            labs(x = "Долгота", y = "Широта", fill = "") +
            ggtitle("Центральный фед. округ")

Выведем полученный объект:

cfo.map

Снимок_экрана_2019_07_01_в_17.40.57-5020-e7a89d.png Здорово, но как-то скучно, правда? Было бы проще ориентироваться, если бы регионы на карте были подписаны. Не беда, надо лишь рассчитать центроиды (координаты, куда поместим надпись).

centroid <- aggregate(cbind(long, lat) ~ id, data = map.df, FUN = mean)
cfo.map <- ggplot(map.df, aes(long, lat, group = group, fill = id)) +
            geom_polygon(color = "white", alpha = 0.7) +
            geom_text(data = centroid, mapping = aes(x = long, y = lat, label = id), 
                      inherit.aes = F, cex = 1.5) +
            coord_map() +
            labs(x = "Долгота", y = "Широта") +
            ggtitle("Центральный фед. округ") + 
            theme(legend.position = "none")

cfo.map

PLOT3-20219-3025e3.jpgТак уже лучше! Для разнообразия рассмотрим очень простую прикладную задачу: заливка с зависимости от свойств региона. В нашем случае это будет логарифм количества филиалов банков из других регионов в 2014 г. (данные GISGeo).

banks <- readOGR("~/Banks/banks.shp", encoding = "cp1251")
## OGR data source with driver: ESRI Shapefile
## Source: "/Users/akondrashov/Banks/banks.shp", layer: "banks"
## with 83 features
## It has 12 fields
banks_cfo <- banks[str_detect(banks$FEDERAL_DI, "Центральный"), ]
bank.df <- merge(map.df, banks_cfo@data[, c("NAME", "N2014_BAN2")], by.x = "id", by.y = "NAME")

cfo.map_banks <- ggplot(bank.df, aes(long, lat, group = group, fill = log(N2014_BAN2))) +
            geom_polygon(color = "white", alpha = 0.7) +
            geom_text(data = centroid, mapping = aes(x = long, y = lat, label = id), 
                      inherit.aes = F, cex = 1.5) +
            coord_map() +
            labs(x = "Долгота", y = "Широта", fill = "Логарифм кол-ва банков") +
            ggtitle("Центральный фед. округ") +
            theme(legend.position = "bottom")

cfo.map_banks

PLOT4-20219-776874.jpg

Дополнительно

В данной заметке приведён далеко не весь функционал, доступный при рисовании карт. Рекомендую обратить внимание на следующее: • Пакет ggmap — с недавних (относительно даты этой заметки) работает только по подписке google (требуется API-ключ), позволяет изображать полигоны на фоне реальных гугл-карт. Гитхаб. • С помощью leaflet и plotly можно построить интерактивные картограммы. • Собственные карты также можно экспортировать из различного ПО для GIS. Из свободно распространяемых подойдёт QGIS. • Проекции: не секрет, что изображение земли на карте и на глобусе сильно отличаются друг от друга. Так, например, большинство современных карт изображают северные и южные регионы гораздо бо́льшими, чем они есть на самом деле. Разными проекциями карт можно подчеркнуть какой-нибудь интересный факт. Советую почитать данную статью, чтобы лучше понять, в чем дело.

На этом всё! Если есть вопросы — пишите в комментариях.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
1 комментарий
0

Артём, здравствуйте!

Большое спасибо за интересную и полезную для осуществления первых шагов по работе с картограммами в R заметку. Но хотелось бы попросить у Вас совета относительно двух моментов.

  1. При использовании файла с границами субъектов РФ, размещённого по адресу http://gisgeo.org/assets/files/Regions.zip, да и других тоже (например, https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_RUS_0_sf.rds) при загрузке карты всей РФ изображение получается разорванным в районе значения долготы, равного 180 градусов (т. е. на Чукотке). Как этого избежать, если требуется отображать РФ целиком?

  2. Названия объектов, заключённых в NAME и ADM3_NAME, выглядят как Липецкая область (это тот самый ЦФО, рассматриваемый в статье). Можно ли автоматизировать конвертацию таких имён в удобочитаемый вариант?

Спасибо.

Для комментирования необходимо авторизоваться
🎁 Максимальная скидка!
Черная пятница уже в OTUS! Скидка -25% на всё!