Qual é a causa do 'rompimento' de polígonos (artefatos) usando R, ggplot e geom_polygon?

9

Graças à resposta dada nesta pergunta , fui capaz de agrupar e desenhar um mapa das divisões eleitorais em parte do Reino Unido, neste caso Pembrokeshire. O quadro de dados resultante é grande e contém dados do Ordnance Survey, pelo que seria difícil postar aqui, mas o quadro de dados é semelhante a este:

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

Alimentei o quadro de dados resultante ggplotusando o seguinte código:

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

Isso gera a seguinte imagem, que parece agradável e limpa. mapa das divisões eleitorais

Então eu combinei isso com um quadro de dados contendo dados da população, que se parece com isso:

> 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 o seguinte código:

foo <- merge(mydf, bar)

e plotou o resultado assim:

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

O problema é que o gráfico resultante possui artefatos, conforme mostrado na imagem abaixo:

mapa com artefatos

Portanto, o subconjunto do quadro de dados original do shapefile é bom, mas o arquivo de dados mesclado tem 'problemas'.

P. Qual pode ser a causa desse tipo de artefato? Entendo que sem o código e os dados completos, isso é uma suposição e peço desculpas antecipadamente por isso, mas o objeto é muito grande e também pode haver problemas de redistribuição. Todas as dicas, sugestões, sugestões de onde começar a procurar serão apreciadas.

Aprendiz lento
fonte
Problemas de renderização como esse geralmente vêm de erros de geometria, embora seja estranho que eles apareçam após a mesclagem dos quadros de dados. Tente verificar os erros no QGIS ou GRASS (que também pode limpar erros para você).
Simbamangu 21/10/12

Respostas:

7

Percebi tardiamente que a sortparte da mergeligação é a culpa. Se eu usar:

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

Os polígonos são plotados corretamente, pelo menos nesse caso específico. Obrigado a todos por sua contribuição.

Aprendiz lento
fonte
6

Compare as colunas longa, lat, peça e furo de foo com as de barra. A mesclagem de alguma forma perdeu essas informações.

O motivo da confusão geralmente é que os polígonos são feitos de mais de uma peça, e o algoritmo desenha cada peça como anéis separados. Quando a informação da peça está faltando, ela atrai todo o lote de uma só vez. Isso se revela quando há ilhas reais ou pequenos erros de digitalização.

Acho que a barra tem uma linha por anel, mas acho que a mesclagem produziu uma linha por divisão eleitoral. Faça a mesclagem no nível do shapefile e fortifique-o.

Spacedman
fonte
Obrigado pelas sugestões, muito útil. O único problema é que eu sou um novato completo no que diz respeito aos shapefiles. Você pode sugerir como eu devo mesclar no nível do shapefile?
SlowLearner
3
Quando você lê no shapefile uma coisa chamada de shapevolta no seu Q anterior, você pode tratá-lo shapecomo um quadro de dados (principalmente). Adicione a coluna a esse quadro de dados. Não tenho certeza se a mesclagem funcionará, basta colocá-la na ordem correta e adicioná-la como novas colunas ( cbind?). Em seguida, fortifique e plote. Na verdade, você pode simplesmente usar spplot(shape,"foo")e não precisa do ggplot.
Spacedman
Obrigado, merge () está definitivamente atrapalhando algo na coluna da peça. Fiz uma mesclagem 'manual' e os polígonos estavam bons. Então, vou pensar em como lidar com isso, talvez como você diz adicionando dados ao shapefile.
SlowLearner 22/10/12
3

dplyr's left_join mantém todas as linhas do lado esquerdo (a) e junta-se b, acrescentando todas as colunas de b. Dessa forma, nenhuma das informações do quadro de dados que contém as informações sobre os polígonos é alterada. Isso pode resolver esse problema.

O comando seria:

library(dplyr)
foo <- left_join(mydf, bar)
Mario Becerra
fonte
Em vez disso, edite sua postagem antiga e publique-a duas vezes. Pense na exclusão de uma dessas postagens.
Wittich
Você pode fazer disso uma resposta melhor explicando qual é o problema (em resumo) e por que sua solução pode resolver esse problema. Você concorda com o motivo postado como um comentário, por exemplo? Nesse caso, você deve dizê-lo e fazer uma referência a ele.
NmToken
-2

Executar foo <-foo [order (foo $ order)], logo após a fusão funcionou para mim ... A mesclagem pode atrapalhar a ordem.

durt
fonte