10
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、およびマップ上のプロットと空のプロットでデータ フレームを作成します。

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)

ここで、マップと制限で、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で何かが起きています....

4

1 に答える 1

12

エラーメッセージは、継承の問題の結果だと思います。通常、後続のレイヤーで異なるデータ フレームが使用されている場合に発生します。

ggplot2 では、すべてのレイヤーが への最初の呼び出しでグローバルに設定されたデフォルトの aes マッピングを継承しますggplot。たとえば、ggplot(data = data, aes(x = x, y = y))x と y のマッピングをグローバルに設定して、後続のすべてのレイヤーがそれらに割り当てられたデータ フレームで表示されることxを期待します。とが存在しないy場合は、得られたものと同様のエラー メッセージが表示されます。同様の問題とさまざまな解決策については、こちらを参照してください。xy

あなたの場合、最初の呼び出しが to であるため、明らかではありません。すべてがうまくまとめられているggmapため、マッピングも設定方法もわかりません。ggmapそれにもかかわらず、どこかでggmap呼び出しggplotが行われるため、デフォルトの美的マッピングは への最初の呼び出しのどこかに設定されている必要がありますggmap。したがって、継承の問題を考慮せずに を実行すると、エラーが発生しますggmapgeom_map

したがって、以前の投稿での Kohske のアドバイスが適用されます。「別のデータセットを使用する場合は、geom_map の lon aes を無効にする必要があります」。何が設定されているか、どのように設定されているかをあまり知らなくてもinherit.aes = FALSE、2 番目のレイヤー ( geom_map.

ggplot() + myMap + Limitsggplot 呼び出しで美学が設定されていないため、エラー メッセージが表示されないことに注意してください。

以下では、R バージョン 2.15.0、ggplot2 バージョン 0.9.1、および ggmap バージョン 2.1 を使用しています。inherit.aes = FALSEへの呼び出しでの追加を除いて、私はあなたのコードをほぼ正確に使用しますgeom_map。その1つの小さな変更により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 

コードの最後の行の結果は次のとおりです。

ここに画像の説明を入力

于 2012-06-07T22:33:31.257 に答える