2015-04-23 16 views
6

Ho problemi di clipping quando tento di combinare ggmap con i file di forma. L'esempio in Kahle e Wickham (2013: 158) funziona bene perché l'immagine raster di ggmap copre l'intero file di forma. Di seguito è riportato un esempio di cosa succede quando provo a tracciare il file di forma per gli stati degli Stati Uniti su un grafico ggmap che copre un'area più piccola. La ggmap mostra New York City e voglio sovrascriverlo con i confini per gli stati degli Stati Uniti (solo a titolo di esempio). La mappa risultante non ha alcun senso. Il problema è che il file di forma viene troncato e ggplot collega i punti non tagliati. Di seguito è riportato il codice. Il file di forma è da here. Sto solo mostrando l'ultima trama qui.Plotaggio di file di forma con ggmap: ritaglio quando il file di forma è maggiore di ggmap

Come posso risolvere questo problema?

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 e Hadley Wickham. 2013. "Ggmap: Visualizzazione spaziale con ggplot2." The R Journal 5 (1): 144-61.

enter image description here

+0

è il problema correlato a questa domanda qui: http://stackoverflow.com/questions/13469566/polygons-nicely-cropping-ggplot2-ggmap-at-different-zoom-levels? – user1965813

risposta

3

Qui è il mio tentativo. Uso spesso i file di forma GADM, che puoi importare direttamente utilizzando il pacchetto raster. Ho sostituito il file di forma per NY, NJ e CT. Potresti non doverlo fare alla fine, ma probabilmente è meglio ridurre la quantità di dati. Quando ho disegnato la mappa, ggplot ha rimosso automaticamente i punti dati che rimangono fuori dal bbox dell'immagine ggmap. Pertanto, non ho dovuto fare alcun lavoro aggiuntivo. Non sono sicuro di quale shapefile hai usato. Ma i dati di GADM sembrano funzionare bene con le immagini ggmap. Spero che questo ti aiuti.

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

Se si desidera solo le linee, il seguente sarebbe quello che cercate.

enter image description here

+0

Risultati interessanti, l'unico problema che si incontrerà usando geom_path per i poligoni, è che se il numero di vertici nel file di forma non è sufficientemente alto, allora ci sarà un troncamento vicino ai bordi della mappa. –

+0

Questo risolve il problema di troncamento 'ggmap (mymap) + geom_map (data = mappa, mappa = mappa, aes (x = lungo, y = lat, map_id = id, gruppo = gruppo), color =" black ", fill = NA, dimensione = 0,5) '?Vedo il problema nella parte superiore centrale della linea di confine, ma non sembra essere il caso di 'geom_map' e' fill = NA'. – user2503795

+0

@ user2503795 Sembra che il tuo codice funzioni bene. Sono felice per te. :) – jazzurro

2

avrei controllare questa risposta, sembra che ggmap come vi aspettavate non gestisce poligono di in un modo ideale quando si ingrandisce, vale a dire gli elementi non sulla trama ottenere troncato causando risultati 'interessanti' rispetto ai file di forma.

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) 

Con uscita: enter image description here

Come un lato nota si potrebbe voler controllare utilizzando i dati del censimento degli Stati Uniti per le mappe di stato, sembrano essere di qualità superiore alla ESRI set di dati.

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

Come nota finale, ci sono problemi con ggmap vicino ai poli così vorrei anche sottoinsieme dei dati da parte degli Stati che ti interessa.

Problemi correlati