暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

R语言绘图 | 利用tmap绘制分级色彩地图

1757
点击关注了解更多哦

前言

进行地理空间分析及可视化目前有多种软件,如ArcGIS,QGIS,Geoda等,与传统的图形用户界面(GUI)类型的软件相比,R更强调命令行界面(CUI),在结果的可重复性、外部资源的调用性方面具有较大的优势,如通过leaflet[1]包中的几行代码就可以绘制出一个全球夜间灯光的交互式地图。当前R语言中用于空间统计分析的package呈快速增加趋势,越来越多的人参与到R中地理空间分析的维护与开发,R语言空间分析在未来快速发展大数据、数据科学领域仍有较大的发展空间。

#全球夜间灯光可视化图
install.packages("leaflet")
library(leaflet)
leaflet() %>%
  addProviderTiles("NASAGIBS.ViirsEarthAtNight2012")

tmap简介

tmap[2]主要用于空间数据的可视化,tmap中提供了灵活且易于操作的方法来进行地图的创建,与ggplot2有一定相似性,可通过不同图层的叠加形式,不断修饰和完善图形。本文主要以tmap包为例绘制一个基础分级色彩地图,以及气泡图、分面图。

利用tmap进行空间可视化

准备工作。首先准备一个地区的shp底图,其实相关数据。本文演示数据为河南省shp底图,其实为河南省2014-2019年14个地级市GDP(单位:亿元),数据来源于河南省统计局(未纳入直管县)。数据如下图所示。

#     地级市   y2014   y2015   y2016   y2017    y2018    y2019
#1    郑州市 6776.99 7311.52 8113.97 9193.77 10670.14 11589.72
#2    开封市 1492.06 1605.84 1755.10 1887.55  2157.70  2364.14
#3    洛阳市 3284.57 3469.03 3820.11 4290.19  4613.49  5034.85
#4  平顶山市 1637.17 1686.01 1825.14 1994.66  2170.86  2372.64
#5    安阳市 1791.81 1872.35 2029.85 2249.85  2141.87  2229.29
#6    鹤壁市  682.20  715.65  771.79  827.65   921.18   988.69
#7    新乡市 1917.81 1975.03 2166.97 2357.76  2671.60  2918.18
#8    焦作市 1844.31 1926.08 2095.08 2280.10  2501.76  2761.11
#9    濮阳市 1253.61 1328.34 1449.56 1585.47  1442.65  1581.49
#10   许昌市 2087.23 2171.16 2377.71 2632.92  3140.93  3395.68
#11   漯河市  941.16  992.59 1081.93 1165.04  1435.90  1578.44
#12 三门峡市 1240.06 1251.04 1325.86 1447.42  1319.01  1443.82
#13   南阳市 2675.57 2866.82 3114.97 3345.30  3500.56  3814.98
#14   商丘市 1697.64 1812.16 1989.15 2195.55  2659.52  2911.20
#15   信阳市 1757.34 1879.67 2037.80 2194.51  2534.47  2758.47
#16   周口市 1989.75 2089.70 2263.86 2459.70  2939.59  3198.49
#17 驻马店市 1691.30 1807.69 1972.99 2175.04  2485.26  2742.06
#18   济源市  480.46  492.54  538.91  600.12   630.46   686.96

主要思路。分为:导入数据;合并数据;基础绘图;修改图形;参数理解;交互式地图;气泡图;其他部分

1.安装本文所需要的包

#在运行之前如果没有相关的包,需要首先进行安装
install.packages("tmap")
install.packages("rgdal")
install.packages("vioplot")
install.packages("RColorBrewer")

2.设置工作路径、加载包、读取数据

setwd("F:/地理空间分析")#修改为你的工作路径
library(tmap) #用来绘图
library(rgdal) #用来读取shp数据
library(vioplot)#用来绘制小提琴图
library(RColorBrewer)#用来修改颜色

3.读取数据

HN.Areas <- readOGR('.'"河南省_地级市", encoding = "UTF-8")#读取shp文件,"河南省_地级市"为shp文件名称
HN.GDP <- read.csv("HNGDP.csv", header = TRUE)#读取csv文件

4.查看文件并画出shp底图

names(HN.Areas)#查看列名
#[1] "Name"  "Layer"
head(HN.Areas)
#class       : SpatialPolygonsDataFrame 
#features    : 6 
#extent      : 12353941, 12802933, 3776148, 4253525  (xmin, xmax, ymin, #ymax)
#crs         : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +uni#ts=m +no_defs 
#variables   : 2
#names       :   Name, Layer 
#min values  : 济源市,    市 
#max values  : 郑州市,    市 
plot(HN.Areas)#画出shp底图

