与geom_map叠加ggmap(ggmap with geom_map superimposed)

2019-06-25 07:22发布

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

获取和数据拨弄:

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"))

得到stamen.com,情节背景图,看起来不错:

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

创建长,纬度,Z,并绘制地图和空白的情节在数据帧:

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)

给它一些所谓的“身份证”唯一ID和强化(维生素和铁?)

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

现在,我的地图和我的极限,我要绘制的74出生率:

myMap = geom_map(aes(fill=BIR74,map_id=id),map=ncFort,data=nc.sids@data)
Limits = expand_limits(x=ncFort$long,y=ncFort$lat)

并在空白的情节,我可以:

ggplot() + myMap + Limits

但在ggmap我不能:

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

有些版本:

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

我可以添加到geom_polygon或ggplot和ggmap它按预期工作。 所以东西了geom_map ....

Answer 1:

该错误消息是,我认为,一个传承问题的结果。 典型地,它涉及当不同的数据帧在随后的层,使用约。

在GGPLOT2,每层继承在初始调用全局设置默认AES映射ggplot 。 例如, ggplot(data = data, aes(x = x, y = y))设置x和y映射全局使得所有随后的层期望看到xy在任何数据帧已被分配给它们。 如果xy不存在,类似的错误消息你得到的结果。 看到这里了类似的问题,一系列的解决方案。

根据你的情况,这不是很明显,因为首先调用的是ggmap -你不能看到映射也不它们是如何设置的,因为ggmap被均能包裹起来。 然而, ggmap调用ggplot的地方,所以默认的审美映射必须已在初始呼叫某处设置为ggmap 。 由此可见那么ggmap其次geom_map不考虑继承问题导致的错误。

所以,Kohske在早期后建议适用 - “你需要抵消的LON AES在geom_map当您使用不同的数据集”。 不知道太多关于什么已经设置或如何,他们已经设定,它可能是最简单的通过增加通配符处理的很多inherit.aes = FALSE到第二层-调用geom_map

请注意,您不收到错误信息ggplot() + myMap + Limits ,因为没有美学已经在ggplot通话设置。

在下文中,我,使用R版本2.15.0,GGPLOT2版本0.9.1,并ggmap版本2.1。 我用你的代码几乎一模一样,除了增加的inherit.aes = FALSE在调用geom_map 。 这一个小小的改变可以让ggmapgeom_map进行叠加:

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?)
nc.sids@data[,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,data=nc.sids@data)
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 

从最后一行代码的结果是:



文章来源: ggmap with geom_map superimposed