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

Nhận và fiddle với dữ liệu:ggmap với geom_map chồng

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

Nhận bản đồ nền từ stamen.com, cốt truyện, có vẻ tốt đẹp:

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

Tạo một khung dữ liệu với dài, lat, Z và lô trên bản đồ và ô trống:

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) 

cung cấp cho nó một số id duy nhất gọi là 'id' và củng cố (với vitamin và sắt?)

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

Bây giờ, bản đồ của tôi và giới hạn của tôi, tôi muốn âm mưu tỷ lệ 74 sinh:

myMap = geom_map(aes(fill=BIR74,map_id=id),map=ncFort,[email protected]) 
Limits = expand_limits(x=ncFort$long,y=ncFort$lat) 

và trên một âm mưu trống tôi có thể:

ggplot() + myMap + Limits 

nhưng trên ggmap tôi không thể:

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

Một số phiên bản:

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

tôi có thể thêm geom_polygon để ggplot hoặc ggmap và nó hoạt động như mong đợi. Vì vậy, có điều gì đó đang xảy ra với geom_map ....

Trả lời

11

Thông báo lỗi là, tôi nghĩ, kết quả của sự cố thừa kế. Thông thường, nó xuất hiện khi các khung dữ liệu khác nhau được sử dụng trong các lớp tiếp theo.

Trong ggplot2, mỗi lớp thừa kế ánh xạ aes mặc định được đặt chung trong lệnh gọi ban đầu là ggplot. Ví dụ: ggplot(data = data, aes(x = x, y = y)) đặt ánh xạ x và y trên toàn cầu để tất cả các lớp tiếp theo mong đợi xem xy trong bất kỳ khung dữ liệu nào đã được gán cho chúng. Nếu xy không có, thông báo lỗi tương tự như thông báo bạn nhận được. See here cho một vấn đề tương tự và một loạt các giải pháp.

Trong trường hợp của bạn, không rõ ràng vì cuộc gọi đầu tiên là ggmap - bạn không thể thấy ánh xạ cũng như cách chúng được đặt vì ggmap được gói gọn hoàn toàn. Tuy nhiên, ggmap gọi ggplot ở đâu đó, và vì vậy các ánh xạ thẩm mỹ mặc định phải được đặt ở đâu đó trong lệnh gọi ban đầu là ggmap. Sau đó, ggmap theo sau là geom_map mà không tính đến các vấn đề kế thừa dẫn đến lỗi.

Vì vậy, lời khuyên của Kohske trong bài viết trước áp dụng - "bạn cần phải vô hiệu hóa aes lon trong geom_map khi bạn sử dụng tập dữ liệu khác". Nếu không biết quá nhiều về những gì đã được thiết lập hoặc cách chúng đã được thiết lập, có thể đơn giản nhất để kết thúc lô bằng cách thêm inherit.aes = FALSE vào lớp thứ hai - gọi tới geom_map.

Lưu ý rằng bạn không nhận được thông báo lỗi với ggplot() + myMap + Limits vì không có tính thẩm mỹ nào được đặt trong lệnh gọi ggplot.

Trong phần tiếp theo, tôi đang sử dụng phiên bản R 2.15.0, ggplot2 phiên bản 0.9.1 và phiên bản ggmap 2.1.Tôi sử dụng mã của bạn gần như chính xác, ngoại trừ việc thêm inherit.aes = FALSE trong cuộc gọi đến geom_map. Đó là một sự thay đổi nhỏ cho phép ggmapgeom_map được chồng:

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 

Kết quả từ dòng cuối cùng của mã là:

enter image description here

+0

tôi nhận được "Lỗi trong validDetails.polygon (x): ' x 'và' y 'và' id 'phải có cùng độ dài "nếu tôi thêm inherit.aes = FALSE vào myMap trong ví dụ trên. – Spacedman

+0

@Spacedman Tôi đã chỉnh sửa câu trả lời của mình để bao gồm mã và kết quả. Mã này gần như chính xác với mã của bạn ngoại trừ phần bổ sung 'inherit.aes = FALSE' trong lệnh gọi' geom_map'. –

+0

Tôi đã cập nhật ggplot2 và ggmap cho các phiên bản đó và bây giờ ggplot2 hoàn toàn bị hỏng. Ví dụ đầu tiên trong geom_point tạo ra một cốt truyện không có điểm, chỉ cần đặt các trục, màu xám b/g và không có gì. Từ một R --vanilla không có gói nào khác được tải. Có thể là một phiên bản R (2.14.2 ...). Grr. – Spacedman

Các vấn đề liên quan