好久没有学习R的新包了,甚是想念啊!

昨天、今天看到两个极好、不得不学的packages+早上被AWS的服务器整得郁闷ing…于是就来点颜色看看~

本篇受Lchiffon老师的github启发,对两个packages进行简单的试玩。leaflet是一个国外动态交互图做得很棒的网站,Lchiffon老师对其进行一些封装,适应了“中国国情”,那就让我们先来看看Lchiffon的leafletCN。

.

.


一、leafletCN

本节主要“抄袭”Lchiffon的blog、github,对简单封装的函数进行简述。leafletCN封装了之后,函数并不多,但是实打实的好用。

github:https://github.com/lchiffon/leafletCN

超详细版PPT:http://langdawei.com/leafletIntro/Untitled.html#1

1、安装与函数简述

  1. ## 稳定版
  2. install.packages("leafletCN")
  3. ## 开发版
  4. devtools::install_github("lchiffon/leafletCN")
  • 主函数介绍:

regionNames:找地名函数,极其方便

demomap:有地名就给你输出一个交互、动态的区域图,真方便

geojsonMap:作用是分区块标色

  • 辅助函数介绍:

amap ():中国国情,高德地图的象征

read.geoShape:可以将geojson的对象,保存成spdataframe,以方便leaflet调用

leafletGeo:地图+小显示框,用地图名以及一个数据框创建一个sp的对象

.

2、主函数介绍

  • (1)regionNames函数
  1. #主函数——regionNames:找地名函数
  2. regionNames("浙江")
  3. regionNames("浙江省")
  4. regionNames("杭州")
  5. regionNames("杭州市")
  6. regionNames()

regionNames的粒度是省级、县级,在细分就没有了。执行regionNames()之后,可以知道包里面存着哪些地方,是否有你要的内容。

  • (2)主函数——demomap:区域式地图
  1. install.packages("rgeos")
  2. demomap("杭州")

交互式界面,可以拖拽。

  • (3)主函数——geojsonmap:地图标色函数
  1. #主函数——geojsonmap:地图标色函数
  2. dat = data.frame(name = regionNames("china"),
  3. value = runif(34))
  4. geojsonMap(dat,"china")

输入数据的长这样,好简单!!

  1. regionNames..china.. runif.34.
  2. 1 新疆维吾尔自治区 0.030015715
  3. 2 西藏自治区 0.746207077
  4. 3 内蒙古自治区 0.897344784
  5. 4 青海省 0.136039312
  6. 5 四川省 0.442047438
  7. 6 黑龙江省 0.410092158
  8. 7 甘肃省 0.292507600



.

3、辅助函数

  • (1)辅助函数——amap:高德地图底图
  1. leaflet() %>% amap()

当然了,这么执行只有一个白板地图,并不是实体的。

  • (2)辅助函数——read.geoShape:genjson格式转化
  1. if(require(sp)){
  2. filePath = system.file("geojson/china.json",package = "leafletCN")
  3. map = read.geoShape(filePath)
  4. plot(map)
  5. }

读入了china.json格式的内容。

  • (3)辅助函数——leafletGeo:地图+小显示框

把一个数据框和一个地图组合在一起, 方便用leaflet调用, 其中名字的 变量为name, 数值的变量为value

.

4、leafletCN 两个案例

案例在Lchiffon的博客基础上进行简单改编,以便对其中的函数进行简单说明。

  • (1)单点标注:地图+标点
  1. leaflet() %>%
  2. amap() %>%
  3. addMarkers(lng=121.48, lat=31.22, popup="企业天地")
  4. # 经度:lng
  5. # 维度:lat
  6. #popup:点的名称

第一、第二行调用高德地图底图,addMarkers为leaflet的标点函数,其中经纬度你可以自己上网查一下,这里简单百度了一下我的公司位置。

  • (2)多点标注:地图+标点+带icoon
  1. #iconList 生成小框框
  2. iconList = awesomeIconList(
  3. "home" = makeAwesomeIcon(icon = "home",markerColor = "skyblue"),
  4. "weixin" = makeAwesomeIcon(icon = "cutlery",markerColor = "red"),
  5. "bank" = makeAwesomeIcon(icon = "plus-sign",markerColor = "orange"),
  6. "automobile" = makeAwesomeIcon(icon = "trash",markerColor = "purple"),
  7. "coffee" = makeAwesomeIcon(icon = "book")
  8. )
  9. #每个小框框的坐标,经纬度
  10. geo = data.frame(lon = rep(121.44, 5),
  11. lat = rep(31.22, 5),
  12. city = rep("Shanghai", 5))
  13. #坐标进行微调,使得有差异
  14. geo$lon = geo$lon+rnorm(5,0,0.003)
  15. geo$lat = geo$lat+rnorm(5,0,0.003)
  16. #小框框的属性
  17. geo$type = c("home",
  18. "weixin",
  19. "bank" ,
  20. "automobile",
  21. "coffee" )
  22. #在高德地图上进行绘制
  23. leaflet(geo) %>% amap() %>%
  24. addMiniMap() %>%
  25. addAwesomeMarkers(icon = ~iconList[type])

