代码之家  ›  专栏  ›  技术社区  ›  A. Mullins

在ggmap上叠加ggplot、geom_polygon CHROPLETH,给出误差

  •  2
  • A. Mullins  · 技术社区  · 9 年前

    here

    我的代码如下:

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

    这给出了该省的所有DAs(如预期)。然而,这太大了,有太多的DAs,我无法手动查看哪些在埃德蒙顿,哪些不是,所以我决定根据主题的#将它们着色,并限制为特定的长和长:

    #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
    

    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错误:二进制运算符的非数字参数。此外: 警告消息:不兼容的方法(“+.gg”,“Ops.data.frame”)用于 "+"

    我已经花了一周的时间尝试将我看到的类似问题的解决方案结合起来,但我似乎无法让它发挥作用。由于我的形状文件比我的城市地图大得多,这可能是问题所在吗?我以前从未在R中做过这样的事情,GIS不在我的技能范围之内。

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

    (如果时间太长,我也很抱歉!我不想遗漏任何有用的信息)

    1 回复  |  直到 8 年前
        1
  •  2
  •   jazzurro    9 年前

    我调查了你的案子,结果以我的方式完成了工作。我希望你不介意。您需要的是一个数据集 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