Was ist die Ursache für das "Zerreißen" von Polygonen (Artefakten) mit R, ggplot und geom_polygon?

9

Dank der Antwort in dieser Frage konnte ich eine Karte der Wahlabteilungen in einem Teil des Vereinigten Königreichs, in diesem Fall in Pembrokeshire, unterteilen und zeichnen. Der resultierende Datenrahmen ist groß und enthält Ordnance Survey-Daten, sodass es schwierig wäre, hier zu posten, aber der Datenrahmen sieht folgendermaßen aus:

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

Ich habe den resultierenden Datenrahmen ggplotmit dem folgenden Code gespeist :

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

Dies erzeugt das folgende Bild, das schön und sauber aussieht. Karte der Wahlabteilungen

Dann habe ich dies mit einem Datenrahmen kombiniert, der Bevölkerungsdaten enthält, die folgendermaßen aussehen:

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

... mit folgendem Code:

foo <- merge(mydf, bar)

und zeichnete das Ergebnis folgendermaßen auf:

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

Das Problem ist, dass das resultierende Diagramm Artefakte aufweist, wie im folgenden Bild gezeigt:

Karte mit Artefakten

Die ursprüngliche Datenrahmen-Teilmenge aus dem Shapefile ist also in Ordnung, aber die zusammengeführte Datendatei weist Probleme auf.

Frage: Was könnte die Ursache für diese Art von Artefakt sein? Ich verstehe, dass dies ohne den vollständigen Code und die Daten eine Vermutung ist, und ich entschuldige mich im Voraus dafür, aber das Objekt ist sehr groß und es kann auch zu Umverteilungsproblemen kommen. Alle Hinweise, Hinweise und Vorschläge, wo Sie anfangen sollen, sind willkommen.

Langsamer Lerner
quelle
Solche Renderprobleme entstehen häufig durch Geometriefehler, obwohl es seltsam ist, dass sie nach dem Zusammenführen der Datenrahmen auftreten. Versuchen Sie, die Fehler in QGIS oder GRASS zu überprüfen (was auch Fehler für Sie bereinigen kann).
Simbamangu

Antworten:

7

Ich habe verspätet erkannt, dass der sortTeil des mergeAnrufs schuld ist. Wenn ich benutze:

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

Die Polygone werden zumindest in diesem speziellen Fall korrekt dargestellt. Vielen Dank an alle für ihre Beiträge.

Langsamer Lerner
quelle
6

Vergleichen Sie die Lang-, Lat-, Stück- und Lochsäulen von foo mit denen von bar. Die Zusammenführung hat diese Informationen irgendwie verloren.

Der Grund für das Durcheinander ist normalerweise, dass die Polygone aus mehr als einem Stück bestehen und der Algorithmus jedes Stück als separate Ringe zeichnet. Wenn die 'Stück'-Information fehlt, wird nur das ganze Los auf einmal gezogen. Dies zeigt sich, wenn entweder echte Inseln oder winzige Digitalisierungsfehler vorliegen.

Ich denke, Bar hat eine Reihe pro Ring, aber ich denke, die Fusion hat eine Reihe pro Wahlabteilung hervorgebracht. Führen Sie die Zusammenführung auf Shapefile-Ebene durch und verstärken Sie sie dann.

Spacedman
quelle
Danke für die Vorschläge, sehr hilfreich. Das einzige Problem ist, dass ich ein absoluter Neuling in Bezug auf Shapefiles bin. Können Sie vorschlagen, wie ich auf Shapefile-Ebene zusammenführen soll?
SlowLearner
3
Wenn Sie das Shapefile in eine Sache einlesen, die shapein Ihrem vorherigen Q zurückgerufen wurde, können Sie dies shape(meistens) als Datenrahmen behandeln . Fügen Sie die Spalte diesem Datenrahmen hinzu. Ich bin nicht sicher, ob das Zusammenführen funktioniert. Holen Sie es einfach in der richtigen Reihenfolge und fügen Sie es als neue Spalten hinzu ( cbind?). Dann befestigen und planen. In der Tat können Sie nur verwenden spplot(shape,"foo")und Sie brauchen dann kein ggplot.
Spacedman
Danke, merge () bringt definitiv etwas in der Stückspalte durcheinander. Ich habe eine manuelle Zusammenführung durchgeführt und die Polygone waren in Ordnung. Ich werde also darüber nachdenken, wie ich das angehen kann, vielleicht wie Sie sagen, indem Sie dem Shapefile Daten hinzufügen.
SlowLearner
3

dplyr's left_join behält alle Zeilen auf der linken Seite (a) bei und verbindet b, wobei alle Spalten von b hinzugefügt werden. Auf diese Weise wird keine der Informationen aus dem Datenrahmen, die die Informationen zu den Polygonen enthalten, geändert. Das könnte dieses Problem lösen.

Der Befehl wäre:

library(dplyr)
foo <- left_join(mydf, bar)
Mario Becerra
quelle
Bearbeiten Sie lieber Ihren alten Beitrag und veröffentlichen Sie ihn dann doppelt. Denken Sie an das Löschen eines dieser Beiträge.
3.
Sie könnten dies zu einer besseren Antwort machen, indem Sie erklären, was Ihrer Meinung nach das Problem ist (zusammenfassend) und warum Ihre Lösung dieses Problem lösen könnte. Stimmen Sie dem Grund zu, der beispielsweise als Kommentar angegeben wurde? Wenn ja, sollten Sie dies sagen und darauf verweisen.
nmtoken
-2

Das Ausführen von foo <-foo [order (foo $ order)] direkt nach dem Zusammenführen hat bei mir funktioniert ... Zusammenführen kann die Bestellung durcheinander bringen.

verletzt
quelle