awesomeIconList是小框框定义的一个函数;

geo 是坐标点的经纬度,geo$type是坐标点的属性;

leaflet(geo) ,放入数据; amap(),调出高德地图; addMiniMap() ,看到右下角的小显示框了没?; addAwesomeMarkers(icon = ~iconList[type])加入坐标点+坐标的icon



.

- (3)地图+分区域显示+色彩

  1. if(require(leaflet)){
  2. region=regionNames("浙江")
  3. dat = data.frame(region,runif(length(region)))
  4. map = leafletGeo("浙江", dat)
  5. #涂色环节
  6. pal <- colorNumeric(
  7. palette = "Blues",
  8. domain = map$value)
  9. #载入高德地图amap
  10. leaflet(map) %>% amap() %>%
  11. #加入框边界及颜色
  12. addPolygons(stroke = TRUE,
  13. smoothFactor = 1,
  14. fillOpacity = 0.7,
  15. weight = 1,
  16. color = ~pal(value),
  17. popup = ~htmltools::htmlEscape(popup)
  18. ) %>%
  19. #加入右下角边框
  20. addLegend("bottomright", pal = pal, values = ~value,
  21. title = "legendTitle",
  22. labFormat = leaflet::labelFormat(prefix = ""),
  23. opacity = 1)
  24. }

map 阶段,是导入数据,当然这里你也可以导入省级、县级,这里我导入的是浙江省。

addPolygons为加入边界;addLegend加入右下角的程度显示框。

.

.


二、leaflet

来到了更牛X的leaflet包了,那么leafletCN的函数都继承,因为有太多函数+应用,我这边只是简单列举+试玩一些。直接上案例,不介绍简单函数啦~

leaflet官网:http://leafletjs.com/index.html

详细R文档:http://rstudio.github.io/leaflet/markers.html

github地址:https://github.com/Leaflet/Leaflet.markercluster

.

1、说说底图

leaflet 的地图太多了,不过大多以全世界、美国的视角,简单列举几个:

  1. leaflet() %>% addTiles() #openStreetMap 正常的世界地图
  2. leaflet() %>% amap() # 高德(leafletCN)
  3. leaflet() %>% addProviderTiles("Thunderforest.SpinalMap")# 暗黑火焰风格
  4. leaflet() %>% addProviderTiles("Esri.WorldImagery")# 卫星地图
  5. leaflet() %>% addProviderTiles("OpenTopoMap") #带海拔的地图
  6. leaflet() %>% addProviderTiles("NASAGIBS.ViirsEarthAtNight2012") #NASA夜景
  7. leaflet() %>% addProviderTiles("Stamen.Toner") #黑白底图

有很多,可以到这个网址(链接)去找,网址最右边有底图的名称,挑一个你喜欢的就行。



.

.

2、案例一——世界地图+多标记+标记显示数字

  1. data(quakes)
  2. # Show first 20 rows from the `quakes` dataset
  3. leaflet(data = quakes[1:20,]) %>% addTiles() %>%
  4. addMarkers(~long, ~lat, popup = ~as.character(mag), label = ~as.character(mag))

quakes是packages自带的数据,数据长这样:

  1. lat long depth mag stations
  2. 1 -20.42 181.62 562 4.8 41
  3. 2 -20.62 181.03 650 4.2 15
  4. 3 -26.00 184.10 42 5.4 43
  5. 4 -17.97 181.66 626 4.1 19

leaflet(data = quakes[1:20,]) ,显示quakes数据集的前20个;

addTiles() ,世界地图底纹;

addMarkers(~long, ~lat, popup = ~as.character(mag), label = ~as.character(mag))中,

~long, ~lat分别代表经度、维度;popup、label 从图中可以看到,那个数字6.1有两种显示方式,一个是标签式、一个是弹窗。



.

.

3、案例二——世界地图+多标记+图案标记

对图案标记没有抵抗力,觉得很萌,所以对这块倒是研究了一下。本节案例来源:《Markers With Custom

Icons

图像icon下载网站:

http://ionicons.com/

