空间数据可视化与 R 语言(上篇)

您所在的位置:网站首页 全球矢量数据分析 空间数据可视化与 R 语言(上篇)

空间数据可视化与 R 语言(上篇)

2024-05-20 23:47:40| 来源: 网络整理| 查看: 265

1 概览 2 空间数据 2.1 示例:美国旧金山犯罪数据 2.2 示例:美国人口普查统计数据 2.3 示例:美国锡安公园地形数据 3 可视化包 3.1 echarts4r 3.2 leaflet 3.3 plotly 3.4 lattice 4 数据结构 4.1 矢量数据 sp 4.2 矢量数据 sf 5 数据操作 5.1 一般数据操作 5.2 空间数据操作 6 案例:美国北卡婴儿猝死综合征数据 6.1 ggplot2 & sf 6.2 leaflet & mapdeck 6.3 sp::spplot 6.4 latticeExtra::mapplot 7 总结归纳 8 未来展望 9 环境信息 10 参考文献

本文引用的所有信息均为公开信息,仅代表作者本人观点,与就职单位无关。

1 概览

本文首先以实际示例介绍三类典型的空间数据,希望读者能对不同类型的空间数据的特点和使用场景有个简单印象。紧接着,介绍各类地理空间数据的可视化方法及 R 包实现,笔者从个人经验出发详细介绍了4个,相信足够让读者应付大部分使用场景。之后,再介绍 R 语言中的空间数据类型及其基本操作,空间数据操作是基本功,也是比较难的,没放在空间数据可视化前面是怕吓跑了一些读者,笔者所知也十分有限,也怕写不好。再基于一个真实数据用不同的 R 包实现类似的可视化效果,是几代空间数据可视化方法的并列介绍,最后是一些心得、总结和展望。

本文有几个写作意图:

如何用 R 语言调用各类地图服务实现各类空间数据的各种可视化方法。 以丰富的实例数据和图形展示各类空间数据,帮助读者建立直觉。 对比多个可视化 R 包,提供丰富的效果图,帮助读者选择合适的可视化图形。 希望在这个颜值走遍天下的时代,能吸引更多的人入坑 R 语言,并感受 R 语言在数据可视化领域的魅力。 2 空间数据

空间数据基本类型有点、线、面(或称多边形)等,还分矢量数据和栅格数据,地理可视化的展示形式有气泡图、热力图、瓦片图、地形图等。下面通过几个实际的空间数据,以图形的展示方式以期帮助读者建立数据直觉,陆续使用 lattice [1]、ggplot2 [2]和 leaflet [3] 来绘制静态和交互图形。

2.1 示例:美国旧金山犯罪数据

下面以 RgoogleMaps 包内置的数据集 incidents 为例介绍空间点数据,并作一些简单的分析。

library(RgoogleMaps) # 加载 incidents data(incidents) # 查看数据 head(incidents) # IncidntNum Category Descript DayOfWeek # 67026 120621114 ASSAULT STALKING Saturday # 34773 120328627 OTHER OFFENSES FAILURE TO HEED RED LIGHT AND SIREN Wednesday # 113571 120653593 NON-CRIMINAL AIDED CASE, MENTAL DISTURBED Friday # 35951 120333927 LARCENY/THEFT PETTY THEFT FROM A BUILDING Friday # 102975 120963370 OTHER OFFENSES DRIVERS LICENSE, SUSPENDED OR REVOKED Thursday # 35201 120338701 DISORDERLY CONDUCT MAINTAINING A PUBLIC NUISANCE Sunday # Date Time PdDistrict Resolution Location lon # 67026 2012-07-21 00:01 PARK NONE MCALLISTER ST / BRODERICK ST -122.4 # 34773 2012-04-25 17:29 MISSION NONE 16TH ST / BRYANT ST -122.4 # 113571 2012-08-17 09:50 SOUTHERN PSYCHOPATHIC CASE 1200 Block of MARKET ST -122.4 # 35951 2012-04-27 11:30 PARK NONE 1000 Block of HAYES ST -122.4 # 102975 2012-11-29 07:00 BAYVIEW ARREST, CITED BAY SHORE BL / AUGUSTA ST -122.4 # 35201 2012-04-29 00:23 MISSION ARREST, BOOKED 400 Block of CAPP ST -122.4 # lat violent HrOfDay TimeOfDay HourOfWeek censusBlock # 67026 37.78 TRUE 00 0.01667 24.017 06075015802 # 34773 37.77 FALSE 17 17.48333 137.483 06075017700 # 113571 37.78 FALSE 09 9.83333 9.833 06075017601 # 35951 37.78 FALSE 11 11.50000 11.500 06075016400 # 102975 37.73 FALSE 07 7.00000 151.000 06075025702 # 35201 37.76 FALSE 00 0.38333 48.383 06075020800

