2016-08-09 104 views
8

ich ein Grundstück von einer Fläche, wie Lateinamerika will, die Datei von IPUMSI Welt Form mit ...Vermeiden hoizontal Linien und Formen verrückt, wenn Karten in Plotten ggplot2

https://international.ipums.org/international/resources/gis/IPUMSI_world.zip

... I einige weitere IPUMS Bezirke später hinzufügen, so will ich wirklich diese Schicht als meine Vorlage verwenden.

ich Schwierigkeiten mit der Handlung, wenn ich Grenzen durch coord_map in ggplot2 hinzuzufügen.

Die anfängliche räumliche Datei sieht in Ordnung

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

sd0 <- readShapePoly("./IPUMSI_world.shp") 
df0 <- fortify(sd0) 

ggplot(data = df0, mapping = aes(x = long, y = lat, group = group)) + 
    geom_polygon(fill = "black", colour = "black") 

enter image description here

Wenn ich auf Lateinamerika konzentrieren möchte ich einige unerwünschte horizontale Linien erhalten:

ggplot(data = df0, mapping = aes(x = long, y = lat, group = group)) + 
    geom_polygon(fill = "black", colour = "black") + 
    coord_map(xlim = c(-125, -30), ylim = c(-60, 35)) 

enter image description here

I versuchte dies mit derzu behebenFunktion, im Anschluss an die Führung here

library("PBSmapping") 
df1 <- df0 
names(df1)[c(1,2,6,3)] <- c("X","Y","PID","POS") 
df1$PID <- as.numeric(df1$PID) 
df2 <- clipPolys(polys = df1, xlim = c(-125, -30), ylim = c(-60, 35), keepExtra = TRUE) 
names(df2)[names(df2)=="X"] <- "long" 
names(df2)[names(df2)=="Y"] <- "lat" 
names(df2)[names(df2)=="PID"] <- "id" 

ggplot(data = df2, mapping = aes(x = long, y = lat, group = group)) + 
    geom_polygon(fill = "black", colour = "black") 

enter image description here

Nicht wirklich super zufrieden mit diesem Grundstück auch nicht. Ich dachte, es ist ein Problem mit Löchern war, wie in diesem question, aber die vorgeschlagene Lösung erzeugt die gleichen Plots wie oben:

gghole <- function(fort){ 
    poly <- fort[fort$id %in% fort[fort$hole,]$id,] 
    hole <- fort[!fort$id %in% fort[fort$hole,]$id,] 
    out <- list(poly,hole) 
    names(out) <- c('poly','hole') 
    return(out) 
} 

ggplot(df2, aes(x=long, y=lat, group=group)) + 
    geom_polygon(data = gghole(df2)[[1]], fill = "black", colour = "black") + 
    geom_polygon(data = gghole(df2)[[2]], fill = "black", colour = "black") 

ggplot(df0, aes(x=long, y=lat, group=group)) + 
    geom_polygon(data = gghole(df0)[[1]], fill = "black", colour = "black") + 
    geom_polygon(data = gghole(df0)[[2]], fill = "black", colour = "black") + 
    coord_map(xlim = c(-125, -30), ylim = c(-60, 35)) 

Antwort

8

enter image description here Die andere Lösung ist die Ansicht zu beschränken, anstatt sie entfernen Punkt aus dem Render:

library(ggplot2) 
library(maptools) 
library(mapproj) 

# Maptools dataset 
data(wrld_simpl) 
world <- fortify(wrld_simpl) 

# Same plot, but restrict the view instead of removing points 
# allowing the complete render to happen 
ggplot(world, mapping = aes(x = long, y = lat, group = group)) + 
    geom_polygon(fill = "black", colour = "black") + 
    coord_cartesian(xlim = c(-125, -30), ylim = c(-60, 35)) 
+0

Ich denke, das wird langsamer sein als Grenzen in scale_continuous Einstellung, da die gesamten Daten berechnet werden dann abgeschnitten. scale_continuous rendert nur die Daten, die Sie plotten möchten. – dww

+0

Langsamer, aber Sie werden nicht fehlen Bits von Ländern bekommen. – NJBurgo

+0

Messepunkt. Also, ich denke, es hängt von der Endnutzung ab, die bevorzugt werden würde. Die ‚fehlenden‘ Bits von Ländern sind die Teile, die Sie sagen, es zu unterlassen, indem sie die Grenzen zu setzen, die möglicherweise nicht das sein, was die Nutzer wollen. – dww

4

Sie sollten die Daten außerhalb des Plotregion löschen. So verwenden scale_x/y_continuous die Grenzen zu setzen statt coord_map

ggplot(data = df0, mapping = aes(x = long, y = lat, group = group)) + 
    scale_x_continuous(limits = c(-125, -30)) + 
    scale_y_continuous(limits = c(-60, 35)) + 
    geom_polygon(fill = "black", colour = "black") 

enter image description here