【R分享|实战】美国18年死亡率的分布情况(地图)-- 循环处理与绘图
# 清空当前环境变量
rm(list = ls())
# 设置工作路径
setwd()
# 加载R包
ps <- c('dplyr', 'maps', 'usmap', 'ggplot2', 'tidyverse', 'data.table') # 批量加载
lapply(ps, library, character.only=TRUE)
# 载入数据
population <- read_csv('NCHS_-_Drug_Poisoning_Mortality_by_County__United_States.csv')
# 由于本身数据的列名太长,重新定义第7列的列名
names(population)[7] <- 'death_rate'
# 获取R包自带数据的信息
county <- county.fips
# 合并数据
# %>% 通道符合表示然后,读取数据集时,不需要在函数中选择当前数据集作为对象(默认选中当前数据集)
death_merge <- population %>% left_join(county,by = c('FIPS'='fips')) # ?left_join 合并函数可以通过help查询学习
# 这里的FIPS是读取数据集的编号,与自带的美国数据集fips的编号对应合并
# 死亡率程度的颜色设定
cols = c("#A7CAEB", "#DFEDF8", "#F8EEC1", "#FFC166", "#FA842C", "#D91F15")
# 定义对应数据集中的死亡率范围
DR <- c("<2",'2-3.9','4-5.9','6-7.9','8-9.9',"10-11.9", "12-13.9", "14-15.9",
"16-17.9", "18-19.9",'20-21.9','22-23.9','24-25.9','26-27.9','28-29.9','30+')
6)在写循环前我们对数据进行了一个总体处理;
# case_when是一个比较常用的函数,用来改变某列的变量
dr_total <- death_merge %>%
mutate(death_r=case_when( # 用mutate函数生成一列新的变量
death_rate==DR[1]~1, # 例如,利用新定义的死亡率替换原有的死亡率便于后续画图上色。
death_rate==DR[2]~1, # 这里就是将认为是一个死亡率范围的替换成一个颜色,即数字1~6。
death_rate==DR[3]~2, # 与我们刚刚定义的6个颜色相匹配即可
death_rate==DR[4]~2,
death_rate==DR[5]~3,
death_rate==DR[6]~3,
death_rate==DR[7]~4,
death_rate==DR[8]~4,
death_rate==DR[9]~5,
death_rate==DR[10]~5,
death_rate==DR[11]~6,
death_rate==DR[12]~6,
death_rate==DR[13]~6,
death_rate==DR[14]~6,
death_rate==DR[15]~6,
death_rate==DR[16]~6
))
# 重新命名新数据集第一列的列名
names(dr_total)[1] <- 'fips'
# 循环生成1999-2016年数据集便于后续画图
for (i in seq(1999,2016)){ # 循环是1999年-2016年
datanames <- paste('D', i ,sep = '') # 生成18个数据集的名称
assign(datanames, filter(dr_total, Year==i))
} # filter(对上面dr_total数据集进行了按年的分割,生成了18个数据集)
# 用lapply 将18个数据集以list形式合并,便于后续绘图
death_rate_all <- lapply(paste0("D", 1999:2016), function(x) eval(as.name(x)))
8)循环绘图;
这里,真希望有一天我或者大家能够创建一个关于中国标准地图的数据集以及对应用来绘制中国地图的R包和函数!!!
我用了lapply这个函数来做批量画图,该函数比较常用。
lapply(x,FUN,...)
FUN:函数将被应用于X的每个元素。因此,常常可以与自定义函数联用做批处理。
大家仔细观察,其实函数的主要变化就是在data和label,因为这两个参数都与你的数据集有关系,label是根据每年的情况绘制不同年份的。其余参数都保持一致即可。
# 画图
# ?plot_usmap用于循环画18张美国死亡率分布图
all <- lapply(death_rate_all, function(x) plot_usmap(regions = "states", data= x, values = "death_r", color=alpha("white",0))+#option or correct
scale_fill_gradientn(colours = c("#A7CAEB", "#DFEDF8", "#F8EEC1", "#FFC166", "#FA842C", "#D91F15"))+
geom_text(data=x,aes(x=1100000,y=-2000000, label=x$`Year`[1]),size=3)+
theme(legend.position = "none"))
# 函数的细节,各参数大家可以参考help。
# 注意data=x,x是function(x),lable这里的x也是一样的,即death_rate_all。
9)拼图展示;拼图可以参考之前所学内容【R分享|实战】地表最全R拼图教程,告别AI和PS
# 拼图
library(patchwork)
all[[1]]+all[[2]]+ all[[3]]+all[[4]]+all[[5]]+all[[6]]+
all[[7]]+all[[8]]+all[[9]]+all[[10]]+all[[11]]+all[[12]]+
all[[13]]+all[[14]]+all[[15]]+all[[16]]+all[[17]]+all[[18]]+ plot_layout(nrow = 3, ncol=6)
10)添加图例完成绘制;
# 添加图例
# 这里两个R包可以上BiocManager平台或者Github平台下载
library(circlize)
library(ComplexHeatmap)
# 这部分是绘制图例的内容,不一一赘述了。大家可以通过help参看响应的参数讲解
color_need <- colorRamp2(breaks = c(0, 4, 8, 12, 16, 20, 24),
colors = c("#A7CAEB","#A7CAEB", "#DFEDF8", "#F8EEC1", "#FFC166", "#FA842C", "#D91F15"))
legend <- Legend(col_fun = color_need, title = "Overdose deaths per 100000", at=c (0, 4, 8, 12, 16, 20, 24),
labels = c(" ","4", "8", "12", "16","20"," "), title_position = "topcenter",
direction = "horizontal", title_gp = gpar(fontsize=8, fontface="bold"),
grid_height = unit(0.2, "cm"), legend_width = unit(6, "cm"))
draw(legend,x = unit(0.5, "npc"), y = unit(0.85, "npc"))