Как сохранить информацию из шейп файла после fortify()
Как сохранить информацию о полигонах после шейп файла? Позвольте мне объяснить:
У меня есть шейп файл с этими данными:
> head([email protected])
ID CD_GEOCODI TIPO CD_GEOCODB NM_BAIRRO CD_GEOCODS NM_SUBDIST CD_GEOCODD NM_DISTRIT CD_GEOCODM NM_MUNICIP NM_MICRO NM_MESO
12228 33679 431490205000133 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12229 33680 431490205000134 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12230 33681 431490205000135 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12231 33682 431490205000136 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12232 33683 431490205000137 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12233 33684 431490205000138 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
и эти данные:
> head(data)
CD_GEOCODI Population
1 431490205000133 1272
2 431490205000134 822
3 431490205000135 1085
4 431490205000136 1454
5 431490205000137 964
6 431490205000138 834
Я мог бы просто объединить data
и [email protected]
и построить его с помощью plot()
, но я хочу использовать ggplot2. Но вывод fortify()
не имеет каких-либо исходных переменных. Например:
> head(fortify(mapa))
Regions defined for each Polygons
long lat order hole piece group id
1 -51.22254 -30.03526 1 FALSE 1 12228.1 12228
2 -51.22332 -30.03648 2 FALSE 1 12228.1 12228
3 -51.22365 -30.03702 3 FALSE 1 12228.1 12228
4 -51.22482 -30.03610 4 FALSE 1 12228.1 12228
5 -51.22488 -30.03606 5 FALSE 1 12228.1 12228
6 -51.22476 -30.03591 6 FALSE 1 12228.1 12228
Оба (fortify и mapa @data) имеют переменную id, но не являются одинаковыми значениями. Итак, опять же, мой вопрос: как передать информацию [email protected]
на вывод fortify()
(или другую функцию, которая позволяет использовать ggplot2)
Ответы
Ответ 1
Поскольку вы не предоставили свой шейп файл или данные, его невозможно проверить, но что-то вроде этого должно работать:
# not tested...
library(plyr) # for join(...)
library(rgdal) # for readOGR(...)
library(ggplot2) # for fortify(...)
mapa <- readOGR(dsn=".",layer="shapefile name w/o .shp extension")
[email protected]$id <- rownames([email protected])
[email protected] <- join([email protected], data, by="CD_GEOCODI")
mapa.df <- fortify(mapa)
mapa.df <- join(mapa.df,[email protected], by="id")
ggplot(mapa.df, aes(x=long, y=lat, group=group))+
geom_polygon(aes(fill=Population))+
coord_fixed()
Ответ 2
Может быть, это немного более простое решение
library(dplyr)
library(ggplot2)
# fortify the shape file
map.df <- fortify(shape, region ="CD_GEOCODI")
# merge data
map.df <- left_join(map.df, data, by=c('id'='CD_GEOCODI'))
Ответ 3
Я столкнулся с одной и той же проблемой и смог добиться желаемых результатов, используя несколько иной подход.
Импорт и форматирование
Я использовал следующий код для чтения фигур:
shps <- maptools::readShapePoly(fn = file.path("file",
"path",
"no extension"),
# Column with unique IDs
IDvar = "geoID")
и впоследствии укрепил объект с помощью кода:
shpsFort <- ggplot2::fortify(model = shps)
Результаты
Это создало data.frame с помощью значение id
, соответствующее столбцу, переданному в IDvar = "geoID"
. Добавление любых других данных может быть просто адресовано с помощью обычной команды merge
.
Ответ 4
Предполагается, что данные $CD_GEOCODI и данные формы @являются уникальными для каждой строки. Ниже приведен лучший и более простой ответ:
library(dplyr)
library(ggplot2)
# fortify the shape file
map.df <- fortify(shape, region ="CD_GEOCODI")
# change data$CD_GEOCODI to character, as shp.df$CD_GEOCODI is of character class.
data <- data %>5 mutate(data, CD_GEOCODI = as.character(CD_GEOCODI))
# merge data
map.df <- left_join(map.df, data, by=c('id'='CD_GEOCODI'))