alex_bn_lee

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

统计

【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,然后通过 $ 可以获取指定的列信息,从而可以直接赋值

  参考代码如下

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

posted on   McDelfino  阅读(744)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示