9 votos

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

Gracias a la respuesta dada en esta pregunta he sido capaz de subconjunto y dibujar un mapa electoral divisiones en parte del reino unido, en este caso de Pembrokeshire. La resultante de la trama de datos es grande y contiene Ordnance Survey datos, por lo que sería difícil para publicar aquí, pero la trama de datos se parece a esto:

> 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" ...

Me alimenta el resultado del marco de datos a ggplot usar 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 tiene un aspecto agradable y limpio. map of electoral divisions

Luego he combinado esto con una estructura de datos que contiene los datos de población, que tiene este aspecto:

> 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 ...

...con el siguiente código:

foo <- merge(mydf, bar)

y se representa el resultado como este:

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

El problema es que la gráfica resultante tiene artefactos, como se muestra en la siguiente imagen:

map with artifacts

Así, la estructura de datos original subconjunto de la shapefile está bien, pero la fusión de archivo de datos tiene 'problemas'.

P. ¿Cuál podría ser la causa de este tipo de artefacto? Entiendo que sin el código completo de datos y esta es de las conjeturas y me disculpo de antemano por esto, pero el objeto es muy grande y puede haber también problemas en la redistribución. Cualquier sugerencias, consejos, sugerencias en cuanto a por dónde empezar a buscar, se agradecería.

7voto

strider24 Puntos 725

Me he dado cuenta tardíamente de que la parte sort llamada merge tiene la culpa. Si uso:

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

Los polígonos trazan correctamente, al menos en este caso particular. Gracias a todos por sus aportaciones.

6voto

Jay Bazuzi Puntos 194

Comparar el tiempo, lat, pieza, y el agujero columnas de foo con los de la barra. La mezcla ha perdido de alguna manera esa información.

El motivo por el lío es que por lo general los polígonos están hechos de más de una pieza, y el algoritmo atrae a cada pieza por separado como anillos. Cuando la pieza ' info que falta sólo llama la totalidad del lote. Esto se manifiesta cuando hay un real islas o pequeños, la digitalización de los errores.

Creo que la barra tiene una fila por cada anillo, pero supongo que la combinación ha producido una fila por cada división de asistencia electoral. Hacer la mezcla en el shapefile de nivel, entonces fortificar.

3voto

Dplyr left_join mantiene todas las filas a la izquierda (a) y une b, agregando todas las columnas de b. De esta manera, no se cambia ninguna de la 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)
 

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X