zoukankan      html  css  js  c++  java
  • 【560】Leaflet for R 绘图

      写在前面:由于对于 folium 比较了解了,而且可以正常实现功能,本来认为学习 R 应该不会太难,毕竟都是一样的东西,但是学起来却很麻烦,主要是网上的一些糟糕的教程,将一些简单的实现弄得很复杂,然后就是用 R 特有的那些诡异的符号,其实有正常的符号可以用,而且很友好,为啥非得搞一堆%%%%%%%来做甚,最终在某大佬的帮助下,拿到了他学生的一段代码,结果就感觉容易好多,自己也在此基础上进行了相应的扩展。


    参考:官方文档

    参考:第三方底图数据

    参考:R语言在线地图神器:Leaflet for R包(一)

    参考:Package ‘leaflet’ - 语法说明


    • R 没有 Python 那样简单方便的数组,因此在准备的时候需要通过 data.frame 来实现 
    • Python 里面的 polygon 以及 polyline 都是可以通过直接赋值二维数组(list)
    • R 里面则不是这样,需要对于 lng 和 lat 单独赋值一个向量(c)
    • 因此最简洁的办法就是通过 data.frame,然后通过 $ 可以获取指定的列信息,从而可以直接赋值

      参考代码如下

    library(leaflet)
    library(sp) 
    
    m = leaflet()
    m = addProviderTiles(m,providers$Esri.WorldGrayCanvas)
    
    # 单点,直接加入坐标即可
    m = addMarkers(m, lng=116.486635, lat=40.00777, popup='Wangjing')
    
    # 多边形,需要所有的点,可以填充颜色
    
    df1 = data.frame(
        longitude = c(116.485635, 116.488035, 116.487635, 116.487645), 
        latitude = c(40.00777, 40.00697, 40.00877, 40.00977))
    
    m = addPolygons(m,
                    lng = df1$longitude,
                    lat = df1$latitude,
                    weight = 2)
    
    # 折线,需要所有的点,只有颜色
    df2 = data.frame(
        longitude = c(116.485635, 116.488035, 116.487635), 
        latitude = c(40.00677, 40.00597, 40.00777))
    
    m = addPolylines(m, 
                     lng = df2$longitude, 
                     lat = df2$latitude,
                     color = 'red', 
                     weight = 2)
    
    # 圆圈显示
    m = addCircles(m, 
                   lng = 116.485635, 
                   lat = 40.00677, 
                   radius = 50,
                   color = 'purple',
                   fillColor = 'purple',
                   fillOpacity = 0.5)
    
    
    m = addCircleMarkers(m,
                         lng = 116.488035,
                         lat = 40.00597,
                         radius = 20,
                         popup = 'Park',
                         color = '#3186cc',
                         fill = TRUE,
                         fillColor = '#3186cc')
    
    # 显示点集(Markers)
    m = addMarkers(m,
                   lng = df3$longitude,
                   lat = df3$latitude)
    
    
    # 显示点集(Circles)
    
    m = addCircles(m,
                   lng = df1$longitude,
                   lat = df1$latitude,
                   radius = 1,
                   color = 'red')
    
    m
    

      效果如下

      加载国外地图会出现偏移的情况,需要进行相应的调整,可以直接读取 csv 文件进行显示

    library(leaflet)
    
    # 偏移值
    d_lng = 0.006094
    d_lat = 0.001381
    
    # 设置默认的路径,不然读不进来文件
    setwd("/Users/libingnan/Documents/Python/R")
    
    # 文件读取并且调整偏移值
    data = read.csv("wj_aoi.csv", encoding="UTF-8")
    data$lng = data$lng - d_lng
    data$lat = data$lat - d_lat
    
    m = leaflet()
    m = addProviderTiles(m,providers$Esri.WorldGrayCanvas)
    m = addPolygons(m,
                    lng = data$lng,
                    lat = data$lat,
                    weight = 2)
    m  # Print the map
    

      显示效果如下(左边为 csv 数据格式,中间为代码显示效果,右边为没有进行偏移调整的效果):

      

      相关参考说明:

    #+++++++画散点图等展示数据的图+++++++
    #install.packages("ggplot2")#如果还没安装过这个包可以安装
    library(ggplot2)
    data=data.frame(x=c(1:18),y=sin(c(1:18)/6*pi)+1.2)#数据一定要用data.frame储存
    #pdf("1.pdf",width=2,height=1.5)#保存为pdf格式
    ggplot(data,aes(x=x,y=y))+
      geom_line()+geom_point(size=3)+#点和线,可以换成其他图表类型,相关代码在网上有很多
      theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank(),panel.background=element_blank(),
            axis.line=element_line(colour="black"))+
      scale_x_continuous(expand=c(0,0))+
      scale_y_continuous(expand=c(0,0))+
      xlab("t")+ylab("Demand level")
    #dev.off()#保存为pdf格式
    
    #+++++++画在地图上展示点的图+++++++
    library(leaflet)
    nodedata=data.frame(longitude=c(-73.98055),latitude=c(40.76247))
    m=leaflet()
    ad=setView(m,lng=-73.98055,lat=40.76247,zoom=12)
    ad=addProviderTiles(ad,providers$Esri.WorldGrayCanvas)#空白画布
    ad=addCircleMarkers(ad,lng=nodedata$longitude,lat=nodedata$latitude,color="grey",radius=5)#加大点
    addCircleMarkers(ad,lng=nodedata$longitude,lat=nodedata$latitude,color="black",radius=2)#这里没有ad=,与前面不一样
    #用rstudio可以可视化该图,可以保存为png后截图,不能保存为pdf
    
    #+++++++画图经验+++++++
    #1. 论文中,一般简单黑白图就可以了,在只能展示复杂图的情况下,才需要花很多时间在调整画图上
    #2. 如果需要多种颜色,颜色搭配也重要,可以参考网上已有的颜色搭配
    #3. 以上是使用R画图的基础模板,重要参数都写出来了
    #4. 如果不能用以上模板画出来的话,可以借用其他工具画图,应该也会很好用的
    

      散点显示

    library(leaflet)
    
    # 设置默认的路径,不然读不进来文件
    setwd("/Users/libingnan/Documents/Python/R")
    
    m = leaflet()
    # 加载 Google 地图
    m = addTiles(m, "https://mt.google.com/vt/lyrs=m&x={x}&y={y}&z={z}")
    
    data = read.csv(paste("./01-Example (points+polygons)/data/poly_df.csv"), 
                    encoding="UTF-8")
    # 外层边框
    m = addPolygons(m,
                    lng = data$lng,
                    lat = data$lat,
                    color = 'purple',
                    opacity = 1,
                    fillColor = "purple",
                    fillOpacity = 0, 
                    weight = 3)
    
    # 点数据
    # 存储点集的颜色信息
    colors = c('#76EE00', '#1E90FF', '#FF1493', 'yellow')
    
    # 遍历4个点集数据,data.frame
    for (j in 0:3) {
      data1 = read.csv(paste("./01-Example (points+polygons)/data/addr_", j, ".csv", sep=""), 
                     encoding="UTF-8")
    
      for (i in 1:dim(data1)[1]) {
        # 外层圆
        m = addCircleMarkers(m,
                           lng = data1[i, 1],
                           lat = data1[i, 2],
                           color = '#333',
                           opacity = 1,
                           radius = 1.5)
        # 内层圆
        m = addCircleMarkers(m,
                           lng = data1[i, 1],
                           lat = data1[i, 2],
                           color = colors[j+1],
                           opacity = 1,
                           radius = 0.5)
      }
    }
    
    m  # Print the map
    

       显示效果

     

      三角网绘图

    library(leaflet)
    
    # 设置默认的路径,不然读不进来文件
    setwd("/Users/libingnan/Documents/Python/R")
    
    m = leaflet()
    m = addTiles(m, "https://mt.google.com/vt/lyrs=m&x={x}&y={y}&z={z}")
    
    ind = sample(1:90, 90, replace = FALSE)
    
    for (i in 0:732) {
      data = read.csv(paste("/Users/libingnan/Documents/Python/04_Geohash_new_experiment/03_concave_hull_凹包_alpha_shape/data/tri_edges_", i, ".csv", sep = ""), 
                      encoding="UTF-8")
      
      m = addPolygons(m,
                      lng = data$lng,
                      lat = data$lat,
                      color = '#333',
                      opacity = 1,
                      fillColor = "blue",
                      fillOpacity = 0, 
                      weight = 1)
    }
    
    # concave2 (大三角形)
    for (i in 8:8) {
      data = read.csv(paste("/Users/libingnan/Documents/Python/04_Geohash_new_experiment/03_concave_hull_凹包_alpha_shape/data/concave2_", i, ".csv", sep = ""), 
                      encoding="UTF-8")
      
      m = addPolygons(m,
                      lng = data$lng,
                      lat = data$lat,
                      color = 'blue',
                      opacity = 1,
                      fillColor = "blue",
                      fillOpacity = 0.2, 
                      weight = 2.5)
    }
    
    # concave3
    data_concave1 = read.csv(paste("/Users/libingnan/Documents/Python/04_Geohash_new_experiment/03_concave_hull_凹包_alpha_shape/concave3_df.csv", sep = ""), 
                             encoding="UTF-8")
    
    m = addPolygons(m,
                    lng = data_concave1$lng,
                    lat = data_concave1$lat,
                    color = 'purple',
                    opacity = 1,
                    fillColor = "purple",
                    fillOpacity = 0.2, 
                    weight = 2.5)
    
    # 点数据
    data1 = read.csv(paste("/Users/libingnan/Documents/Python/04_Geohash_new_experiment/03_concave_hull_凹包_alpha_shape/pt_df.csv", sep = ""), 
                     encoding="UTF-8")
    
    for (i in 1:375) {
      
      m = addCircleMarkers(m,
                           lng = data1[i, 1],
                           lat = data1[i, 2],
                           color = '#333',
                           opacity = 1,
                           radius = 1.5)
      
      m = addCircleMarkers(m,
                           lng = data1[i, 1],
                           lat = data1[i, 2],
                           color = 'orange',
                           opacity = 1,
                           radius = 0.5)
      
    }
    
    
    
    m  # Print the map
    

       显示效果

     

      总结:

    • 为了给圆点增加边线,需要对每个点进行遍历显示一个大圆一个小圆,从而实现边线效果
    • 越是后面,显示的越在最上面一层
    • dim(data): 获取 data.frame 的维度,行与列
    • dim(data)[1]: 行数
    • dim(data)[2]: 列数
    • dim(data[1]): 行数,先获取整个第一列,让后计算长度/维度
    • for (i in 1:10) {...}: 遍历 1-10,都包含
    • 类似列表的构建: cities = c('Shanghai', 'Beijing', 'Tianjin')
    • c[1] 对应 'Shanghai'
    • 读取 csv 的格式: read.csv(past(filepath, encoding='UTF-8'
    • getwd(): 获取工作空间路径
    • setwd(): 设置工作空间路径
    • 相对路径: filepath = "./aa/bb.csv"
  • 相关阅读:
    Study Plan The TwentySecond Day
    Study Plan The Nineteenth Day
    Study Plan The TwentySeventh Day
    Study Plan The Twentieth Day
    Study Plan The TwentyFirst Day
    python实现进程的三种方式及其区别
    yum makecache
    JSONPath 表达式的使用
    oracle执行cmd的实现方法
    php daodb插入、更新与删除数据
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/14768727.html
Copyright © 2011-2022 走看看