Flow map(Travel Path) Using Lat and Long in R

前端 未结 5 1731
臣服心动
臣服心动 2021-01-19 07:55

I am trying to plot flow map (for singapore) . I have Entry(Lat,Long) and Exit (Lat,long). I am trying to map the flow from entry to exit in singapore map.

s         


        
5条回答
  •  天涯浪人
    2021-01-19 08:41

    Just realized that the original solution usin geom_path was more complicated than necessary. geom_segmentworks without changing the data:

    require(ggplot2)
    require(ggmap)
    basemap <- get_map("Singapore",
                       source = "stamen",
                       maptype = "toner",
                       zoom = 11)
    
    g = ggplot(a)
    map = ggmap(basemap, base_layer = g)
    map = map + coord_cartesian() +
          geom_curve(size = 1.3,
                     aes(x=as.numeric(Entry_Station_Long),
                         y=as.numeric(Entry_Station_Lat),
                         xend=as.numeric(as.character(Exit_Station_Long)),
                         yend=as.numeric(as.character(Exit_Station_Lat)),
                         color=as.factor(token_id)))
    map
    

    This solution leverages Draw curved lines in ggmap, geom_curve not working to implement curved lines on a map.

    ggmaps used for simplicity - for more ambitious projects I would recommend leaflet.

    Below the solution using a long data format with some prior data wrangling. It also uses straight lines instead of the curves above.

    a %>%
      mutate(path = row_number()) -> a
    
    origin = select(a,token_id,Entry_Station_Lat,Entry_Station_Long,path)
    origin$type = "origin"
    dest = select(a,token_id,Exit_Station_Lat,Exit_Station_Long,path)
    dest$type = "dest"
    
    colnames(origin) = c("id","lat","long","path","type")
    colnames(dest) = c("id","lat","long","path","type")
    complete = rbind(origin,dest)
    complete %>% arrange(path,type) -> complete
    
    require(ggmap)
    basemap <- get_map("Singapore",
                       source = "stamen",
                       maptype = "toner",
                       zoom = 11)
    
    g = ggplot(complete, aes(x=as.numeric(long),
                             y=as.numeric(lat)))
    map = ggmap(basemap, base_layer = g)
    
    map + geom_path(aes(color = as.factor(id)),
                    size = 1.1)
    

提交回复
热议问题