Картограммы в 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. • Проекции: не секрет, что изображение земли на карте и на глобусе сильно отличаются друг от друга. Так, например, большинство современных карт изображают северные и южные регионы гораздо бо́льшими, чем они есть на самом деле. Разными проекциями карт можно подчеркнуть какой-нибудь интересный факт. Советую почитать данную статью, чтобы лучше понять, в чем дело.

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

Автор
0 комментариев
Для комментирования необходимо авторизоваться