2015-04-23 11 views
6

Ich habe Clipping-Probleme, wenn ich versuche, ggmap mit Shape-Dateien zu kombinieren. Das Beispiel in Kahle und Wickham (2013: 158) funktioniert gut, weil das Rasterbild von ggmap die gesamte Formdatei abdeckt. Im Folgenden sehen Sie ein Beispiel dafür, was passiert, wenn ich die Formdatei für US-Bundesstaaten auf einem ggmap-Diagramm plotten möchte, das einen kleineren Bereich abdeckt. Die ggmap zeigt New York City und ich möchte es mit den Grenzen für US-Staaten überlagern (nur als Beispiel). Die resultierende Karte macht keinen Sinn. Das Problem ist, dass die Formdatei geclippt wird und ggplot die nicht geclippten Punkte verbindet. Unten ist der Code. Die Formdatei ist von here. Ich zeige nur die letzte Handlung hier.Plotten Shape-Dateien mit ggmap: Clipping, wenn Shape-Datei größer als ggmap ist

Wie kann ich dieses Problem lösen?

path <- "PATH TO SHAPEFILE" 
library("ggmap") 
library("rgdal") 

# shapefile 
states <- readOGR(dsn = path, layer = "states") 
states_df <- fortify(states) 
# plot shapefile 
plot(states, lwd = 0.1) 
ggplot(states_df, aes(long, lat, group = group)) + 
    geom_polygon(colour = "black", fill = NA, size = 0.1) 


# combine ggmap with shapefile 
map <- get_map("new york city", zoom = 10, source = "stamen") 
ggmap(map, extent = "device") 

ggmap(map, extent = "device") + 
    geom_polygon(aes(long, lat, group=group), data = states_df, colour = "red", fill = NA, size = 1) 

Kahle, David und Hadley Wickham. 2013. "Ggmap: Räumliche Visualisierung mit ggplot2." The R Journal 5 (1): 144-61.

enter image description here

+0

Ist auf diese Frage hier verwandtes Problem: http://stackoverflow.com/questions/13469566/polygons-nicely-cropping-ggplot2-ggmap-at-different-zoom-levels? – user1965813

Antwort

3

Hier ist mein Versuch. Ich verwende oft GADM Shapefiles, die Sie direkt mit dem raster Paket importieren können. Ich unterteilte die Shape-Datei für NY, NJ und CT. Möglicherweise müssen Sie dies am Ende nicht tun, aber es ist wahrscheinlich besser, die Datenmenge zu reduzieren. Wenn ich die Karte zeichnete, entfernte ggplot automatisch Datenpunkte, die außerhalb der bbox des ggmap-Bildes bleiben. Daher musste ich keine zusätzlichen Arbeiten machen. Ich bin mir nicht sicher, welches Shapefile du benutzt hast. Aber die Daten von GADM scheinen mit ggmap-Bildern gut zu funktionieren. Hoffe das hilft dir.

library(raster) 
library(rgdal) 
library(rgeos) 
library(ggplot2) 

### Get data (shapefile) 
us <- getData("GADM", country = "US", level = 1) 

### Select NY and NJ 
states <- subset(us, NAME_1 %in% c("New York", "New Jersey", "Connecticut")) 

### SPDF to DF 
map <- fortify(states) 

## Get a map 
mymap <- get_map("new york city", zoom = 10, source = "stamen") 


ggmap(mymap) + 
geom_map(data = map, map = map, aes(x = long, y = lat, map_id = id, group = group)) 

enter image description here

Wenn Sie gerade Linien wollen, wird die folgende wäre, was Sie nach.

enter image description here

+0

Schöne Ergebnisse, das einzige Problem, das Sie bei der Verwendung von geom_path für Polygone haben, ist, dass wenn die Anzahl der Eckpunkte in der Formdatei nicht hoch genug ist, es in der Nähe der Kanten der Karte abgeschnitten wird. –

+0

Löst dies das Trunkierungsproblem 'ggmap (mymap) + geom_map (Daten = Karte, Karte = Karte, AES (x = lang, y = lat, Karten_ID = ID, Gruppe = Gruppe), Farbe =" schwarz ", fill = NA, Größe = 0,5) '?Ich sehe das Problem am oberen mittleren Ende der Grenze, aber es scheint nicht so zu sein mit 'geom_map' und' fill = NA'. – user2503795

+0

@ user2503795 Es scheint, dass Ihr Code gut funktioniert. Ich freue mich für dich. :) – jazzurro

2

Ich würde diese Antwort überprüfen, so scheint es, dass ggmap wie Sie behandeln erwartet das Polygon nicht in idealer Weise, wenn Sie die Ansicht vergrößern, nämlich Artikel nicht auf dem Grundstück abgeschnitten erhalten verursacht ‚interessant‘ Ergebnisse in Bezug auf die Formdateien.

Polygons nicely cropping ggplot2/ggmap at different zoom levels

# transform for good measure 
states <- spTransform(states,CRS("+datum=WGS84 +proj=longlat")) 

# combine ggmap with shapefile 
states_df <- fortify(states) 

# get your map 
map <-get_map("new york city", zoom = 10, source = "stamen") 

a <- ggmap(map, # this is where we get our raster 
     base_layer=ggplot(aes(x=long, y=lat), data=states_df), # this defines the region where things are plotted 
     extent = "normal", # this won't work with device, you need normal (see examples in ggmap documentation) 
     maprange=FALSE 
     ) + 
coord_map(# use map's bounding box to setup the 'viewport' we want to see 
    projection="mercator", 
    xlim= c(attr(map, "bb")$ll.lon, attr(map, "bb")$ur.lon), 
    ylim=c(attr(map, "bb")$ll.lat, attr(map, "bb")$ur.lat) 
) + 
geom_polygon(# plot the polygon 
    aes(x=long, y=lat,group=group), data =states_df, color = "red", fill=NA, size = 1) 

print(a) 

Mit Ausgabe: enter image description here

Als Seite beachten Sie die US Census Daten für staatliche Karten verwenden überprüfen möchten, scheinen sie von höherer Qualität zu sein als die ESRI Datensatz.

ftp://ftp2.census.gov/geo/pvs/tiger2010st/tl_2010_us_state10.zip

Als abschließende Bemerkung, gibt es Probleme mit ggmap in der Nähe der Pole, so würde ich auch Ihre Daten durch die Zustände der Teilmenge sind Sie interessiert.

Verwandte Themen