【560】Leaflet for R 绘图
写在前面:由于对于 folium 比较了解了,而且可以正常实现功能,本来认为学习 R 应该不会太难,毕竟都是一样的东西,但是学起来却很麻烦,主要是网上的一些糟糕的教程,将一些简单的实现弄得很复杂,然后就是用 R 特有的那些诡异的符号,其实有正常的符号可以用,而且很友好,为啥非得搞一堆%%%%%%%来做甚,最终在某大佬的帮助下,拿到了他学生的一段代码,结果就感觉容易好多,自己也在此基础上进行了相应的扩展。
参考:官方文档
参考:第三方底图数据
参考:R语言在线地图神器:Leaflet for R包(一)
- R 没有 Python 那样简单方便的数组,因此在准备的时候需要通过 data.frame 来实现
- Python 里面的 polygon 以及 polyline 都是可以通过直接赋值二维数组(list)
- R 里面则不是这样,需要对于 lng 和 lat 单独赋值一个向量(c)
- 因此最简洁的办法就是通过 data.frame,然后通过 $ 可以获取指定的列信息,从而可以直接赋值
参考代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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 文件进行显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 数据格式,中间为代码显示效果,右边为没有进行偏移调整的效果):
相关参考说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #+++++++画散点图等展示数据的图+++++++ #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. 如果不能用以上模板画出来的话,可以借用其他工具画图,应该也会很好用的 |
散点显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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 |
显示效果
三角网绘图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 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"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)