names(HN.GDP)#查看csv列名
#[1] "地级市" "y2014"  "y2015"  "y2016"  "y2017"  "y2018"  "y2019" 
head(HN.GDP)
#    地级市   y2014   y2015   y2016   y2017    y2018    y2019
#1   郑州市 6776.99 7311.52 8113.97 9193.77 10670.14 11589.72
#2   开封市 1492.06 1605.84 1755.10 1887.55  2157.70  2364.14
#3   洛阳市 3284.57 3469.03 3820.11 4290.19  4613.49  5034.85

5.对数据进行初步探索

summary(HN.GDP)#利用summary函数对数据进行初步探索
#    地级市              y2014            y2015            y2016            y2017            y2018             y2019      
# Length:18          Min.   : 480.5   Min.   : 492.5   Min.   : 538.9   Min.   : 600.1   Min.   :  630.5   Min.   :  687  
# Class :character   1st Qu.:1313.2   1st Qu.:1397.7   1st Qu.:1525.9   1st Qu.:1661.0   1st Qu.: 1617.5   1st Qu.: 1743  
# Mode  :character   Median :1727.5   Median :1842.3   Median :2009.5   Median :2195.0   Median : 2493.5   Median : 2750  
                    #Mean   :1957.8   Mean   :2069.6   Mean   :2262.8   Mean   :2493.5   Mean   : 2774.3   Mean   : 3021  
                    #3rd Qu.:1971.8   3rd Qu.:2061.0   3rd Qu.:2239.6   3rd Qu.:2434.2   3rd Qu.: 2872.6   3rd Qu.: 3128  
                    #Max.   :6777.0   Max.   :7311.5   Max.   :8114.0   Max.   :9193.8   Max.   :10670.1   Max.   :11590  

也可以利用基础图形对变量进行可视化,观察变量的分布情况,如绘制变量的箱线图与小提琴图,可进一步参考R语言绘图|多变量箱线图(boxplot)与小提琴图(vioplot)的绘制,关于RColorBrewer的使用可参考R语言绘图|如何调用RColorBrewer包对图形颜色进行修改

#绘制变量箱线图
boxplot(HN.GDP$y2014, HN.GDP$y2015, HN.GDP$y2016, HN.GDP$y2017, HN.GDP$y2018, HN.GDP$y2019,
        names = c("2014年""2015年""2016年""2017年""2018年""2019年"),
        xlab = "年份", ylab = "GDP(亿元)",
        col = brewer.pal(6,"Blues"))
#绘制变量条形图
vioplot(HN.GDP$y2014, HN.GDP$y2015, HN.GDP$y2016, HN.GDP$y2017, HN.GDP$y2018, HN.GDP$y2019,
        names = c("2014年""2015年""2016年""2017年""2018年""2019年"),
        xlab = "年份", ylab = "GDP(亿元)",
        col = brewer.pal(6,"YlGnBu"))

5.利用tmap进行分级色彩地图绘制

5.1首先,需要将csv文件与shp文件进行链接

map.data <- merge(HN.Areas, HN.GDP, by.x = "Name" ,by.y = "地级市")#合并数据,其中x,y分别为两个合并文件所依据的字段
names(map.data)#查看合并后的数据
#[1] "Name"  "Layer" "y2014" "y2015" "y2016" "y2017" "y2018" "y2019"
head(map.data)#查看合并后的数据
#class       : SpatialPolygonsDataFrame 
#features    : 6 
#extent      : 12353941, 12802933, 3776148, 4253525  (xmin, xmax, ymin, ymax)
#crs         : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs 
#variables   : 8
#names       :   Name, Layer,   y2014,   y2015,   y2016,   y2017,    y2018,    y2019 
#min values  : 济源市,    市,  480.46,  492.54,  538.91,  600.12,   630.46,   686.96 
#max values  : 郑州市,    市, 6776.99, 7311.52, 8113.97, 9193.77, 10670.14, 11589.72 

5.2其次,使用qtm进行简单绘图,如下图所示。

qtm(map.data, fill = "y2014")#其中qtm第一个参数为合并为的数据,第二个参数为填充数据

可以发现该图缺少必要的元素,如指北针、比例尺、标题等。因此下面对图形进行修饰,对图例、颜色、分段、比例尺、指北针等进行调整。

