在ggmap上覆盖ggplot,geom_polygon等值线,导致错误

时间:2016-10-25 23:44:45

标签: r ggplot2 ggmap

我正在努力使用ggmap,ggplot和geom_polygon在地图上叠加等值线。我对R很新,所以我不知道该怎么办。我正在使用R Studio。我上传了我的数据(这只是虚假的测试数据),shapefile和R代码here

我在艾伯塔省的人口普查传播区域内有一个主题统计数据文件(实际上只是用于测试的随机数字)。我也有这些区域的shapefile。我只对埃德蒙顿市区感兴趣,如果没有潜在的路线图,我们很难看到我们正在寻找的城市的哪个部分。

我的代码如下:

#################################
#enter long and lat for appx area of City of Edmonton (this is so we can change it easier later to narrow down if we want)
lat1 <- 53.65 
lat2 <- 53.44 
long1 <- -113.68 
long2 <- -113.35
#################################

xcoords <- c(long2, long1) 
ycoords <- c(lat2, lat1) 

#load data 
data <-read.csv("C:.../fakedata.csv") #data file location 
names(data) 
data

#Load in the shape file 
shp=readShapeSpatial('C:.../gda_048b06a_e.shp') #shape file location

plot(shp) 

这给了这个(如预期的那样),该省的所有DA。然而,这太大了,而且我有太多的DA需要手动通过,看看哪些是在埃德蒙顿,哪些不是,所以我决定根据主题#对它们进行着色,并限制为特定long和lat:

#Making the data types match 
data$amount <-as.numeric(as.character(data$amount))

is.factor(shp$DAUID) 
data$DAUID<-as.factor(data$DAUID)
is.factor(data$DAUID) #should be True 
is.factor(shp$DAUID) #should be True

shp@data <- left_join(shp@data, data) 
head(shp@data) 
map2 <- fortify(shp, region = "DAUID")

#wait a bit for the fortify to work!
map2 <- rename(map2, DAUID = id) 
map2 <- left_join(map2, shp@data) 
ggplot2 <- ggplot(map2)

#DA map 
datamap <- ggplot2 + geom_polygon(aes(long, lat, group = group, fill = amount),color = "grey") +
scale_fill_gradient(low='white', high='red') + coord_map(xlim =
xcoords,ylim = ycoords) 
datamap

数据图也是我期望的样子。

#map of Edm 
edmonton <- get_map(location = 'edmonton',maptype="road") 
ggmap(edmonton)

我想要做的是将我的DA地图叠加到路线图上,这样我们就可以更好地了解暗区与亮区的位置。在这一点上,我开始收到错误。

#stuck on how to overlay datamap on top of ggmap(edmonton)

datamap2 <- ggmap(edmonton) + datamap 
datamap2

我收到此错误:

  

p + o出错:二元运算符的非数字参数另外:   警告消息:不兼容的方法(&#34; + .gg&#34;,&#34; Ops.data.frame&#34;)   &#34; +&#34;

我已经玩了一个星期试图整合解决方案,我已经看到类似的问题,但我似乎无法让它工作。由于我的shapefile比我的城市地图大得多,这可能是个问题吗?我以前从未在R中做过这样的事情,而且GIS不在我的技能组合中。

我的问题与此previous question类似,但其中的解决方案对我不起作用。如果内容与其他问题的关系过于接近,我深表歉意,并感谢任何指导!

(如果这太长了我也会道歉!我不想遗漏任何有用的信息)

1 个答案:

答案 0 :(得分:2)

我调查了你的案子,最后以我的方式完成了工作。我希望你不介意。您需要的是在多边形数据中的假数据集中使用amount的数据集。我猜这就是你可能使用left_join的原因。无论如何,每个多边形具有不同数量的数据点。我计算了每个多边形的数据点总数,并创建了num。使用此功能,您可以使用DAUID创建一个向量,并替换id中的mymap2。排列数据后,您将获得一个带有ggmap的栅格地图。然后,在栅格地图上绘制多边形。你可以控制alpha值,看看颜色是如何产生的。例如,如果将值降低到0.1,则很难看出颜色之间的差异。您可能想要考虑另一种展示道路的方式。一种方法是使用加拿大道路数据集并在埃德蒙顿绘制一些主要道路。希望这会对你有所帮助。

library(readr)
library(dplyr)
library(ggplot2)
library(ggmap)
library(rgdal)

#load data
mydata <- read_csv("fakedata.csv") %>%
          rename(id = DAUID)

#Load in the shape file
mymap <- readOGR(dsn = ".", layer = "gda_048b06a_e")

mymap@data$DAUID <- as.numeric(as.character(mymap@data$DAUID))

mymap2 <- fortify(mymap)

# Get the number of data points for each polygon
group_by(mymap2, as.numeric(id)) %>%
summarize(total = n()) -> num

# Replace id with DAUID, and merge with mydata
mymap2 %>%
mutate(id = rep(unique(mymap$DAUID), num$total)) %>%
left_join(mydata, by = "id") -> mymap2


#map of Edm
edmonton <- get_map(location = "edmonton",maptype = "road")

ggmap(edmonton) + 
geom_map(data = mymap2, map = mymap2,
         aes(x = long, y = lat, group = group, map_id = id, fill = amount),
         color = "black", size = 0.2, alpha = 0.3) +
scale_fill_gradient(low = "white", high = "red") +
coord_map(xlim = c(-113.35, -113.68), ylim = c(53.44, 53.65))

enter image description here