http://fontawesome.io/icons/

  1. geo = data.frame(long = rep(121.44, 1000),
  2. lat = rep(31.22, 1000),
  3. mag=rep(5,1000))
  4. geo$long = geo$long+rnorm(1000,0,0.1)
  5. geo$lat = geo$lat+rnorm(1000,0,0.1)
  6. geo$mag = geo$mag+rnorm(1000,0,1)
  7. quakes1 <- geo[1:10,]
  8. #数据生成阶段,数据长这样
  9. long lat mag
  10. 1 121.2867 31.29484 4.604269
  11. 2 121.3998 31.03906 4.946211
  12. 3 121.5652 31.33814 3.646438
  13. 4 121.3395 31.25626 5.845534
  14. #图标标记阶段
  15. leafIcons <- icons(
  16. iconUrl = ifelse(quakes1$mag < 4.6,
  17. "http://leafletjs.com/examples/custom-icons/leaf-green.png",
  18. ifelse(quakes1$mag < 6,"http://leafletjs.com/examples/custom-icons/leaf-red.png",
  19. "http://leafletjs.com/examples/custom-icons/leaf-orange.png")
  20. ),
  21. iconWidth = 38, iconHeight = 95,
  22. iconAnchorX = 22, iconAnchorY = 94,
  23. shadowUrl = "http://leafletjs.com/examples/custom-icons/leaf-shadow.png",
  24. shadowWidth = 50, shadowHeight = 64,
  25. shadowAnchorX = 4, shadowAnchorY = 62
  26. )
  27. #地图生成
  28. leaflet(data = quakes1) %>% amap() %>%
  29. addMarkers(~long, ~lat, icon = leafIcons)

分为数据生成、图标标记阶段、地图生成阶段。

小叶子,来自于网络,所以直接输入图片链接即可,iconUrl 是三种颜色的小树,其中shadowUrl 是小树苗的阴影,感觉很赞,iconWidth、shadowWidth 等 其他是一些大小指标。

leaflet(数据) %>% amap(高德地图) %>% addMarkers(经纬度+图标)



.

.

4、案例三——地图+点集区域+复选框+NASA星空图

  1. #数据生成
  2. geo = data.frame(long = rep(121.44, 1000),
  3. lat = rep(31.22, 1000),
  4. mag=rep(5,1000))
  5. #mag函数是用来衡量后面,点集范围大小
  6. geo$long = geo$long+rnorm(1000,0,1)
  7. geo$lat = geo$lat+rnorm(1000,0,1)
  8. geo$mag = geo$mag+rnorm(1000,0,1)
  9. outline <- geo[chull(geo$long, geo$lat),]
  10. map <- leaflet(geo) %>%
  11. # 底层阶段
  12. # 第一层底图,高德
  13. amap(group = "高德") %>%
  14. # 第二层底图,黑底图NASA
  15. addProviderTiles(providers$NASAGIBS.ViirsEarthAtNight2012, group = "黑底") %>%
  16. # 第三层底图,白底层
  17. addProviderTiles(providers$Stamen.TonerLite, group = "白底") %>%
  18. # 点集+区域轮廓阶段
  19. addCircles(~long, ~lat, ~7^mag/50, stroke = F, group = "圈点",color="#97FFFF") %>%
  20. # 描点画圈,stroke=T的话,边界包边,丑
  21. # 绘制轮廓,利用前面的凸集点
  22. addPolygons(data = outline, lng = ~long, lat = ~lat,
  23. fill = F, weight = 2, color = "#FFFFCC", group = "轮廓") %>%
  24. # 复选框
  25. addLayersControl(
  26. baseGroups = c("高德", "黑底", "白底"),
  27. #显示层
  28. overlayGroups = c("圈点", "轮廓"),
  29. options = layersControlOptions(collapsed = FALSE)
  30. )
  31. map

outline 是数据生成阶段,数据长这样:

  1. long lat mag
  2. 308 124.0785 30.32667 5.294831
  3. 885 124.0496 30.20941 3.524118

数据

  • 底层阶段

amap和addProviderTiles的两个,都是底图样式(其他底图可见:leaflet-extras网站),其中的group是自定义的名称,可以自己命名。

  • 点集+区域轮廓阶段

addCircles是描绘点的,long,lat是经度、维度,stroke是点是否包边,为true很丑;group是自定义的名称,color是圈圈的颜色,颜色RGB列表

addPolygons是描绘外围的轮廓的,数据outline是通过求凸集函数chunk求得,lng和lat分别是经度维度。

  • 复选框阶段

addLayersControl加入控件组,baseGroups 是右上角的一个框,overlayGroups 是下面的数字框



延伸:chull凸集函数

