COVID-19 in africa
ggplot2-绘制非洲地区新冠肺炎(COVID19)
最近接触COVID的项目,目前COVID已经在世界上普遍大流行,而且WHO官网及霍普金斯大学等都有相对应的全球COVID19监测平台。每天实时更新。
其实最早出现的新冠肺炎监测平台是2020年1月27日上线的丁香园疫情动态。
好了,今天要介绍的主要是,如何在R里面绘制非洲地区的COVID地图。
1.数据获取
通过上述文章,我们知道了如何获取非洲地区的geojson
文件link,然后去WHO官网下载COVID疫情数据,保存成csv。然后通过 covid
中的country
与africa
中的country
进行数据关联。
cd=left_join(africa,COVID)
,将covid数据关联到africa sf
数据库中。
library(tidyverse)
library(sf)
library(ggspatial)
library(ggthemes)
library(RColorBrewer)
rm(list = ls())
africa = read_sf("africa.geojson")
africa %>%
ggplot() +
geom_sf()
# get data covid
# https://covid19.who.int/?gclid=Cj0KCQjw6PD3BRDPARIsAN8pHuEwbdWQXOSPpKqWOeSVU72ODgyfZIWF8PIRJjtpdbcj_9p5L-I4shQaAiWREALw_wcB
# Source: World Health Organization
COVID=read.csv("WHO-COVID-19-global-data.csv") %>%
mutate(time=as.Date(Date_reported),
iso_a2=as.character(Country_code),
admin1=as.character(Country)) %>%
filter(time=="2020-06-30") %>%
select(iso_a2,admin1,Cumulative_cases)
cd=left_join(africa,COVID)
image.png
2.添加图例
关联好数据后,我们来简单画一个图。默认的颜色好像有点丑,而且与WHO的图不一样,Cumulative_cases
是连续性变量,需要对Cumulative_cases
进行变量转换。
这里提一下,在ArcGis中,可以选择几何分段,jenks分段,等间距分段对连续性数值进行转换。得到分类的图例数据。R里面也有对应的函数cartography::getBreaks()
可以实现对应的功能。
首先我们对Cumulative_cases
进行分类,按照WHO的分类条件,分成5类。这里用到的函数为cut
,主要是breask
与label
。break是按照给定数值进行切分。然后赋予对应的label。
cut(x, breaks, labels = NULL,
include.lowest = FALSE, right = TRUE, dig.lab = 3,
ordered_result = FALSE, ...)
# plot
ggplot(cd) +
geom_sf(aes(geometry = geometry, fill = Cumulative_cases))
# break
cd=cd %>% mutate(Cumulative_cases=replace_na(Cumulative_cases,-99)) %>%
mutate(covid=cut(Cumulative_cases,
breaks = c(-Inf,0,1000,10000,50000,300000,Inf),
labels = c("A","B","C","D","E","F")
))
ggplot(cd) +
geom_sf(aes(geometry = geometry, fill = covid))
image.png
但是最后的结果图,我们发现,label排序很乱,而且对应的颜色是ggplot默认给定的。
下一步,我们继续设置图例颜色与顺序。参考GGPLOT LEGEND TITLE, POSITION AND LABELS
3.更改图例颜色
更改颜色及顺序用到scale_fill_manual
函数,这里是分类变量的设定。如果是连续性变量那就用到scale_fill_gradient()
. 我们来找一下对应颜色语言配色方案: Colors in R。找到对应颜色后,按照从低到高排列好,values=后面
guide = guide_legend(reverse=TRUE)
用来设定排序问题。
library(RColorBrewer)
# 通过指定名字来查看调色板
display.brewer.pal(n = 8, name = 'RdBu')
# 十六进制颜色规格
brewer.pal(n = 8, name = "RdBu")
p=ggplot(cd) +
geom_sf(aes(geometry = geometry, fill = covid))
# plot
p +
scale_fill_manual(name="COVID-19",
values = c("gray","#D1E5F0","#92C5DE","#4393C3","#2166AC"),
guide = guide_legend(reverse=TRUE))
image.png
4.添加比例尺与指北针
参考R 地图绘制-比例尺与指北针如何改变比例尺大小及位置。
p +
scale_fill_manual(name="COVID-19",
values = c("gray","#D1E5F0","#92C5DE","#4393C3","#2166AC"),
guide = guide_legend(reverse=TRUE)) +
annotation_scale(location = "bl", width_hint = 0.4,
height = unit(0.15, "cm"),
text_cex = 0.5) +
annotation_north_arrow(location = "tr", which_north = "true",
height = unit(0.8, "cm"),
width = unit(0.8, "cm"),
pad_x = unit(0.05, "in"), pad_y = unit(0.05, "in"),
style = north_arrow_fancy_orienteering) +
labs(title = "WHO COVID-19 in Africa",
subtitle = "Data last updated:2020/06/30",
x="Longitude",y="Latitude")
image.png
4.添加点与标签
有时候需要在地图上指出哪个国家比较严重,将其标记出来,并显示标签。
我们新建两个数据。Tanzania 与Nigeria,将他们标在地图上,并用细线标注。
这里需要注意的是,我们用geom_segment
来表示点之间的细线。
所用新建的数据包括:
- x,y是国家所在的点经纬度位置(线的起始点)
- xend,yend线的终末点
- xat与yat是label所在经纬度位置(可以用xend与yend表示)
label=tibble(
x=c(34.8,8.1),
y=c(-6.3,9.5),
xend=c(45.7,0.8),
yend=c(-3.6,1.4),
label=c("Tanzania","Nigeria"),
xat=c(47,0.8),
yat=c(-2.7,1.4))
label
# A tibble: 2 x 7
x y xend yend label xat yat
<dbl> <dbl> <dbl> <dbl> <chr> <dbl> <dbl>
1 34.8 -6.3 45.7 -3.6 Tanzania 47 -2.7
2 8.1 9.5 0.8 1.4 Nigeria 0.8 1.4
# add point
p +
scale_fill_manual(name="COVID-19",
values = c("gray","#D1E5F0","#92C5DE","#4393C3","#2166AC"),
guide = guide_legend(reverse=TRUE)) +
geom_point(data=label,aes(x=x,y=y),col="#D6604D",size=2,alpha=0.9)
# add lines
p +
scale_fill_manual(name="COVID-19",
values = c("gray","#D1E5F0","#92C5DE","#4393C3","#2166AC"),
guide = guide_legend(reverse=TRUE)) +
geom_point(data=label,aes(x=x,y=y),col="#D6604D",size=2,alpha=0.9) +
# line
geom_segment(data = label,
aes(x = x, y = y, xend = xend, yend = yend)) +
#label
geom_text(data=label,
aes(x=xat,y=yat,label=label),size=2.8)
image.png
image.png
当然也可以更改直线为曲线,参见Line segments and curves
最后,我门汇总在一起,看一下效果
p +
scale_fill_manual(name="COVID-19",
values = c("gray","#D1E5F0","#92C5DE","#4393C3","#2166AC"),
guide = guide_legend(reverse=TRUE)) +
geom_point(data=label,aes(x=x,y=y),col="#D6604D",size=2,alpha=0.9) +
# line
geom_segment(data = label,
aes(x = x, y = y, xend = xend, yend = yend)) +
#label
geom_text(data=label,
aes(x=xat,y=yat,label=label),size=2.8)+
annotation_scale(location = "bl", width_hint = 0.4,
height = unit(0.15, "cm"),
text_cex = 0.5) +
annotation_north_arrow(location = "tr", which_north = "true",
height = unit(0.8, "cm"),
width = unit(0.8, "cm"),
pad_x = unit(0.05, "in"), pad_y = unit(0.05, "in"),
style = north_arrow_fancy_orienteering) +
labs(title = "WHO COVID-19 in Africa",
subtitle = "Data last updated:2020/06/30",
x="Longitude",y="Latitude")
image.png
其实还可以更改里面字体类型及大小。
后续会更新