¿Cuál es la causa del 'desgarro' de polígonos (artefactos) usando R, ggplot y geom_polygon?

9

Gracias a la respuesta dada en esta pregunta , he podido subconjuntar y dibujar un mapa de divisiones electorales en parte del Reino Unido, en este caso Pembrokeshire. El marco de datos resultante es grande y contiene datos de Ordnance Survey, por lo que sería difícil publicarlo aquí, pero el marco de datos se ve así:

> str(bar)
'data.frame':   134609 obs. of  7 variables:
 $ long : num  214206 214203 214202 214198 214187 ...
 $ lat  : num  207320 207333 207339 207347 207357 ...
 $ order: int  1 2 3 4 5 6 7 8 9 10 ...
 $ hole : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ piece: Factor w/ 12 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ group: Factor w/ 82 levels "Amroth ED.1",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ id   : chr  "Amroth ED" "Amroth ED" "Amroth ED" "Amroth ED" ...

Alimenté el marco de datos resultante para ggplotusar el siguiente código:

ggplot(bar, aes(x = long, y = lat, group = group)) +
  geom_polygon(colour = "black", fill = "grey50")

Esto genera la siguiente imagen, que se ve bonita y limpia. mapa de divisiones electorales

Luego combiné esto con un marco de datos que contiene datos de población, que se ve así:

> str(mydf)
'data.frame':   60 obs. of  22 variables:
 $ ward.code  : chr  "00NSPH" "00NSPJ" "00NSPK" "00NSPL" ...
 $ id         : chr  "Amroth ED" "Burton ED" "Camrose ED" "Carew ED" ...
 $ la         : chr  "Pembrokeshire" "Pembrokeshire" "Pembrokeshire" "Pembrokeshire" ...
 $ total      : num  1237 1737 2458 1570 1976 ...
 $ age.0.4    : num  34 86 81 92 107 76 131 77 90 95 ...
 $ age.5.9    : num  45 93 83 80 138 82 111 85 132 75 ...
 $ age.10.14  : num  65 116 123 103 111 79 151 80 135 83 ...
 $ age.15.19  : num  69 90 161 126 117 93 150 87 139 103 ...
 $ age.20.24  : num  42 63 116 58 81 63 120 58 114 79 ...
 $ age.25.29  : num  46 63 73 60 86 56 90 51 108 67 ...
 $ age.30.34  : num  38 60 87 72 99 54 115 62 76 42 ...
 $ age.35.39  : num  53 105 104 82 110 81 91 76 121 82 ...
 $ age.40.44  : num  70 142 128 107 116 88 161 89 151 92 ...
 $ age.45.49  : num  71 138 172 122 128 109 192 116 190 104 ...
 $ age.50.54  : num  93 136 204 108 133 119 168 125 174 99 ...
 $ age.55.59  : num  126 129 235 125 149 108 179 137 175 106 ...
 $ age.60.64  : num  139 162 248 170 194 129 236 183 199 136 ...
 $ age.65.69  : num  110 110 205 95 129 143 172 128 167 130 ...
 $ age.70.74  : num  81 85 174 52 100 75 110 88 113 128 ...
 $ age.75.79  : num  78 54 130 58 74 70 72 68 119 114 ...
 $ age.80.84  : num  38 50 84 33 56 43 63 42 94 62 ...
 $ age.85.plus: num  39 55 50 27 48 42 36 55 85 84 ...

... usando el siguiente código:

foo <- merge(mydf, bar)

y trazó el resultado así:

ggplot(foo, aes(x = long, y = lat, group = group)) + 
   geom_polygon(colour = "black", fill = "grey50")

El problema es que la trama resultante tiene artefactos como se muestra en la imagen a continuación:

mapa con artefactos

Por lo tanto, el subconjunto de marco de datos original del archivo de forma está bien, pero el archivo de datos combinado tiene 'problemas'.

P. ¿Cuál podría ser la causa de este tipo de artefactos? Entiendo que sin el código completo y los datos esto es una conjetura y me disculpo de antemano por esto, pero el objeto es muy grande y también puede haber problemas de redistribución. Cualquier sugerencia, puntero, sugerencia sobre dónde comenzar a buscar sería apreciada.

Aprendiz lento
fuente
Los problemas de representación como este a menudo provienen de errores de geometría, aunque es extraño que aparezcan después de fusionar los marcos de datos. Intente verificar los errores en QGIS o GRASS (que también puede eliminar los errores por usted).
Simbamangu

Respuestas:

7

Me he dado cuenta tardíamente de que la sortparte de la mergellamada es la culpable. Si yo uso:

foo <- merge(mydf, bar, sort = FALSE)

Los polígonos se trazan correctamente, al menos en este caso particular. Gracias a todos por su aporte.

Aprendiz lento
fuente
6

Compare las columnas largas, largas, largas y huecas de foo con las de barra. La fusión de alguna manera ha perdido esa información.

La razón del desorden suele ser que los polígonos están hechos de más de una pieza, y el algoritmo dibuja cada pieza como anillos separados. Cuando falta la información de la 'pieza', solo dibuja todo el lote de una vez. Esto se revela cuando hay islas reales o pequeños errores de digitalización.

Creo que la barra tiene una fila por anillo, pero supongo que la fusión ha producido una fila por división electoral. Fusiona a nivel de archivo de forma, luego fortifícalo.

Hombre espacial
fuente
Gracias por las sugerencias, muy útil. El único problema es que soy un novato completo en cuanto a los archivos de forma. ¿Me puede sugerir cómo debería fusionarme en el nivel del archivo shape?
SlowLearner
3
Cuando lees en el archivo de forma a una cosa llamada shapeen tu Q anterior, puedes tratar eso shapecomo un marco de datos (principalmente). Agregue la columna a ese marco de datos. No estoy seguro de si la fusión funcionará, solo consígala en el orden correcto y agréguela como nuevas columnas ( cbind?). Luego fortifica y trama. De hecho, puede usar spplot(shape,"foo")y no necesita ggplot entonces.
Spacedman
Gracias, merge () definitivamente está arruinando algo en la columna de la pieza. Hice una fusión 'manual' y los polígonos estaban bien. Así que pensaré cómo abordar esto, tal vez como dices agregando datos al shapefile.
SlowLearner
3

dplyr's left_join mantiene todas las filas de la izquierda (a) y se une a B, añadiendo todas las columnas de b. De esta forma, no se cambia ninguna información del marco de datos que contiene la información sobre los polígonos. Eso podría resolver este problema.

El comando sería:

library(dplyr)
foo <- left_join(mydf, bar)
Mario Becerra
fuente
En vez de eso, edita tu publicación anterior y luego publícala doble Piensa en eliminar una de esas publicaciones.
con
Podría hacer que esta sea una mejor respuesta explicando cuál cree que es el problema (en resumen) y por qué su solución podría resolver ese problema. ¿Está de acuerdo con el motivo publicado como un comentario, por ejemplo? Si es así, debe decirlo y hacer referencia a él.
nmtoken
-2

Ejecutar foo <-foo [order (foo $ order),] justo después de la fusión funcionó para mí ... Merge puede estropear el pedido.

durt
fuente