Nguyên nhân của việc 'xé' các đa giác (tạo tác) bằng R, ggplot và geom_polygon là gì?


9

Nhờ câu trả lời trong câu hỏi này, tôi đã có thể tập hợp và vẽ bản đồ phân chia bầu cử ở một phần của Vương quốc Anh, trong trường hợp này là Pembrokeshire. Khung dữ liệu kết quả là lớn và chứa dữ liệu Khảo sát bản đồ nên sẽ khó đăng ở đây, nhưng khung dữ liệu trông như thế này:

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

Tôi đã cung cấp khung dữ liệu kết quả để ggplotsử dụng mã sau đây:

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

Điều này tạo ra hình ảnh sau đây, trông đẹp và sạch sẽ. bản đồ của các khu vực bầu cử

Sau đó, tôi đã kết hợp điều này với một khung dữ liệu chứa dữ liệu dân số, trông như thế này:

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

... sử dụng mã sau đây:

foo <- merge(mydf, bar)

và vẽ kết quả như thế này:

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

Vấn đề là cốt truyện kết quả có các tạo tác như trong hình bên dưới:

bản đồ với các hiện vật

Vì vậy, tập hợp khung dữ liệu gốc từ shapefile là tốt, nhưng tệp dữ liệu được hợp nhất có 'vấn đề'.

H: Điều gì có thể là nguyên nhân của loại cổ vật này? Tôi hiểu rằng nếu không có mã và dữ liệu đầy đủ thì đây là phỏng đoán và tôi xin lỗi trước vì điều này nhưng đối tượng rất lớn và cũng có thể có vấn đề phân phối lại. Bất kỳ gợi ý, gợi ý, gợi ý về nơi bắt đầu tìm kiếm sẽ được đánh giá cao.


Các vấn đề như thế này thường xuất phát từ các lỗi hình học, mặc dù thật lạ khi chúng xuất hiện sau khi hợp nhất các khung dữ liệu. Hãy thử kiểm tra các lỗi trong QGIS hoặc GRASS (cũng có thể dọn sạch các lỗi cho bạn).
Simbamangu

Câu trả lời:


7

Tôi đã muộn màng nhận ra rằng sortmột phần của mergecuộc gọi là để đổ lỗi. Nếu tôi sử dụng:

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

Các đa giác vẽ chính xác, ít nhất là trong trường hợp cụ thể này. Cảm ơn tất cả mọi người cho đầu vào của họ.


6

So sánh các cột dài, lat, mảnh và lỗ của foo với các cột của thanh. Việc hợp nhất bằng cách nào đó đã mất thông tin đó.

Lý do cho sự lộn xộn thường là các đa giác được tạo ra từ nhiều hơn một mảnh và thuật toán vẽ mỗi mảnh là các vòng riêng biệt. Khi thiếu thông tin 'mảnh', nó chỉ rút ra toàn bộ trong một lần. Điều này cho thấy chính nó khi có đảo thực sự hoặc lỗi số hóa nhỏ.

Tôi nghĩ rằng thanh có một hàng trên mỗi vòng, nhưng tôi đoán việc hợp nhất đã tạo ra một hàng cho mỗi bộ phận bầu cử. Thực hiện hợp nhất ở cấp độ shapefile, sau đó củng cố nó.


Cảm ơn những lời đề nghị, rất hữu ích. Vấn đề duy nhất là tôi là một người mới hoàn toàn liên quan đến shapefiles. Bạn có thể đề nghị làm thế nào tôi nên hợp nhất ở cấp độ shapefile?
SlowLearner

3
Khi bạn đọc trong shapefile cho một thứ được gọi shapelại trong Q trước của bạn, bạn có thể coi đó shapelà khung dữ liệu (chủ yếu). Thêm cột vào khung dữ liệu đó. Tôi không chắc chắn nếu hợp nhất sẽ hoạt động, chỉ cần lấy nó theo đúng thứ tự và thêm nó dưới dạng cột mới ( cbind?). Sau đó củng cố và âm mưu. Trong thực tế, bạn chỉ có thể sử dụng spplot(shape,"foo")và sau đó bạn không cần ggplot.
Spainedman

Cảm ơn, merge () chắc chắn đang làm rối tung một cái gì đó trong cột mảnh. Tôi đã thực hiện hợp nhất 'thủ công' và đa giác đều ổn. Vì vậy, tôi sẽ có một suy nghĩ về cách giải quyết vấn đề này, có lẽ như bạn nói khi thêm dữ liệu vào shapefile.
SlowLearner

3

dplyr's left_join giữ tất cả các hàng bên trái (a) và tham gia b, thêm tất cả các cột từ b. Bằng cách này, không có thông tin nào từ khung dữ liệu chứa thông tin về đa giác được thay đổi. Điều đó có thể giải quyết vấn đề này.

Lệnh sẽ là:

library(dplyr)
foo <- left_join(mydf, bar)

Thay vì chỉnh sửa bài viết cũ của bạn sau đó đăng nó gấp đôi. Hãy suy nghĩ về việc xóa một trong những bài viết đó.
wittich

Bạn có thể làm cho câu trả lời này tốt hơn bằng cách giải thích những gì bạn nghĩ vấn đề là (tóm tắt), và tại sao giải pháp của bạn có thể giải quyết vấn đề đó. Bạn có đồng ý với lý do được đăng dưới dạng một bình luận chẳng hạn? Nếu vậy bạn nên nói như vậy và làm một tài liệu tham khảo cho nó.
nmtoken

-2

Chạy foo <-foo [order (foo $ order),] ngay sau khi hợp nhất làm việc cho tôi ... Hợp nhất có thể làm rối trật tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.