tm_shape(map.data) + tm_fill("y2014",#填充变量
                         palette = "YlOrRd"#设置颜色
                         alpha = 0.8,#设置alpha数值
                         title = "GDP of 2014",#图例标题
                         style = "jenks", n = 6, #分类方法
                         legend.hist = FALSE) + #直方图是否显示
  tm_borders(col = "black", lwd = 1, alpha = 1) + #边界颜色、宽度、以及alpha
  tm_compass(type = "arrow"#指北针类型
             text.size = 1.2,#指北针大小
             position=c("right""top")) + #指北针位置
  tm_scale_bar(position=c("0.3""0.001"),text.size = 1) + #比例尺位置、大小
  tm_text("Name", size = 1.2) + #显示图层名称及字体大小
  tm_layout(title = "河南省2014年GDP"#图标题
            title.position=c("center""top"),#图标题位置
            title.fontfamily = "serif",#字体
            legend.text.size = 1, #图例文本大小
            legend.text.fontfamily = "serif",#图例字体
            legend.title.size = 1.5, #图例标题大小
            legend.title.fontfamily = "serif",#图例标题字体
            legend.position = c("left""bottom"), #图例的位置
            frame = FALSE)
#相关参数解读:
#tm_shape函数:图层文件
#tm_fill函数:对图层进行填充
#tm_borders函数:图层边界函数
#tm_compass函数:指北针图层函数
#tm_scale_bar函数:比例尺图层函数
#tm_text函数:图层名称
#tm_layout函数:布局函数

5.3 此外,也可以对palette和style进行调整,更改分类的颜色及分类的标准,如使用cat分类方法

#palette = "YlOrRd", 
#style = "jenks", n = 6
style = "cat"
palette = "YlGnBu"

5.4分面地图绘制。分面地图绘制与上文部分地图绘制形式基本相同,需要添加一个用于分面的图层,即使用tm_facets函数,其中制定根据Name变量进行分面,nrow表示分为6行。

tm_shape(map.data) + tm_fill("y2014",
                         palette = "YlOrRd"
                         alpha = 0.8,
                         title = "GDP of 2019",
                         style = "jenks", n = 6,
                         legend.hist = FALSE) + 
  tm_borders(col = "black", lwd = 1, alpha = 1) + 
  tm_facets(by = "Name", nrow = 6,scale.factor = 10) + 
  tm_layout(legend.text.size = 1,        
            legend.title.size = 1, 
            legend.position = c("0.1""0.4"), 
            frame = FALSE)
#tm_facets()中,by分面所依据的变量,brow分面的行数,scale.factor对分面的标题大小进行设置

此外,也可以参照上文部分对分类方式进行修改

#palette = "YlOrRd", 
#style = "jenks", n = 6
style = "cat"
palette = "YlGnBu"

5.5 交互式地图

library(leaflet)
tmap_mode("view")#Interactive maps。运行该行代码后,再进行绘图则为交互式地图
tmap_mode("plot")# tmap mode set to plotting。运行该行代码则返回之前的地图形式
#交互式地图示例如下,可以自由放大与缩小,同时选择不同的图层


气泡图.函数为tm_bubbles(),函数内可以对size,colour,alpha等进行设置。

tm_shape(map.data) + 
  tm_fill(col = "#FFFFCC") + 
  tm_bubbles(size = "y2014", scale = 3, alpha = 0.7,
             border.col = "black", border.alpha = 1) + 
  tm_borders(col = "black", lwd = 1, alpha = 1) + 
  tm_compass(type = "arrow"
             text.size = 1.4,
             position=c("right""top")) + 
  tm_scale_bar(position=c("0.6""0.001"),text.size = 1) + 
  tm_text("Name", size = 1.2) + 
  tm_layout(title = "河南省2014年GDP"
            title.position=c("center""top"),
            title.fontfamily = "serif",
            legend.text.size = 0.8, 
            legend.text.fontfamily = "serif",
            legend.title.size = 1.5, 
            legend.title.fontfamily = "serif",
            legend.position = c("left""bottom"),
            frame = FALSE)
##tm_bubbles为气泡图图层,其中size表示气泡大小的衡量变量,scale表示气泡实际大小,border调整气泡的边界。

本文主要参考tmap官方文档。此外,tmap内置相关参数设置多达上百条,能够对所绘制的地图进行修饰与完善。后续会继续更新tmap相关绘图参数调整以及绘图示例展示。如需要本文的shp地图数据及统计数据请后台回复【20211227】获得。

参考资料

[1]

Geocomputation with R: https://geocompr.robinlovelace.net/intro.html

[2]

tmap:Reference manual: https://cran.r-project.org/web/packages/tmap/tmap.pdf




文章转载自日常分享的小懒猫,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论