Картограммы в R. Часть 2
Перед тем как приступить к самому главному — рисованию карт, хочу обратить внимание, что чем детальнее границы регионов, тем «сложнее» полигоны и больше необходимо времени для отрисовки. Поэтому все регионы РФ без предварительного упрощения границ лучше не изображать. Предлагаю оставить только Центральный федеральный округ.
cfo_map <- map_shp[str_detect(map_shp$ADM3_NAME, "Центральный"), ]
Наконец-то, рисуем!
Добавим цвет, чтобы не было слишком грустно:
plot(cfo_map, main = "Центральный федеральный округ", col = colorRampPalette(brewer.pal(8, "Dark2"))(nrow(cfo_map)))
То же можно проделать и в ggplot. Тут понадобится сделать одно дополнительное действие с помощью функции
Перевод проекции карты в 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
Здорово, но как-то скучно, правда? Было бы проще ориентироваться, если бы регионы на карте были подписаны. Не беда, надо лишь рассчитать центроиды (координаты, куда поместим надпись).
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
Так уже лучше! Для разнообразия рассмотрим очень простую прикладную задачу: заливка с зависимости от свойств региона. В нашем случае это будет логарифм количества филиалов банков из других регионов в 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
Дополнительно
В данной заметке приведён далеко не весь функционал, доступный при рисовании карт. Рекомендую обратить внимание на следующее: • Пакет ggmap — с недавних (относительно даты этой заметки) работает только по подписке google (требуется API-ключ), позволяет изображать полигоны на фоне реальных гугл-карт. Гитхаб. • С помощью leaflet и plotly можно построить интерактивные картограммы. • Собственные карты также можно экспортировать из различного ПО для GIS. Из свободно распространяемых подойдёт QGIS. • Проекции: не секрет, что изображение земли на карте и на глобусе сильно отличаются друг от друга. Так, например, большинство современных карт изображают северные и южные регионы гораздо бо́льшими, чем они есть на самом деле. Разными проекциями карт можно подчеркнуть какой-нибудь интересный факт. Советую почитать данную статью, чтобы лучше понять, в чем дело.
На этом всё! Если есть вопросы — пишите в комментариях.