Изменение / добавление пространственных границ / шейп-файла полигона R
Я имею дело с шейп-файлом Афганистана, который содержит все провинции. В конечном итоге я хочу представить некоторые данные по региональным командам, каждая из которых содержит несколько провинций (об этом я и говорю: http://en.wikipedia.org/wiki/File:Afghanistan_ISAF_Sept2008.jpg). Я не очень хорошо знаком с обработкой шейп-файлов в R, но я не нашел много учебников по этому вопросу. Можно ли перерисовать полигоны или наложить границы RC и построить таким образом хороплет? Благодарю.
1 ответ
Что-то вроде этого?
Код:
library(rgdal) # for readOGR(...)
library(ggplot2) # for fortify(...) and rendering the map
setwd("<directory with all your files>")
regional.commands <- read.csv("regional.commands.csv")
map <- readOGR(dsn=".", layer="afghanistan_province_boundaries_-_34_provinces")
data <- data.frame(id=rownames(map@data),Province=map@data$Prov34Na)
data <- merge(data,regional.commands,by="Province")
map.df <- fortify(map)
map.df <- merge(map.df,data,by="id", all.x=T)
map.df <- map.df[order(map.df$order),]
ggplot(map.df, aes(x=long,y=lat, group=group))+
geom_polygon(aes(fill=RC))+
geom_path(colour="grey70")+
coord_fixed()
В этом примере regional.commands.csv
был собран (вручную!!!!) из данных на веб-сайте ISAF. Этот файл имеет только две колонки: Province
а также RC
(региональное командование). Предположительно, у вас уже есть что-то подобное, но не было необходимости делиться этим. Шейп-файл Афганистана был получен здесь.
объяснение
Шейп-файл считывается в R с помощью readOGR(...)
создание объекта "SpatialPolygonsDataFrame" (map
). Этот объект имеет два основных раздела: раздел многоугольников, который содержит координаты границ многоугольника, и раздел данных, который содержит информацию о каждом многоугольнике (например, название провинции). На последний можно ссылаться, используя map@data
,
Каждый polgyon имеет уникальный идентификатор. Они хранятся в именах строк map@data
, Итак, сначала мы создаем фрейм данных data
с колонкой id
из имен строк map@data
и столбец Province
из соответствующей колонки map@data
(колонка Prov34Na
).
data <- data.frame(id=rownames(map@data),Province=map@data$Prov34Na)
Если у вас другой шейп-файл для Афганистана, соответствующий столбец map@data
может быть другим.
Теперь мы объединяем это с regional.commands
кадр данных на основе общего Province
колонка.
data <- merge(data,regional.commands,by="Province")
data
теперь имеет 3 столбца: Province
, id
, а также RC
(Региональное командование). Одна вещь, на которую следует обратить внимание, это то, что ИСАФ, очевидно, считает, что лучше всего знает, как пишутся названия провинций Афганистана. Некоторые из них не соответствуют написанию в таблице атрибутов карты. Так что, возможно, вам придется исправить это, опять же, вручную...
Теперь мы используем fortify(...)
создать из map
, кадр данных, подходящий для построения графика (map.df
). Этот фрейм данных имеет id
столбец, поэтому мы объединяем это с data
основанный на id
,
map.df <- merge(map.df,data,by="id", all.x=T)
Наконец, все это объединение испортило порядок строк, поэтому мы изменили порядок, используя столбец порядка в map.df
,
map.df <- map.df[order(map.df$order),]
Остальное - просто генерация слоев и рендеринг графика.