其中要说一下chull求凸集函数:

  1. X <- matrix(stats::rnorm(2000), ncol = 2)
  2. hpts <- chull(X)
  3. hpts <- c(hpts, hpts[1])
  4. lines(X[hpts, ])

chull可以实现,在点集中求得凸点,然后用lines进行框选。

R+大地图时代︱ leaflet/leafletCN 动态、交互式绘制地图(遍地代码图)的更多相关文章

  1. R+先知︱Facebook大规模时序预测『真』神器——Prophet(遍地代码图)

    经统专业看到预测的packages都是很眼馋的.除了之前的forecast包,现在这个prophet功能也很强大.本packages是由机器之心报道之后,抽空在周末试玩几小时.一些基本介绍可见机器之心 ...

  2. twoway 系列命令绘制地图

    twoway 系列命令绘制地图 ❝ 在谈到用stata绘制地图时,很多人首先想到的是spmap命令.其实,最常见的twoway系列命令就可以完成我们的大多数绘图需求. 对于spmap命令的使用,在线资 ...

  3. ECharts – 大数据时代,重新定义数据图表

    ECharts 基于 Canvas 的纯 Javascript 图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算.数据视图.值域漫游等特性大大增强了用户体验,赋予了用户对 ...

  4. 大话大前端时代(一) —— Vue 与 iOS 的组件化

    序 今年大前端的概念一而再再而三的被提及,那么大前端时代究竟是什么呢?大前端这个词最早是因为在阿里内部有很多前端开发人员既写前端又写 Java 的 Velocity 模板而得来,不过现在大前端的范围已 ...

  5. 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 源码:https://github.com/duniti ...

  6. 06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 我们先看看画布的魅力: 初始画布 canvas默认是宽3 ...

  7. 大数据时代的数据存储,非关系型数据库MongoDB

    在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构. ...

  8. 移动大数据时代最IN编程语言必读书单

    移动大数据时代最IN编程语言必读书单 这是一个快速更迭,快鱼吃慢鱼的时代.从IT 时代演变成 DT 时代,再到现在的智能时代.急速革新的各种新技术.新工具.新平台,需要程序员掌握良好的编程思想和学习方 ...

  9. 大数据时代的数据存储,非关系型数据库MongoDB(一)

    原文地址:http://www.cnblogs.com/mokafamily/p/4076954.html 爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Da ...

随机推荐

  1. tomcat调优(三)

    标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.安全优化 降权启动 telnet管理端口保护 ajp连接端口保护 禁用管理端 关闭本地默认 ...

  2. 动态库Link error 一种可能

    一般出现link error都是链接时找不到对应函数. 前些天出现这种错误,我反复地检查,都发现动态库里明确的是有对应函数的. 代码里有这样一句#pragma comment(lib,"li ...

  3. mysql将查询出来的一列数据拼装成一个字符串

    使用GROUP_CONCAT函数. SELECT GROUP_CONCAT(查询的字段 separator ',') FROM table

  4. Python学习笔记(一):列表和元组

    1.列表和元组的主要区别在于:列表可以修改,元组则不能.即如果要根据要求添加元素,列表更适合,    如果出于某种原因,序列不能修改的时候,使用元组更为合适. 2.通用序列操作1)索引:正数索引时,p ...

  5. python socket单线程通信

    注意 socket通信默认的情况下是属于阻塞形式通信,在recv与accept函数会进行阻塞 1.客户端正常退出的情况下,server端的con的通道会正常的关闭,recv直接赋值为空 2.在wind ...

  6. cmd 与 bash 基础命令入门

    身为一个程序员会用命令行来进行一些简单的操作,不是显得很装逼嘛!?嘿嘿~ ヾ(>∀<) cmd 与 bash 基础命令入门       简介       CMD 基础命令          ...

  7. 【模板小程序】求小于等于N范围内的质数

    //筛法求N以内的素数(普通法+优化),N>=2 #include <iostream> #include <cmath> #include <vector> ...

  8. js短路表达式

    今天碰见个题目,感觉短路表达式很好用. 题目: 定义一个计算圆面积的函数area_of_circle(),它有两个参数: r: 表示圆的半径: pi: 表示π的值,如果不传,则默认3.14 funct ...

  9. scope_lock与lock_guard区别

    lock_guard:更加灵活的锁管理类模板,构造时是否加锁是可选的,在对象析构时如果持有锁会自动释放锁,所有权可以转移.对象生命期内允许手动加锁和释放锁. scope_lock:严格基于作用域(sc ...

  10. 在Arrays.asList()引发的问题中进一步学习集合与泛型等内容

    前言 最近在网上看到一个问题,情况类似如下(记为问题1): public class Demo { public static void main(String[] args) { System.ou ...