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

conseguir y violín con los datos:ggmap con geom_map superpone

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 mapa de fondo en stamen.com, la trama, se ve bien:

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

Crear una trama de datos con el tiempo, lat, Z, y la trama sobre el mapa y un diagrama en blanco:

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) 

darle algunos identificadores únicos llamados 'id' y fortificar (con vitaminas y hierro?)

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

Ahora, mi mapa y mis límites, quiero trazar la tasa de 74 nacimiento:

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

y en una parcela en blanco que puedo:

ggplot() + myMap + Limits 

pero en una ggmap no puedo:

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

Algunas versiones:

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

puedo añadir a geom_polygon ggplot o ggmap y funciona como se esperaba. Así que algo está pasando con geom_map ....

Respuesta

11

El mensaje de error es, creo, el resultado de un problema de herencia. Normalmente, se produce cuando se utilizan marcos de datos diferentes en capas posteriores.

En ggplot2, cada capa hereda mapeos de aes predeterminados establecidos globalmente en la llamada inicial al ggplot. Por ejemplo, ggplot(data = data, aes(x = x, y = y)) establece las asignaciones x e y globalmente para que todas las capas posteriores esperen ver x y y en cualquier marco de datos que se les haya asignado. Si x y y no están presentes, aparecerá un mensaje de error similar al que obtuvo. See here para un problema similar y una gama de soluciones.

En su caso, no es obvio porque la primera llamada es a ggmap - no puede ver las asignaciones ni cómo están configuradas porque ggmap está muy bien envuelto. Sin embargo, ggmap llama a ggplot en algún lugar, por lo que las asignaciones estéticas predeterminadas deben haberse establecido en algún lugar de la llamada inicial al ggmap. Sigue entonces que ggmap seguido de geom_map sin tener en cuenta los problemas de herencia resulta en el error.

Por lo tanto, se aplica el consejo de Kohske en la publicación anterior: "necesita anular las longitudes en geom_map cuando usa un conjunto de datos diferente". Sin saber demasiado sobre lo que se ha configurado o cómo se han configurado, probablemente sea más simple agrupar el lote agregando inherit.aes = FALSE a la segunda capa: la llamada al geom_map.

Tenga en cuenta que no aparece el mensaje de error con ggplot() + myMap + Limits porque no se ha establecido ninguna estética en la llamada a ggplot.

En lo que sigue, estoy usando R versión 2.15.0, ggplot2 versión 0.9.1 y ggmap versión 2.1.Uso su código casi exactamente, excepto por la adición de inherit.aes = FALSE en la llamada al geom_map. Eso permite que un pequeño cambio ggmap y geom_map que se superpone:

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 

El resultado de la última línea de código es:

enter image description here

+0

me sale "Error en validDetails.polygon (x): ' x 'e' y 'e' id 'deben tener la misma longitud "si agrego inherit.aes = FALSE a myMap en el ejemplo anterior. – Spacedman

+0

@Spacedman He editado mi respuesta para incluir el código y el resultado. El código es casi exactamente tu código a excepción de la adición 'inherit.aes = FALSE' en la llamada' geom_map'. –

+0

Actualicé ggplot2 y ggmap a esas versiones y ahora ggplot2 está totalmente roto. El primer ejemplo en geom_point produce un diagrama sin puntos, solo establece los ejes, el gris b/g, y nada. Desde una R --vanilla sin otros paquetes cargados. Tal vez una cosa de versión R (2.14.2 ...). Grr. – Spacedman

Cuestiones relacionadas