简介
赵小编之前介绍过完整中国,及区域地图的画法。如:使用 ggplot2 绘制单个和多个省份地图;R 语言绘制十段线地图,给特定省份填色;今天小编将介绍如何比较各个省份及其区县的详细数据,本文参考《R 语言数据可视化之美》[1]。
导入 R 包
安装并加载所需的 R 包:
library(rgdal) library(ggplot2) library(dplyr) library(grid) library(RColorBrewer)
数据处理
这里需要用到包含县级信息的 BOUNT_poly.shp
文件,并利用 readOGR()
函数来读取。
该文件可以在 GitHub[2] 中可以下载。
dataProjected <- readOGR("China_adm_shp/bou4_4m/BOUNT_poly.shp") dataProjected@data$id <- rownames(dataProjected@data)
利用fortify()
函数将对象转化为数据框形式,以便后续使用。
watershedPoints <- fortify(dataProjected) df_China4 <- merge(watershedPoints, dataProjected@data, by = "id")
字段 ADCODE99
是行政区域代码,前两位表示所属的省。利用 substr()
函数将其取出,并存储在 province 变量中。
df_China4$province<-substr(as.character(df_China4$ADCODE99),1,2)
各县级的实际数据,由于没有真实数据,本文采用了随机数。读者可以使用自己的数据进行替换。数据形式如下:
##字段 NAME99 是各个县的中文名。 mydata<-data.frame(NAME99=unique(df_China4$NAME99), value=round(runif(length(unique(df_China4$NAME99)),0,10))) df_China<-full_join(df_China4,mydata)
由于 df_China$province
保存的是各省份的编号,为了更直观地展示信息,将各编号替换为省份名称。
# ProCode文件包含省份编号和名称 ProCode <- read.csv("PcCode.csv") ProCode$ID<-as.character(ProCode$ID) for (i in 1:nrow(ProCode)){ df_China$province<- gsub(pattern = ProCode$ID[i], x = df_China$province,replacement =ProCode$PcCode[i]) } df_China$province<-factor(df_China$province,levels=as.character(ProCode$PcCode))
图形绘制
使用 ggplot
及facet_wrap()
分面函数来完成图形绘制。
df_China <- na.omit(df_China) ggplot(df_China, aes(x = long, y = lat,group=group,fill=value)) + geom_polygon(colour="black",size=0.1) + scale_fill_gradientn(colours=brewer.pal(9,"Spectral")) + facet_wrap(~province, ncol = 7,scales="free",strip.position = "top")+ coord_cartesian()+ theme_void()+ theme(strip.background = element_rect(color="grey60",size=0.25), panel.background = element_rect(fill=NA,color="grey60",size=0.25))
由于南海地区维度跨度太大,不便于数据展示,可对其进行调整。添加下列语句:
df_China<-df_China[df_China$NAME99!='南沙群岛' & df_China$NAME99!='西沙群岛' & df_China$NAME99!='中沙群岛' & df_China$NAME99!='中沙群岛的岛礁及其海域', ] ggplot(df_China, aes(x = long, y = lat,group=group,fill=value)) + geom_polygon(colour="black",size=0.1) + scale_fill_gradientn(colours=brewer.pal(9,"Spectral")) + facet_wrap(~province, ncol = 7,scales="free",strip.position = "top")+ coord_cartesian()+ theme_void()+ theme(strip.background = element_rect(color="grey60",size=0.25), panel.background = element_rect(fill=NA,color="grey60",size=0.25))
如果只想展示部分省份,可以添加下列语句:
df_China <- df_China[df_China$province == c('上海市','浙江省','江苏省','安徽省') ,] ggplot(df_China, aes(x = long, y = lat,group=group,fill=value)) + geom_polygon(colour="black",size=0.1) + scale_fill_gradientn(colours=brewer.pal(9,"Spectral")) + facet_wrap(~province, ncol = 7,scales="free",strip.position = "top")+ coord_cartesian()+ theme_void()+ theme(strip.background = element_rect(color="grey60",size=0.25), panel.background = element_rect(fill=NA,color="grey60",size=0.25))
参考资料
[1]
《R 语言数据可视化之美》: https://github.com/EasyChart/Beautiful-Visualization-with-R
[2]