r - 叠加了geom_map的ggmap

标签 r map ggplot2 ggmap

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)

创建一个具有long,lat,Z的数据框,并在 map 上绘制一个空白图表:
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,称为“ID”并强化(含维生素和铁?)
nc.sids@data[,1]=1:nrow(nc.sids)
names(nc.sids)[1]="id"
ncFort = fortify(nc.sids)

现在,我的 map 和界限,我想绘制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发生了什么...。

最佳答案

我认为错误消息是继承问题的结果。通常,它是在后续层中使用不同的数据帧时发生的。

在ggplot2中,每个层都继承在对ggplot的初始调用中全局设置的默认aes映射。例如,ggplot(data = data, aes(x = x, y = y))全局设置x和y映射,以便所有后续层都希望在已分配给它们的任何数据帧中看到xy。如果不存在xy,则将显示类似于您得到的错误消息的结果。 See here用于解决类似问题和一系列解决方案。

在您的情况下,这并不明显,因为第一个调用是ggmap-您看不到映射或它们的设置方式,因为ggmap都被很好地包装了。但是,ggmap在某处调用ggplot,因此必须在初始调用ggmap的某处设置默认的美学映射。随之而来的是,在不考虑继承问题的情况下,ggmap后跟geom_map会导致错误。

因此,适用于上一篇文章中的Kohske的建议-“当您使用其他数据集时,您需要在geom_map中使lon aes无效”。在不了解什么设置或如何设置的情况下,通过在第二层添加inherit.aes = FALSE(对geom_map的调用)来弄清很多东西,可能是最简单的方法。

请注意,由于ggplot调用中未设置任何美观,因此您不会收到带有ggplot() + myMap + Limits的错误消息。

在下面的内容中,我使用的是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 

最后一行代码的结果是:

关于r - 叠加了geom_map的ggmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10930737/

相关文章:

r - 创建遵循各种分布的相关变量

R geom_bar facet_grid 垂直而不是水平

r - 如何正确使用 ggstatsplot 包中的 grouped_ggwithinstats() 函数

python - 具有指定误报和灵敏度的随机森林

r - 将 ggplot map 与 coord_equal() 对齐

r - 当 x 轴值为日期时更改刻度间隔

c++ - 错误 : c++ [map] does not name a type

android - 我们有什么解决方案可以在 Android 上读取和显示 Autocad DWG 文件?

perl - Perl 中是否有诸如 zip 和 fold 之类的功能?

r - stat_function 从函数生成平线