Apa penyebab 'robeknya' poligon (artefak) menggunakan R, ggplot, dan geom_polygon?

9

Berkat jawaban yang diberikan dalam pertanyaan ini saya telah dapat menyusun dan menggambar peta divisi pemilihan di bagian Inggris, dalam hal ini Pembrokeshire. Frame data yang dihasilkan besar dan berisi data Ordnance Survey sehingga akan sulit untuk memposting di sini, tetapi frame data terlihat seperti ini:

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

Saya mengumpankan bingkai data yang dihasilkan untuk ggplotmenggunakan kode berikut:

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

Ini menghasilkan gambar berikut, yang terlihat bagus dan bersih. peta divisi pemilihan

Lalu saya menggabungkan ini dengan bingkai data yang berisi data populasi, yang terlihat seperti ini:

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

... menggunakan kode berikut:

foo <- merge(mydf, bar)

dan merencanakan hasilnya seperti ini:

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

Masalahnya adalah plot yang dihasilkan memiliki artefak seperti yang ditunjukkan pada gambar di bawah:

peta dengan artefak

Jadi, bingkai subset data asli dari shapefile baik-baik saja, tetapi file data yang digabungkan memiliki 'masalah'.

Q. Apa yang mungkin menjadi penyebab artefak semacam ini? Saya mengerti bahwa tanpa kode dan data lengkap ini hanya dugaan dan saya minta maaf sebelumnya untuk ini tetapi objeknya sangat besar dan mungkin juga ada masalah redistribusi. Setiap petunjuk, petunjuk, saran tentang mulai mencari di mana akan dihargai.

SlowLearner
sumber
Masalah rendering seperti ini sering kali berasal dari kesalahan geometri, meskipun aneh bahwa mereka muncul setelah menggabungkan frame data. Coba periksa kesalahan dalam QGIS, atau GRASS (yang juga dapat membersihkan kesalahan untuk Anda).
Simbamangu

Jawaban:

7

Saya terlambat menyadari bahwa sortbagian dari mergepanggilan itu adalah yang harus disalahkan. Jika saya menggunakan:

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

Poligon memplot dengan benar, setidaknya dalam kasus khusus ini. Terima kasih untuk semua orang atas masukan mereka.

SlowLearner
sumber
6

Bandingkan kolom panjang, lat, potongan, dan lubang foo dengan kolom bar. Penggabungan entah bagaimana kehilangan informasi itu.

Alasan kekacauan biasanya adalah bahwa poligon dibuat dari lebih dari satu bagian, dan algoritme menarik setiap bagian sebagai cincin terpisah. Ketika info 'bagian' hilang, itu hanya menarik seluruh lot sekaligus. Ini mengungkapkan sendiri ketika ada pulau nyata atau kesalahan digitalisasi kecil.

Saya pikir bar memiliki satu baris per cincin, tetapi saya kira penggabungan telah menghasilkan satu baris per divisi pemilihan. Lakukan penggabungan pada tingkat shapefile, lalu perbentengkan.

Spacedman
sumber
Terima kasih atas sarannya, sangat membantu. Satu-satunya masalah adalah bahwa saya seorang pemula yang lengkap dalam hal shapefile. Bisakah Anda menyarankan bagaimana saya harus bergabung di tingkat shapefile?
SlowLearner
3
Ketika Anda membaca di shapefile ke hal yang disebut shapekembali di Q Anda sebelumnya, Anda bisa memperlakukannya shapesebagai kerangka data (kebanyakan). Tambahkan kolom ke bingkai data itu. Saya tidak yakin apakah penggabungan akan berfungsi, dapatkan saja dalam urutan yang benar dan tambahkan sebagai kolom baru ( cbind?). Kemudian perbenteng dan plot. Bahkan Anda bisa menggunakannya spplot(shape,"foo")dan Anda tidak perlu ggplot.
Spacedman
Terima kasih, merge () pasti mengacaukan sesuatu di kolom bagian. Saya melakukan penggabungan 'manual' dan poligon baik-baik saja. Jadi saya akan memikirkan bagaimana cara mengatasi ini, mungkin seperti yang Anda katakan menambahkan data ke shapefile.
SlowLearner
3

dplyr's left_join membuat semua baris di sebelah kiri (a) dan bergabung dengan b, menambahkan semua kolom dari b. Dengan cara ini, tidak ada informasi dari bingkai data yang berisi informasi tentang poligon diubah. Itu bisa menyelesaikan masalah ini.

Perintahnya adalah:

library(dplyr)
foo <- left_join(mydf, bar)
Mario Becerra
sumber
Alih-alih mengedit posting lama Anda, kemudian posting itu dua kali lipat. Pikirkan tentang menghapus salah satu posting itu.
wittich 15
Anda bisa menjadikan ini jawaban yang lebih baik dengan menjelaskan apa yang menurut Anda masalahnya (secara ringkas), dan mengapa solusi Anda bisa menyelesaikan masalah itu. Apakah Anda setuju dengan alasan yang diposting sebagai komentar misalnya? Jika demikian, Anda harus mengatakannya dan membuat referensi untuk itu.
nmtoken
-2

Menjalankan foo <-foo [order (foo $ order),] tepat setelah penggabungan berhasil bagi saya ... Penggabungan dapat mengacaukan pemesanan.

sakit
sumber