数据集 incidents 来自 2012 年旧金山的犯罪数据,更多数据见 DataSF 项目,一些数据分析见 Github 项目。数据集 incidents 随机抽取了 5000 行,16个观测变量,分别是犯罪数目 IncidntNum、犯罪类型 Category、犯罪行为描述 Descript、犯罪行为发生在周几 DayOfWeek、犯罪行为发生的日期 Date、犯罪行为发生的时间(hh::mm)Time、警局辖区 PdDistrict、警方处置方式 Resolution、位置 Location、经度 lon、纬度 lat、是否属于暴力行为 violent、发生时间(小时,以2位整数计) HrOfDay、发生时间(小时,以10进制计)TimeOfDay、发生时间(一周168个小时,0-168之间的数字)HourOfWeek、人口普查的区块标记 censusBlock。图2.1展示警方出警地点,或者说犯罪行为发生地点,红点表示此处发生暴力冲突,黑点表示此处没有暴力冲突。

plotmap( lat = lat, lon = lon, data = incidents, col = 'violent', zoom = 12, pch = 20, cex = 0.5, API = "google", apiKey = Sys.getenv("GGMAP_GOOGLE_API_KEY") )

图 2.1: 2012 年旧金山警方出警地点的空间分布

除了 RgoogleMaps 提供的 plotmap() 函数,当然,还可以用 leaflet 来绘制交互式的散点图,因为交互,可以放入更多的信息。如图2.2,鼠标悬浮在散点上可以看到事件发生的警区 PdDistrict,点击可以看到警方的处置方式 Resolution,这是设置 addCircles() 的参数 label 和 popup 实现的,实际上,它们还可以放入更加丰富的信息。

library(leaflet) # 分类变量映射成颜色 colorize_factor setView(lng = -122.4, lat = 37.77, zoom = 13) |> addCircles( data = incidents, popup = ~Resolution, radius = 30, label = ~PdDistrict, lng = ~lon, lat = ~lat, color = ~color ) |> addLegend("topright", pal = colorFactor( palette = "plasma", domain = unique(incidents$Resolution) ), values = incidents$Resolution, opacity = 1)

图 2.2: 2012 年旧金山警方出警地点的空间分布

接下来再细致一点地探索 incidents 数据集,各个警区出警次数的分布情况,

library(data.table) incidents e_title( text = "斐济地震带", subtext = "斐济是南太平洋上的一个岛国", left = "center", sublink = "https://echarts4r.john-coene.com/" ) |> e_legend(show = FALSE) |> # 隐藏图例 e_theme(name = "chalk")

图 3.2: echarts4r 使用内置矢量地图数据

下面介绍在瓦片地图数据的基础上展示 quakes 数据,如图3.3 所示,这里采用地理图层 e_leaflet() 调用开放的 OpenStreetMap 瓦片服务。

# OSM quakes |> e_charts(long) |> e_leaflet(center = c(175, -20), zoom = 4) |> e_leaflet_tile() |> e_scatter(lat, size = mag, coord_system = "leaflet")

图 3.3: echarts4r 使用 OpenStreetMap 地图

