有不少人,在试着运用R语言去绘制疫情地图之际,碰到了报错方面的问题,而这一般是源于将处置连续型数据以及离散型数据的两套不一样的绘图代码给搞混了。
数据处理的关键区别
在处理地理数据之际,连续型变量与离散型变量得采用不一样的映射方法。连续型数据,像具体的感染人数那般,通常对应着渐变的色彩填充。离散型数据,比如风险等级划分,却是对应块状分明的色块。要是运用相同的变量名去存储这两种类型的数据,那么在R的工作环境里就会产生冲突,致使后续绘图代码没法正确执行。
存在一种解决该问题的直接办法,那便是对当下的R工作环境予以彻底清理。于RStudio里,你能够借助点击“Session”菜单项下的“Clear Workspace”选项来达成前述目的,或者更为简便之举则是直接重启RStudio。要保证在启动全新的绘图流程之前,环境为全然干净的状态,之后仅运行针对当前数据类型的那相应的一套代码。
地图数据的来源与准备
官方的GIS形状文件是绘制中国地图的基础,常用的文件有bou1_4m.shp到bou4_4m.shp,它们分别对应国家、省级、市级以及县级四级行政区划的边界数据,文件名里的“4m”指的是其比例尺为四百万分之一,这些原始数据要经过处理才能够方便地在R语言中使用。
remotes::install_github("GuangchuangYu/nCov2019") # 需先安装remotes包
这些数据被开发者进行预处理,目的是简化流程,举例来说,省级地图数据bou2_4m.shp与南海地区补充数据整合一处保存成名为“ProvinceMapDatas.Rda”的R数据文件,该文件对省份名称做了标准化处理,利于与你的业务数据匹配,你能经由提供的网盘链接直接下载使用。
library(nCov2019)
x <- get_nCov2019() # 获取最新(当前)完整数据
sheng_data <- x[] # 分省数据
head(sheng_data)
省级连续数据地图绘制
先以绘制全国疫情分布图为例子,首先要获得最新的疫情数据,能够运用R包“nCov2019”去获取实时或者历史的确诊病例数据,此包是由开发者GuangchuangYu进行维护的,能够返回结构清晰的分省统计数据。
load("ProvinceMapDatas.Rda")
绘图之际,予以加载预先处理好的省级地图R数据文件,随后,把疫情数据里的省份名号与地图数据之中的省份名号予以精准匹配并合并,合并之后的数据框便涵盖了各个省份的几何边界讯息以及对应的疫情数值,此后便可运用ggplot2包的几何对象开展连续色彩的填充绘制。
省级离散数据地图绘制
library(tidyverse)
df_China <- df_China %>%
left_join(sheng_data, by=c("NAME"="name"))
names(df_China)[16] <- "确诊数"
library(RColorBrewer)
ggplot() +
geom_polygon(data=df_China,
aes(x=long, y=lat, group=interaction(class, group),
fill=`确诊数`), colour="black", size=0.25) +
# 中国地图, 包括中国主体部分和长方形方块内的南海诸岛数据
geom_rect(aes(xmin=124, xmax=124+9.3, ymin=16-0.3, ymax=16+9),
fill=NA, colour="black", size=0.25) +
# 绘制长方形方框
geom_line(data=df_NanHaiLine, aes(x=long, y=lat, group=ID),
colour="black", size=1) +
# 绘制长方形方框内的中国南海八段线
scale_fill_gradientn(colours=colorRampPalette(rev(brewer.pal(11,'Spectral')))(32)) +
coord_map() +
ylim(14, 54) +
labs(x="经度", y="纬度") +
ggtitle("全国最新疫情地图") +
theme(
plot.title=element_text(hjust=0.5),
legend.position = c(0.1,0.2),
legend.background = element_blank()
)
有时,我们有这样的需求,需要把连续数据转化成离散类别来进行展示,举例来说,像是把确诊人数划分成“低”、“中”、“高”风险区这种情况。这借助R基础的那个cut()函数是能够达成的,它具备这样的能力,可以把连续的数值向量分割成为指定的区间。
处在数据处理的阶段之时,同样是需要先去载入省级地图数据的,并且要把它跟疫情数据按照省份名称来进行合并。最为关键的其中一步是,在合并操作结束之后,针对表示疫情数值所对应的列来应用cut()函数,以此把它转变为因子类型的离散变量。在后续的绘图代码当中,色彩映射将会是基于这个最新的离散型变量的,进而能够生成具备清晰分界的地图。
ggsave("全国最新疫情数据.jpg")
市级数据地图的绘制方法
df <- data.frame(sheng_data$name,
cut(sheng_data$confirm, c(0,10,100,500,1000,20000),
labels=c("1~9","10~99","100~500","500~999","≥1000"),
include.lowest=TRUE, right=FALSE))
head(df)
市级地图绘制的原理,和省级是完全一样的,只是所运用的底图数据,粒度更为精细。同样,有经过预处理的市级地图数据文件“CityMapDatas.Rda”能够供人使用,其中涵盖了全国各个城市的简化名称以及边界信息。
例如,若要绘制湖北省内各个城市的疫情地图,首先得从“nCov2019”包所提供的数据里屏选出湖北省内各个地区的统计数据。紧接着,要加载市级地图数据,并且借助城市名称与疫情数据展开匹配合并。特别需要留意的是,对于那些没有疫情报告的地区,其数据有可能显示为NA,在绘图之前应当把它替换为0。
图像的输出与保存
load("ProvinceMapDatas.Rda")
df_China <- df_China %>%
left_join(df, by=c("NAME"="name"))
names(df_China)[16] <- "确诊数"
不管是省级的,还是市级的,无论是连续型的数据,还是离散型的数据,在R里生成最终的可视化的图形过后,你大概说不定有可能会期望把它保存成高清的图片用来做报告或者出版。能够借助使用ggsave()函数来达成完成保存,此该函数准许允许你去指定图片的文件的名称、格式、尺寸以及分辨率。
library(RColorBrewer)
ggplot() +
geom_polygon(data=df_China,
aes(x=long, y=lat, group=interaction(class, group),
fill=`确诊数`), colour="black", size=0.25) +
# 中国地图, 包括中国主体部分和长方形方块内的南海诸岛数据
geom_rect(aes(xmin=124, xmax=124+9.3, ymin=16-0.3, ymax=16+9),
fill=NA, colour="black", size=0.25) +
# 绘制长方形方框
geom_line(data=df_NanHaiLine, aes(x=long, y=lat, group=ID),
colour="black", size=1) +
# 绘制长方形方框内的中国南海八段线
scale_fill_brewer(palette="Reds") +
coord_map() +
ylim(14, 54) +
labs(x="经度", y="纬度") +
ggtitle("全国最新疫情地图") +
theme(
plot.title=element_text(hjust=0.5),
legend.position = c(0.1,0.2),
legend.background = element_blank()
) +
guides(fill=guide_legend(reverse=TRUE)) # 反转图例顺序
举个例子,你能够将输出设置成为PNG或者PDF的格式,其宽度是10英寸,高度为8英寸,并且要保证分辨率是300 DPI,以此来满足印刷级别的需求。借助调整这些参数,你能够轻松地获取符合各种用途的高质量地图图像。
ggsave("全国最新疫情数据2.jpg")
当你着手去绘制这一类的数据地图之际,最为经常碰到的技术方面的挑战究竟是什么,这个挑战是不是数据匹配之时所遭遇的艰难之处,又或者是色彩映射的相关设置方面,欢迎你在评论区域分享你自身所拥有的经验,而要是你感觉本文具备一定的帮助的话,那就请点赞予以支持。





