2012-06-07 4 views
9
library(sp) 
library(spdep) 
library(ggplot2) 
library(ggmap) 
library(rgdal) 

ottenere e violino con i dati:ggmap con geom_map sovrapposto

nc.sids <- readShapePoly(system.file("etc/shapes/sids.shp", package="spdep")[1],ID="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66")) 
nc.sids=spTransform(nc.sids,CRS("+init=epsg:4326")) 

Get mappa sfondo da stamen.com, trama, sembra piacevole:

ncmap = get_map(location=as.vector(bbox(nc.sids)),source="stamen",maptype="toner",zoom=7) 
ggmap(ncmap) 

Creare una cornice di dati con una lunga, lat, Z e trama sulla mappa e una trama vuota:

ncP = data.frame(coordinates(nc.sids),runif(nrow(nc.sids))) 
colnames(ncP)=c("long","lat","Z") 

ggmap(ncmap)+geom_point(aes(x=long,y=lat,col=Z),data=ncP) 
ggplot()+geom_point(aes(x=long,y=lat,col=Z),data=ncP) 

dargli alcuni ID unici chiamati 'id' e fortificare (con vitamine e ferro?)

[email protected][,1]=1:nrow(nc.sids) 
names(nc.sids)[1]="id" 
ncFort = fortify(nc.sids) 

Ora, la mia mappa e miei limiti, voglio tracciare il tasso di 74 nascita:

myMap = geom_map(aes(fill=BIR74,map_id=id),map=ncFort,[email protected]) 
Limits = expand_limits(x=ncFort$long,y=ncFort$lat) 

e su un terreno vuoto posso:

ggplot() + myMap + Limits 

ma su un ggmap non posso:

ggmap(ncmap) + myMap + Limits 
# Error in eval(expr, envir, enclos) : object 'lon' not found 

Alcune versioni:

> packageDescription("ggplot2")$Version 
[1] "0.9.0" 
> packageDescription("ggmap")$Version 
[1] "2.0" 

posso aggiungere geom_polygon a ggplot o ggmap e funziona come previsto. Quindi qualcosa è con geom_map ....

risposta

11

Il messaggio di errore è, credo, il risultato di un problema di successione. In genere, si verifica quando vengono utilizzati frame di dati diversi nei livelli successivi.

In ggplot2, ogni livello eredita i mapping di default aes impostati globalmente nella chiamata iniziale a ggplot. Ad esempio, ggplot(data = data, aes(x = x, y = y)) imposta i mapping x e ​​y globalmente in modo che tutti i livelli successivi si aspettino di vedere x e y in qualsiasi frame di dati sia stato loro assegnato. Se x e non sono presenti, un messaggio di errore simile a quello che hai ottenuto risultati. See here per un problema simile e una gamma di soluzioni.

Nel tuo caso, non è ovvio perché la prima chiamata è a ggmap - non è possibile visualizzare i mapping né come sono impostati perché ggmap è tutto ben confezionato. Ciononostante, ggmap chiama da qualche parte ggplot e quindi i mapping estetici predefiniti devono essere stati impostati da qualche parte nella chiamata iniziale a ggmap. Ne consegue che lo ggmap seguito da geom_map senza tenere conto dei problemi di ereditarietà genera l'errore.

Quindi, il consiglio di Kohske nel post precedente si applica - "è necessario annullare i lon aes in geom_map quando si utilizza un set di dati diverso". Senza sapere troppo su cosa è stato impostato o in che modo sono stati impostati, è probabilmente più semplice aggregare il lotto aggiungendo inherit.aes = FALSE al secondo livello: la chiamata a geom_map.

Si noti che non si ottiene il messaggio di errore con ggplot() + myMap + Limits perché non è stata impostata alcuna estetica nella chiamata ggplot.

In ciò che segue, sto usando R versione 2.15.0, ggplot2 versione 0.9.1, e ggmap versione 2.1.Uso il tuo codice quasi esattamente, tranne l'aggiunta di inherit.aes = FALSE nella chiamata a geom_map. Che un piccolo cambiamento permette ggmap e geom_map da sovrapporre:

library(sp) 
library(spdep) 
library(ggplot2) 
library(ggmap) 
library(rgdal) 

#Get and fiddle with data: 
nc.sids <- readShapePoly(system.file("etc/shapes/sids.shp", package="spdep")[1],ID="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66")) 
nc.sids=spTransform(nc.sids,CRS("+init=epsg:4326")) 

#Get background map from stamen.com, plot, looks nice: 
ncmap = get_map(location=as.vector(bbox(nc.sids)),source="stamen",maptype="toner",zoom=7) 
ggmap(ncmap) 

#Create a data frame with long,lat,Z, and plot over the map and a blank plot: 
ncP = data.frame(coordinates(nc.sids),runif(nrow(nc.sids))) 
colnames(ncP)=c("long","lat","Z") 

ggmap(ncmap)+geom_point(aes(x=long,y=lat,col=Z),data=ncP) 
ggplot()+geom_point(aes(x=long,y=lat,col=Z),data=ncP) 

#give it some unique ids called 'id' and fortify (with vitamins and iron?) 
[email protected][,1]=1:nrow(nc.sids) 
names(nc.sids)[1]="id" 
ncFort = fortify(nc.sids) 

#Now, my map and my limits, I want to plot the 74 birth rate: 
myMap = geom_map(inherit.aes = FALSE, aes(fill=BIR74,map_id=id), map=ncFort,[email protected]) 
Limits = expand_limits(x=ncFort$long,y=ncFort$lat) 

# and on a blank plot I can: 
ggplot() + myMap + Limits 

# but on a ggmap I cant: 
ggmap(ncmap) + myMap + Limits 

Il risultato dall'ultima riga di codice è:

enter image description here

+0

ottengo "Errore nella validDetails.polygon (x): ' x 'and' y 'e' id 'devono essere tutti della stessa lunghezza "se aggiungo inherit.aes = FALSE a myMap nell'esempio sopra. – Spacedman

+0

@Spacedman Ho modificato la mia risposta per includere il codice e il risultato. Il codice è quasi esattamente il tuo codice tranne l'aggiunta 'inherit.aes = FALSE' nella chiamata' geom_map'. –

+0

Ho aggiornato ggplot2 e ggmap a quelle versioni e ora ggplot2 è completamente rotto. Il primo esempio in geom_point produce un grafico senza punti, imposta solo gli assi, il grigio b/g e nulla. Da una R --vanilla senza altri pacchetti caricati. Forse una versione di versione R (2.14.2 ...). Grr. – Spacedman