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'和强化(用维生素和铁?)的独特ids
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就好了。
答案 0 :(得分:12)
我认为错误消息是继承问题的结果。通常,它是在后续层中使用不同数据帧时实现的。
在ggplot2中,每个图层都继承了在ggplot
的初始调用中全局设置的默认aes映射。例如,ggplot(data = data, aes(x = x, y = y))
全局设置x和y映射,以便所有后续层都希望在分配给它们的任何数据帧中看到x
和y
。如果x
和y
不存在,则会显示与您获得的错误消息类似的错误消息。 See here针对类似问题和一系列解决方案。
在你的情况下,它并不明显,因为第一次调用是ggmap
- 你无法看到映射或它们是如何设置的,因为ggmap
完全被包裹起来。尽管如此,ggmap
在某处调用了ggplot
,因此默认的美学映射必须在ggmap
的初始调用中设置。接下来,ggmap
后跟geom_map
而未考虑继承问题会导致错误。
因此,Kohske在之前的帖子中提出的建议适用 - “当你使用不同的数据集时,你需要使geom_map中的lon aes无效”。如果不了解已设置的内容或设置方式,可能最简单的方法是将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
之外,我几乎完全使用了您的代码。这一小改变允许ggmap
和geom_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
最后一行代码的结果是: