R fortifier provoquant la déchirure des polygones

10

J'ai du mal à tracer mes données spatiales à l'aide de ggplot2. La carte semble bien lorsqu'elle est tracée à l'aide de spplot, donc je suppose que la déchirure se produit au stade de fortification.

Le code est comme suit:

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

L'agrégat a fonctionné, comme le montre le spplot (note: j'ai trouvé comment agréger par les régions de ce post SE: joindre les polygones spatiaux par code en R )

#plot the resulting polygons using spplot
spplot(region_polygons)

entrez la description de l'image ici

Mais quand je fortifie les données spatiales pour pouvoir utiliser ggplot, il y a des déchirures sur les bords.

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

entrez la description de l'image ici

Comment puis-je arrêter cette déchirure?

J'ai examiné des réponses similaires sur SE, mais les réponses suggèrent que le déchirement se produit lors d'une fusion ( quelle est la cause du `` déchirement '' des polygones (artefacts) à l'aide de R, ggplot et geom_polygon? ). Je pense que mon déchirement se produit au stade de la fortification, car le spplot avant la fortification semble bien.

annievic
la source
vous devez d'abord généraliser votre ensemble de données pour éliminer le problème (votre programme ne peut pas gérer autant de sommets)
Mapperz

Réponses:

15

Vous devez utiliser group=groupdans le aesmappage. Voici un exemple reproductible de votre problème:

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)

tracé fixe

rcs
la source
1
Merci @rcs c'est exactement le problème. C'est réparé maintenant.
2015
4
Brève explication: dans un ensemble de données de polygones spatiaux fortifiés, idest l'identifiant de l'entité et groupl'identifiant des anneaux individuels (îles, trous, etc.). Donc, si vous dessinez avec idcomme groupe, il dessine tous les bits de votre fonctionnalité en un seul anneau, d'où le "déchirement" en sautant entre les îles.
Spacedman
Pour la postérité, je vais laisser une autre suggestion ici car je la vois souvent ... Une raison courante pour la déchirure de polygones est les données non triées. Si la spécification de l' groupesthétique correcte ne le résout pas (ce qui ne s'applique pas à cet exemple spécifique), essayer le y <- y[order(y$order),]fera probablement. La ordercolonne est créée par la fortifyfonction pour cette même raison.
dmp