R fortifica causando la rotura de polígonos

10

Tengo problemas para trazar mis datos espaciales usando ggplot2. El mapa se ve bien cuando se traza usando spplot, por lo que supongo que el desgarro se produce en la etapa de fortificación.

El código es el siguiente:

#install the packages
library(rgdal)
library(mapproj)
library(raster)
library(rgeos)
library(ggplot2)
library(plyr)

if (!require(gpclib)) install.packages("gpclib", type="source")
gpclibPermit()

setwd("C:/Users/My Documents")

#read in laa to regional mapping
#must aggregate to higher level regions as data is provided at this higher level
laa_region_mapping <- read.csv("laa_region.csv", header = TRUE)

#read in LAA polygons
laa_polygons <- readOGR("ctyua_ew_generalised_WGS84.json", "OGRGeoJSON")

#merge by laa to add region column to polygon data
laa_polygons_with_region_data <- merge(laa_polygons, laa_region_mapping,
                                by.x = "CTYUA13NM", by.y = "LAA",
                                all.x = TRUE, all.y = TRUE)

# aggregate laa polygons by the 21 regions (aggregate by regoin_code)
region_polygons <- raster::aggregate(laa_polygons_with_region_data, "region_code")

El agregado ha funcionado, como se puede ver en la trama (nota: encontré cómo agregar por regiones desde esta publicación SE: Unir polígonos espaciales por código en R )

#plot the resulting polygons using spplot
spplot(region_polygons)

ingrese la descripción de la imagen aquí

Pero cuando fortifico los datos espaciales para poder usar ggplot, hay rasgaduras en los bordes.

#fortify and merge to create the data frame ggplot will show on the map
region_polygons@data$id <- rownames(region_polygons@data)
region_polygons.points <- fortify(region_polygons, region = "id")

# plot the fortified df using ggplot
ggplot(data = region_polygons.points, aes(x= long, y = lat, group = id, fill=id)) + geom_polygon()

ingrese la descripción de la imagen aquí

¿Cómo puedo detener este desgarro?

He observado respuestas similares en SE, pero las respuestas sugieren que el desgarro ocurre durante una fusión ( ¿Cuál es la causa del 'desgarro' de los polígonos (artefactos) usando R, ggplot y geom_polygon? ). Creo que mi desgarro ocurre en la etapa de fortificación, ya que la mancha antes de la fortificación se ve bien.

annievic
fuente
primero debe generalizar su conjunto de datos para eliminar el problema (su programa no puede manejar tantos vértices)
Mapperz

Respuestas:

15

Deberías usarlo group=groupen el aesmapeo. Aquí hay un ejemplo reproducible de su problema:

library("ggplot2")
library("raster")

x <- getData('GADM', country='GBR', level=2)
y <- fortify(x, region="NAME_2")
head(y)
#     long   lat order  hole piece      group       id
# 1 -2.049 57.23     1 FALSE     1 Aberdeen.1 Aberdeen
# 2 -2.049 57.23     2 FALSE     1 Aberdeen.1 Aberdeen
# 3 -2.049 57.23     3 FALSE     1 Aberdeen.1 Aberdeen
# 4 -2.050 57.23     4 FALSE     1 Aberdeen.1 Aberdeen
# 5 -2.050 57.23     5 FALSE     1 Aberdeen.1 Aberdeen
# 6 -2.050 57.23     6 FALSE     1 Aberdeen.1 Aberdeen


# wrong group aesthetic
ggplot(data=y, aes(y=lat, x=long, group=id, fill=id)) +
  geom_polygon() + 
  guides(fill=FALSE)

wronge aes-group

# fixed plot
ggplot(data=y, aes(y=lat, x=long, group=group, fill=id)) +
  geom_polygon() +
  guides(fill=FALSE)

parcela fija

rcs
fuente
1
Gracias @rcs, este es exactamente el problema. Ya está arreglado.
annievic
44
Breve explicación: en un conjunto de datos de polígonos espaciales fortificados, ides la identificación de la característica y groupla identificación de anillos individuales (islas, agujeros, etc.). Entonces, si dibujas con idel grupo, dibuja todos los bits de tu característica como un anillo, de ahí el "desgarro" cuando salta entre las islas.
Spacedman
Para la posteridad, dejaré otra sugerencia aquí ya que la veo a menudo ... Una razón común para el desgarro de polígonos son los datos sin clasificar. Si especificar la groupestética correcta no lo resuelve (lo cual no se aplica a este ejemplo específico), y <- y[order(y$order),]probablemente lo intente . La ordercolumna crea la fortifyfunción por este mismo motivo.
dmp