Wzmocnienie R powoduje rozerwanie wielokątów

10

Mam problem z wykreśleniem moich danych przestrzennych za pomocą ggplot2. Mapa wygląda dobrze po wykreśleniu za pomocą spplotu, więc zakładam, że łzawienie występuje na etapie wzmocnienia.

Kod jest następujący:

#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")

Agregacja zadziałała, co widać na wykresie (uwaga: znalazłem sposób agregacji według regionów z tego postu SE: Dołącz wielokąty przestrzenne za pomocą kodu w języku R )

#plot the resulting polygons using spplot
spplot(region_polygons)

wprowadź opis zdjęcia tutaj

Ale kiedy wzmacniam dane przestrzenne, aby móc użyć ggplot, wokół krawędzi pojawiają się łzy.

#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()

wprowadź opis zdjęcia tutaj

Jak mogę zatrzymać to łzawienie?

Patrzyłem na podobne odpowiedzi na SE, ale odpowiedzi sugerują, że łza występuje podczas łączenia ( jaka jest przyczyna „łzowania” wielokątów (artefaktów) przy użyciu R, ggplot i geom_polygon? ). Wydaje mi się, że moje łzawienie występuje na etapie umocnienia, ponieważ splot przed wzmocnieniem wygląda dobrze.

annievic
źródło
musisz najpierw uogólnić swój zestaw danych, aby wyeliminować problem (twój program nie może obsłużyć tylu wierzchołków)
Mapperz

Odpowiedzi:

15

Powinieneś użyć group=groupw aesmapowaniu. Oto powtarzalny przykład Twojego problemu:

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)

naprawiona fabuła

rcs
źródło
1
Dziękuję @rcs, to jest właśnie problem. Teraz jest naprawione.
annievic
4
Krótkie objaśnienie: W wzmocnionym zestawie danych wielokątów przestrzennych idjest identyfikatorem cechy i groupjest identyfikatorem poszczególnych pierścieni (wysp, dziur itp.). Jeśli więc idrysujesz z grupą, rysuje wszystkie elementy twojej cechy jako jeden pierścień, stąd „łzawienie” podczas przeskakiwania między wyspami.
Spacedman,
Dla potomnych pozostawię tutaj inną sugestię, ponieważ często ją widzę ... Częstym powodem rozrywania wielokątów są nieposortowane dane. Jeśli określenie poprawnej groupestetyki nie rozwiąże go (co nie dotyczy tego konkretnego przykładu), y <- y[order(y$order),]prawdopodobnie spróbuje . Z tego właśnie powodu funkcja orderjest tworzona przez kolumnę fortify.
dmp