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 ggplot
usando 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.
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:
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.
Respostas:
Percebi tardiamente que a
sort
parte damerge
ligação é a culpa. Se eu usar:Os polígonos são plotados corretamente, pelo menos nesse caso específico. Obrigado a todos por sua contribuição.
fonte
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.
fonte
shape
volta no seu Q anterior, você pode tratá-loshape
como 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 usarspplot(shape,"foo")
e não precisa do ggplot.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:
fonte
Executar foo <-foo [order (foo $ order)], logo após a fusão funcionou para mim ... A mesclagem pode atrapalhar a ordem.
fonte