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

प्राप्त करें और डेटा के साथ बेला:ggmap आरोपित

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) 

लंबे साथ एक डेटा फ्रेम बनाएँ, मानचित्र पर लेट, जेड, और साजिश और एक खाली साजिश:

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' कहलाती देने के लिए और मज़बूत (विटामिन और लोहे के साथ?)

[email protected][,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,[email protected]) 
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 
,210

कुछ संस्करणों:

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

मैं ggplot या ggmap को geom_polygon जोड़ सकते हैं और यह उम्मीद के रूप में काम करता है। तो geom_map के साथ कुछ है ....

उत्तर

11

त्रुटि संदेश, मुझे लगता है, विरासत मुद्दे का परिणाम है। आम तौर पर, यह तब आता है जब बाद के परतों में विभिन्न डेटा फ्रेम का उपयोग किया जाता है।

ggplot2 में, प्रत्येक परत को प्रारंभिक कॉल में ggplot पर वैश्विक रूप से सेट डिफ़ॉल्ट एएस मैपिंग्स प्राप्त होता है। उदाहरण के लिए, ggplot(data = data, aes(x = x, y = y)) वैश्विक स्तर पर एक्स और वाई मैपिंग सेट करता है ताकि सभी बाद की परतें x और y को जो भी डेटा फ्रेम सौंपी गई हों, उन्हें देखने की उम्मीद है। यदि x और y मौजूद नहीं हैं, तो आपके द्वारा परिणाम प्राप्त किए गए समान त्रुटि संदेश। एक ही समस्या और समाधान की एक श्रृंखला के लिए See here

आपके मामले में, यह स्पष्ट नहीं है क्योंकि पहली कॉल ggmap है - आप मैपिंग नहीं देख सकते हैं और न ही वे कैसे सेट हैं क्योंकि ggmap सभी अच्छी तरह से लपेटा गया है। फिर भी, ggmap कहीं ggplot पर कॉल करता है, और इसलिए डिफ़ॉल्ट सौंदर्य मैपिंग को ggmap पर प्रारंभिक कॉल में कहीं भी सेट किया जाना चाहिए। इसके बाद यह ggmapgeom_map के बाद विरासत के मुद्दों के कारण त्रुटि में परिणाम देता है।

तो, पहले पोस्ट में कोहस्के की सलाह लागू होती है - "जब आप एक अलग डेटासेट का उपयोग करते हैं तो आपको geom_map में लोन एएस को कम करने की आवश्यकता होती है"। जो सेट किया गया है या कैसे सेट किया गया है, उसके बारे में बहुत कुछ जानने के बिना, inherit.aes = FALSE को दूसरी परत में जोड़कर बहुत अधिक ग्लोबबर करना संभव है - geom_map पर कॉल करें।

ध्यान दें कि आपको ggplot() + myMap + Limits के साथ त्रुटि संदेश नहीं मिला है क्योंकि ggplot कॉल में कोई सौंदर्यशास्त्र सेट नहीं किया गया है।

इस प्रकार, मैं आर संस्करण 2.15.0, ggplot2 संस्करण 0.9.1, और ggmap संस्करण 2.1 का उपयोग कर रहा हूं।geom_map पर कॉल में inherit.aes = FALSE के अतिरिक्त को छोड़कर मैं लगभग आपके कोड का उपयोग करता हूं। यह एक छोटा सा परिवर्तन 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?) 
[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 

कोड की अंतिम पंक्ति से परिणाम है:

enter image description here

+0

मैं validDetails.polygon में मिलता है "त्रुटि (एक्स): ' एक्स 'और' वाई 'और' आईडी 'सभी एक ही लम्बाई होनी चाहिए "अगर मैं ऊपर दिए गए उदाहरण में myMap.aes = myMap में FALSE जोड़ता हूं। – Spacedman

+0

@ स्पेसमैन मैंने कोड और नतीजे को शामिल करने के लिए अपना जवाब संपादित कर लिया है। कोड 'geom_map' कॉल में' legisl.aes = FALSE' को जोड़ने के अलावा कोड लगभग बिल्कुल सही है। –

+0

मैंने उन संस्करणों में ggplot2 और ggmap को अद्यतन किया और अब ggplot2 पूरी तरह से तोड़ दिया गया है। Geom_point में पहला उदाहरण कोई प्वाइंट नहीं देता है जिसमें कोई अंक नहीं है, बस अक्ष, ग्रे बी/जी, और कुछ भी सेट नहीं करता है। एक आर --vanilla से कोई अन्य पैकेज लोड के साथ। शायद एक आर संस्करण चीज (2.14.2 ...)। Grr। – Spacedman