R verstärken, wodurch Polygone reißen

10

Ich habe Probleme beim Zeichnen meiner Geodaten mit ggplot2. Die Karte sieht gut aus, wenn sie mit spplot geplottet wird. Ich gehe also davon aus, dass das Zerreißen in der Befestigungsphase erfolgt.

Der Code lautet wie folgt:

#install the packages
library(rgdal)
library(mapproj)
library(raster)
library(rgeos)
library(ggplot2)
library(plyr)

if (!require(gpclib)) install.packages("gpclib", type="source")
gpclibPermit()

setwd("C:/Users/My Documents")

#read in laa to regional mapping
#must aggregate to higher level regions as data is provided at this higher level
laa_region_mapping <- read.csv("laa_region.csv", header = TRUE)

#read in LAA polygons
laa_polygons <- readOGR("ctyua_ew_generalised_WGS84.json", "OGRGeoJSON")

#merge by laa to add region column to polygon data
laa_polygons_with_region_data <- merge(laa_polygons, laa_region_mapping,
                                by.x = "CTYUA13NM", by.y = "LAA",
                                all.x = TRUE, all.y = TRUE)

# aggregate laa polygons by the 21 regions (aggregate by regoin_code)
region_polygons <- raster::aggregate(laa_polygons_with_region_data, "region_code")

Das Aggregat hat funktioniert, wie aus dem spplot hervorgeht (Hinweis: Ich habe in diesem SE-Beitrag herausgefunden, wie die Aggregate nach Regionen sortiert werden: Verbinden Sie räumliche Polygone durch Code in R ).

#plot the resulting polygons using spplot
spplot(region_polygons)

Geben Sie hier die Bildbeschreibung ein

Aber wenn ich die räumlichen Daten so verstärke, dass ich ggplot verwenden kann, reißt es an den Rändern.

#fortify and merge to create the data frame ggplot will show on the map
region_polygons@data$id <- rownames(region_polygons@data)
region_polygons.points <- fortify(region_polygons, region = "id")

# plot the fortified df using ggplot
ggplot(data = region_polygons.points, aes(x= long, y = lat, group = id, fill=id)) + geom_polygon()

Geben Sie hier die Bildbeschreibung ein

Wie kann ich dieses Zerreißen stoppen?

Ich habe mir ähnliche Antworten auf SE angesehen, aber die Antworten deuten darauf hin, dass während einer Zusammenführung ein Zerreißen auftritt ( Was ist die Ursache für das "Zerreißen" von Polygonen (Artefakten) mit R, ggplot und geom_polygon? ). Ich denke, mein Zerreißen tritt im Stadium der Befestigung auf, da der Spplot vor der Befestigung gut aussieht.

annievic
quelle
Sie müssen zuerst Ihren Datensatz verallgemeinern, um das Problem zu
beheben

Antworten:

15

Sie sollten group=groupin der aesZuordnung verwenden. Hier ist ein reproduzierbares Beispiel für Ihr Problem:

library("ggplot2")
library("raster")

x <- getData('GADM', country='GBR', level=2)
y <- fortify(x, region="NAME_2")
head(y)
#     long   lat order  hole piece      group       id
# 1 -2.049 57.23     1 FALSE     1 Aberdeen.1 Aberdeen
# 2 -2.049 57.23     2 FALSE     1 Aberdeen.1 Aberdeen
# 3 -2.049 57.23     3 FALSE     1 Aberdeen.1 Aberdeen
# 4 -2.050 57.23     4 FALSE     1 Aberdeen.1 Aberdeen
# 5 -2.050 57.23     5 FALSE     1 Aberdeen.1 Aberdeen
# 6 -2.050 57.23     6 FALSE     1 Aberdeen.1 Aberdeen


# wrong group aesthetic
ggplot(data=y, aes(y=lat, x=long, group=id, fill=id)) +
  geom_polygon() + 
  guides(fill=FALSE)

wronge aes-group

# fixed plot
ggplot(data=y, aes(y=lat, x=long, group=group, fill=id)) +
  geom_polygon() +
  guides(fill=FALSE)

feste Handlung

rcs
quelle
1
Danke @rcs das ist genau das Problem. Es ist jetzt behoben.
Annievic
4
Kurze Erklärung: In einem befestigten räumlichen Polygondatensatz idist dies die Merkmals-ID und groupdie ID einzelner Ringe (Inseln, Löcher usw.). Wenn Sie also mit idals Gruppe zeichnen, werden alle Teile Ihres Features als ein Ring gezeichnet, daher das "Zerreißen", wenn es zwischen Inseln springt.
Spacedman
Für die Nachwelt werde ich hier einen weiteren Vorschlag hinterlassen, da ich ihn oft sehe ... Ein häufiger Grund für das Zerreißen von Polygonen sind unsortierte Daten. Wenn die Angabe der richtigen groupÄsthetik dies nicht löst (was für dieses spezielle Beispiel nicht gilt), wird dies y <- y[order(y$order),]wahrscheinlich versucht . Die orderSpalte wird fortifyaus diesem Grund von der Funktion erstellt .
dmp