本文主要是介绍sf | 使用plot函数绘制地图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前面已经介绍过绘图基础包graphics
中的plot
函数是一个比较全能的函数,本篇就介绍如何使用plot
函数绘制地图。在这里,plot
是一个经过sf
改装过的函数,但除了新增几个与地图相关的参数外,与原本用法差别并不大。
首先加载sf
包,将plot(x, y, ...)
中的x
参数设置为sf对象,y
缺省就可以绘制出一张地图。sf对象主要包括下图几种类型:
如果sf对象是点要素,那么就可以调用plot
和par
函数中有关点要素的美化参数,如果是线要素亦然。下面主要介绍面要素POLYGON的绘制方法。
先加载工具包和示例数据:
library(sf)
nc = st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE)
summary(nc)
# 部分输出结果
summary(nc)
## AREA PERIMETER CNTY_ CNTY_ID NAME
## Min. :0.0420 Min. :0.999 Min. :1825 Min. :1825 Alamance : 1
## 1st Qu.:0.0910 1st Qu.:1.324 1st Qu.:1902 1st Qu.:1902 Alexander: 1
## Median :0.1205 Median :1.609 Median :1982 Median :1982 Alleghany: 1
## Mean :0.1263 Mean :1.673 Mean :1986 Mean :1986 Anson : 1
## 3rd Qu.:0.1542 3rd Qu.:1.859 3rd Qu.:2067 3rd Qu.:2067 Ashe : 1
## Max. :0.2410 Max. :3.640 Max. :2241 Max. :2241 Avery : 1
## (Other) :94
## FIPS FIPSNO CRESS_ID BIR74 SID74
## 37001 : 1 Min. :37001 Min. : 1.00 Min. : 248 Min. : 0.00
## 37003 : 1 1st Qu.:37051 1st Qu.: 25.75 1st Qu.: 1077 1st Qu.: 2.00
## 37005 : 1 Median :37100 Median : 50.50 Median : 2180 Median : 4.00
## 37007 : 1 Mean :37100 Mean : 50.50 Mean : 3300 Mean : 6.67
## 37009 : 1 3rd Qu.:37150 3rd Qu.: 75.25 3rd Qu.: 3936 3rd Qu.: 8.25
## 37011 : 1 Max. :37199 Max. :100.00 Max. :21588 Max. :44.00
## (Other):94
## NWBIR74 BIR79 SID79 NWBIR79
## Min. : 1.0 Min. : 319 Min. : 0.00 Min. : 3.0
## 1st Qu.: 190.0 1st Qu.: 1336 1st Qu.: 2.00 1st Qu.: 250.5
## Median : 697.5 Median : 2636 Median : 5.00 Median : 874.5
## Mean :1050.8 Mean : 4224 Mean : 8.36 Mean : 1352.8
## 3rd Qu.:1168.5 3rd Qu.: 4889 3rd Qu.:10.25 3rd Qu.: 1406.8
## Max. :8027.0 Max. :30757 Max. :57.00 Max. :11631.0
##
## geom
## MULTIPOLYGON :100
## epsg:4267 : 0
## +proj=long...: 0
##
##
##
##
nc
中有多个属性变量,直接使用plot(nc)
可以绘制至多10个变量的分布情况:
plot(nc)
通过调整max.plot
参数绘制全部变量的分布情况:
plot(nc, max.plot = 14)
前面也介绍过,使用st_geometry
函数可以提取对象的几何信息(sfc格式),再用plot
就可以只绘制对象的几何形状,而不进行属性填充:
plot(st_geometry(nc))
绘制单个属性变量的分布情况:
plot(nc["BIR79"])# 或者
library(tidyverse)
plot(select(nc, BIR79))
通过以下参数调整图例:
key.pos:位置,1-4分别表示下、左、上、右;
key.length:长度;
key.width:宽度。
plot(nc["BIR79"], key.pos = 4, key.length = 1, key.width = 0.1)
通过以下参数可以绘制出常见的重分类地图:
nbreaks:分类个数;
breaks:分类方法,继承自
classInt::classIntervals
函数中的style
参数,包括fixed、sd、pretty、equal、quantile、jenks、kmeans、hclust、bclust、fisher、dpih、headtails等方法,也可通过向量形式手动指定分割点;
plot(nc["BIR79"], nbreaks = 5, breaks = "quantile")
如果绘图变量是因子变量,nbreaks
和breaks
将失效:
nc$factor <- factor(round(runif(100, 1, 6)))
plot(nc["factor"], nbreaks = 5, breaks = "quantile")
尽管
nbreaks
参数设定的是5分类,但是由于factor变量是包含6个水平的因子变量,因此绘制出的地图仍然是6分类。
如果不满意默认配色,可以使用pal
参数指定颜色组:
library(RColorBrewer)
plot(nc["BIR79"], nbreaks = 5, breaks = "hclust",pal = brewer.pal(5, "OrRd"))
col
参数与pal
参数的区别:
pal
是sf
新增的参数,用在重分类时指定色卡;
col
是plot
函数自有的参数,是按对象所包含要素的行序依次给要素指定颜色,与重分类无关;两参数不能同时存在。
nc$n <- 1:100 # 行序号
plot(st_geometry(nc), col = brewer.pal(9, "Blues")[1:2],nbreaks = 5, breaks = "hclust")
text(st_coordinates(st_centroid(nc)), labels = nc$n)
从图中可以看出,行序号为奇数和偶数的分别同色,与重分类结果无关。
通过以下参数实现图层的叠加:
reset:后续图层是否重设坐标系、尺寸等绘图属性,默认为TRUE;叠加图层时需要在第一个
plot
函数中将其设置为FALSE;add:同
boxplot
等函数的add
参数。
nc2 <- dplyr::filter(nc, AREA > 0.2)
pt2 <- st_centroid(nc2)plot(nc["BIR79"], nbreaks = 5, breaks = "jenks",pal = brewer.pal(5, "OrRd"), reset = F)
plot(pt2, add = T, col = "black", pch = 16) # 添加面积超过0.2的县质心
从图中可以看出,基础绘图系统中用于设置点要素的
pch
参数仍然可以用于sf的点要素,其他参数亦然。
其他新增的参数还有:
border:地图边界颜色,设置为NA时隐藏边界;
graticule:经纬网;如果要显示经纬度数值,需要将
plot
的坐标轴显示参数axes
设置为TRUE;col_graticule:经纬网颜色;
extend:绘图范围;
logz:对属性变量对数化。
而plot
函数原有的参数仍然适用,如使用main
参数修改标题:
plot(nc["BIR79"], nbreaks = 5, breaks = "hclust",pal = brewer.pal(5, "OrRd"), border = "blue", graticule = T, axes = T,main = "北卡罗莱纳州")
本篇只介绍plot
函数绘制地图的基本用法,后续推文会介绍更精细的调整方法。
plot
函数绘制地图的缺点在于不能添加比例尺和指北针。更专业的绘制地图工具包是tmap
,后续将会重点介绍。
这篇关于sf | 使用plot函数绘制地图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!