只要提供瓦片地图服务的模版,就可以切换地图底图数据,图3.4使用了谷歌的地图服务。

# 谷歌地图 quakes |> e_charts(long) |> e_leaflet(center = c(175, -20), zoom = 4) |> e_leaflet_tile( template = "http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}&s=Galil", options = list(tileSize = 256, minZoom = 3, maxZoom = 17) ) |> e_scatter(lat, size = mag, coord_system = "leaflet")

图 3.4: echarts4r 使用谷歌地图

类似谷歌的要求,使用 Mapbox 地图服务也需要先申请个人访问令牌,申请下来后,也把它设置到 R 语言环境变量里 MAPBOX_TOKEN,以便后续使用。

# MAPBOX 地图 quakes |> e_charts(long) |> e_mapbox( # MAPBOX 的访问令牌 token = Sys.getenv("MAPBOX_TOKEN"), # 地图风格样式 style = "mapbox://styles/mapbox/dark-v9", # 视角:地图中心 center = c(175, -20), # 缩放等级 zoom = 4 ) |> e_scatter_3d(lat, mag, coord_system = "mapbox") |> e_visual_map(mag)

图 3.5: echarts4r 使用 MAPBOX 地图

在国内,最好使用百度、高德这样的国家认可的地图服务提供商,这也很容易,只需用高德的 tile 服务数据替换 OSM 的。

# 高德地图 quakes |> e_charts(long) |> e_leaflet(center = c(175, -20), zoom = 4) |> e_leaflet_tile( template = "https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}", options = list(tileSize = 256, minZoom = 3, maxZoom = 17) ) |> e_scatter(lat, size = mag, coord_system = "leaflet")

图 3.6: echarts4r 使用高德地图

另外,袁凡整理的材料 — echarts4r: 从入门到应用,详细介绍了如何用 echarts4r 绘制各种各样的常用图形,如何引入外部地图数据制图,文章完全基于用 R Markdown 编译,图文并茂,内容可重复。苏玮制作的 日本新冠疫情看板 也大量使用 echarts4r,可见 echarts4r 能力之强,此看板适合比较高阶的 R 语言读者学习,地理可视化的定制化程度比较高。

百度、阿里、腾讯等公司都提供大量面向不同场景的地图服务,一些软件也内置了地图,如tableau、GRASS GIS 和QGIS等,下图3.7 展示 QGIS 软件使用在线的 OpenStreetMap 地图。

图 3.7: QGIS 软件内的 OpenStreetMap 地图

3.2 leaflet

leaflet [3] 包借助 htmlwidgets 封装了鼎鼎大名的开源交互式可视化地图库 leaflet。注意,leaflet 只是一个渲染 GIS 数据的可视化库,并不提供 GIS 数据服务。类似的可视化库还有OpenLayers,及其 R 接口openlayers,另一个紧密相关的空间数据处理工具是GeoServer,它遵循 Open Geospatial Consortium (OGC) Web Feature Service (WFS) 和 Web Coverage Service (WCS) 标准,支持各种 GIS 数据源。

在可视化的过程中,配色是非常重要的一个环节,准确地表达地图上各个区域或位置的数据信息,负责体现分类、层次、大小等信息。常见的操作是将一组数据映射成一组颜色值,还是以 quakes 数据集为例,下面将连续型的地震震级数据映射成一组颜色值。这方面的工作已经有非常成熟的 R 包来做了,比如scales包和colourvalues 包。如图 3.8,默认情况下 viridis 调色板,颜色越黄值越大。

# 将连续型数据向量转化为颜色向量 colorize_numeric # 添加带颜色的散点图 addCircles(lng = ~long, lat = ~lat, color = ~ pal(mag), label = ~popup_text) |> # 在右下角添加图例 addLegend("bottomright", pal = pal, values = ~mag, title = "地震震级") |> # 在左下角添加地图比例尺 addScaleBar(position = c("bottomleft"))

图 3.10: 散点图

leaflet.extras 提供绘制热力图的扩展,另一个与之类似的包是leaflet.extras2 包,前者虽已停止开发了,但是目前看来还可以用。

