空间数据可视化
空间对象数据可视化
空间数据处理与分析过程中,一个主要的特点就是对空间对象进行可视化,制作精美的地图图件,本节介绍了空间可视化方法。
- 加载包和数据
空间数据可视化
#example
library(maptools)
require(rgeos)
LN.bou <- readShapePoly("LondonBorough",verbose = T,proj4string = CRS("+init=epsg:27700"))
- 通过制作一个单独的伦敦市行政边界,与原有的LondonBrough数据进行叠加显示,并修改配色方案和轮廓线宽度
#融合边界
LN.outline <- gUnaryUnion(LN.bou,id=NULL)
#配色方案设置
plot(LN.bou,col="red",bg="skyblue",lty=2,border="blue")
#叠加边界图层
plot(LN.outline,lwd=3,add=T)
#添加标题
title(main = "The boroughs od London",font.main=2,cex.main=1.5)
- 函数包maptools中提供了函数pointLabel、mapscale和north.arrow,分别用于在图件中添加文字标注、比例尺和指南针,以下代码可在之前图件中添加对应制图元素
##添加制图元素
library(maptools)
library(GISTools)
plot(LN.bou,col="white",lty=2,border="blue")
plot(LN.outline,lwd=3,add=T)
coords <- coordinates(LN.bou) pointLabel(coords[,1],coords[,2],LN.bou@data[,"NAME"],doPlot = T,cex = 0.5)
map.scale(511000,159850,miles2ft(2),"Miles",4,0.5) north.arrow(561000,197000,miles2ft(0.25),col="lightblue")
title(main = "The Map of London",font.main=2,cex.main=1.5)
- 对图层叠加显示,制作个性化地图
#加载伦敦房价数据和路网数据
LNNTa <- readShapeLines("LNNTa",verbose = TRUE,proj4string = CRS("+init=epsg:27700"))
LNHP <- readShapePoints("LNHP",verbose = TRUE,proj4string = CRS("+init=epsg:27700"))
#对伦敦市行政区划数据、路网数据和房价数据叠加显示,制作个性化地图 plot(LN.bou,col="white",lty=1,lwd=2,border="grey40")
plot(LN.outline,lwd=3,add=T)
plot(LNHP,pch=16,col="red",cex=0.5,add=T)
plot(LNNTa,col="blue",lty=2,lwd=1.5,add=T)
map.scale(508000,159850,miles2ft(2),"Miles",4,0.5)
north.arrow(561000,197000,miles2ft(0.25),col="lightblue")
title(main = "The Map of London",font.main=2,cex.main=1.5)
- 栅格数据可视化
栅格数据可视化
library(raster)
LN.lat <- raster(nrow=30,ncol=60,ex=extent(LN.bou))
LN.lat <- rasterize(LN.bou,LN.lat,"NAME")
LN.gr <- as(LN.lat,"SpatialGridDataFrame")
LN.p <- as(LN.lat,"SpatialPixelsDataFrame")
image(LN.gr,col=brewer.pal(7,"YlOrRd"))
map.scale(508000,159850,miles2ft(2),"Miles",4,0.5)
north.arrow(561000,197000,miles2ft(0.25),col="lightblue")
title(main = "栅格数据可视化示例",font.main=2,cex.main=1.5)
其栅格数据单元对应关系如下:
空间属性数据可视化
- 针对伦敦市房价数据LNHP中的FLOORSZ属性(房屋面积),通过点的大小表现其对应的面积大小,并采用legend函数对代表面积分别50、100、150、200、250平方米的点大小进行了标注说明。
####空间属性数据可视化
#绘制LNHP数据的FLOORSZ属性值
plot(LN.bou,col="white",lty=2,lwd=1,border="grey40")
plot(LN.outline,lwd=3,add=T)
plot(LNHP,pch=1,col="red",cex=LNHP@data$FLOORSZ/100,add=T)
legVals <- c(50,100,150,200,250)
legend("bottomright",legend = legVals,pch = 1,col = "red",
pt.cex = legVals/100,title = "Floor size")
map.scale(508000,159850,miles2ft(2),"Miles",4,0.5)
north.arrow(561000,197000,miles2ft(0.25),col="lightblue")
title(main = "基础plot函数绘制LNHP数据的FLOORSZ属性值",font.main=2,cex.main=1)
- 函数包sp提供了可视化函数spplot,利用颜色对不同区间的空间属性值进行区分
#ssplot函数绘制LNHP数据的FLOORSZ属性值
library(sp)
mypalette <- brewer.pal(6,"Reds")
spplot(LNHP,"FLOORSZ",key.space="right",pch=16,cex=LNHP$FLOORSZ/100,
col.regions=mypalette,cuts=6)
- 在同时赋值多项属性时,函数spplot可自动在同一个绘制媒介对象中绘制对应属性项,如图绘制了不同房屋类型属性(“TYPEDETCH”,“TPSEMIDTCH”,“TYPEBNGLW”,“TYPETRRD”),每一项属性值为0或1,1代表当前数据点为对应类型的房屋
##spplot函数同时绘制LNHP数据的多个属性值
mypalette <- brewer.pal(3,"Reds")
spplot(LNHP,c("TYPEDETCH","TPSEMIDTCH","TYPEBNGLW","TYPETRRD"),key.space="right",pch=16,
col.regions=mypalette,cex=0.5,cuts=2)
- 在使用函数spplot绘制专题图时,可通过sp.layout添加制图要素,如指南针、比例尺,以及其他需要显示的图层要素
#利用参数sp.layout添加制图要素
mypalette <- brewer.pal(6,"YlOrRd")
map.na <- list("SpatialPolygonsRescale",layout.north.arrow(),offset = c(556000,195000),
scale = 4000, col=1)
map.scale.1 <- list("SpatialPolygonsRescale",layout.scale.bar(),offset = c(511000,158000),
scale=5000,col=1,fill=c("transparent","green"))
map.scale.2 <- list("sp.text",c(511000,157000),"0",cex=0.8,col=1)
map.scale.3 <- list("sp.text",c(517000,157000),"5km",cex=0.9,col=1)
LN_bou <- list("sp.polygons",LN.bou)
map.layout <- list(LN_bou,map.na,map.scale.1,map.scale.2,map.scale.3)
spplot(LNHP,"FLOORSZ",key.space="right",pch=16,col.regions=mypalette,cuts=6,sp.layout=map.layout)
- 在函数包GISTools中,提供了函数choropleth,专门用于多边形数据对象的专题图制作,结合auto.shading函数用来定义值域区间划分和对应颜色,choro.legend函数用来绘制对应的图例
#choropleth函数制作专题图
library(rgeos)
LN.bou$AREA <- gArea(LN.bou,byid = T)/(1e+6)
shades <- auto.shading(LN.bou$AREA)
choropleth(LN.bou,LN.bou$AREA)
choro.legend(551000,172000,shades)
map.scale(511000,158550,miles2ft(2),"Miles",4,0.5)
north.arrow(561000,196000,miles2ft(0.25),col="darkred")