# 提供 addHeatmap 函数绘制热力图 library(leaflet.extras) leaflet(quakes) |> addProviderTiles(providers$CartoDB.Positron) |> addCircles(lng = ~long, lat = ~lat, color = ~ pal(mag), label = ~popup_text) |> setView(178, -25, 5) |> addHeatmap( lng = ~long, lat = ~lat, intensity = ~mag, blur = 20, max = 0.05, radius = 15 ) |> addLegend("bottomright", pal = pal, values = ~mag, title = "地震震级") |> addScaleBar(position = "bottomleft")

绘制热力图就这么简单,如图 3.11 所示,在图3.10的基础上添加了热力图,实际上就是根据点的密度添加色彩,密度值根据核密度估计算法统计出来。

图 3.11: 热力图

3.3 plotly

plotly [5] 包在地理可视化方面提供散点图 scattergeo 和等值图 choropleth 两种基础类型。plotly 还为 mapbox 地图服务添加三个专门的绘图函数,分别是散点图scattermapbox、等值图choroplethmapbox和热力图densitymapbox。

plotly::plot_mapbox( data = quakes, colors = "Spectral", lon = ~long, lat = ~lat, color = ~mag, type = "scattermapbox", mode = "markers", marker = list(size = 10, opacity = 0.5) ) |> plotly::layout( title = "斐济地震带", # mapbox 地图设置 https://plotly.com/r/reference/layout/mapbox/ mapbox = list( # style = 'dark', # 暗黑主题 zoom = 4, # 缩放级别 center = list(lat = -20, lon = 175) ) ) |> plotly::colorbar(title = "震级") |> plotly::config( mapboxAccessToken = Sys.getenv("MAPBOX_TOKEN"), displayModeBar = FALSE )

图 3.12: plotly 包使用 Mapbox 地图

接下来介绍布局设置,以 layout(mapbox = ...) 内的 style 参数为例, 它是用来设置地图风格样式的,除了默认的参数值 basic,还可以设置为夜晚暗黑 dark,卫星地图 satellite 等。若设置open-street-map,调 OpenStreetMap 服务,则无需 MAPBOX_TOKEN,具体哪些用到 MAPBOX_TOKEN 哪些不需要用到 MAPBOX_TOKEN,读者可以根据需要选择,详见mapbox-layers 文档,其他参数设置见mapbox 文档。

图 3.13: plotly 包使用 Mapbox 卫星地图

plotly::plot_ly( data = quakes, type = "densitymapbox", lat = ~lat, lon = ~long, coloraxis = "coloraxis", radius = 10 ) |> plotly::layout( mapbox = list( style = "stamen-terrain", zoom = 4, center = list(lat = -25, lon = 178) ), coloraxis = list(colorscale = "Viridis") ) |> plotly::config(displayModeBar = FALSE)

图 3.14: plotly 包使用 Mapbox 绘制热力图

plotly 包内置了两个地图数据集,一个是美国州级多边形数据"USA-states",另一个是国家级多边形数据,来自 Natural Earth,需要3个字母的国家代码传给参数 locations。

dat plotly::colorbar(title = "人口") |> plotly::layout( geo = list(scope = "usa"), title = "1974年美国各州的人口" ) |> plotly::config(displayModeBar = FALSE)

图 3.15: plotly 包使用 Mapbox 绘制面量图

多边形矢量地图数据,多边形的边界常常是行政区域,choropleth 地图是填充颜色的多边形,颜色深浅表示数据指标,地图的作用在于展示指标的空间变化,在美国,郡县一级的行政区大致相当于咱们市一级行政单位,比如图3.16 展示美国各个县的失业率,大城市失业率相对较高。值得注意,数据量较大的时plotly渲染速度较慢。

# 示例修改自 https://plotly.com/r/choropleth-maps/ library(plotly) # 数据集来自 https://github.com/plotly/datasets # 下载保存至本地目录 data_dir


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