美文网首页
COVID-19 in africa

COVID-19 in africa

作者: jamesjin63 | 来源:发表于2020-07-01 23:16 被阅读0次

    ggplot2-绘制非洲地区新冠肺炎(COVID19)

    最近接触COVID的项目,目前COVID已经在世界上普遍大流行,而且WHO官网及霍普金斯大学等都有相对应的全球COVID19监测平台。每天实时更新。

    image.png

    其实最早出现的新冠肺炎监测平台是2020年1月27日上线的丁香园疫情动态。
    好了,今天要介绍的主要是,如何在R里面绘制非洲地区的COVID地图。

    1.数据获取

    通过上述文章,我们知道了如何获取非洲地区的geojson文件link,然后去WHO官网下载COVID疫情数据,保存成csv。然后通过 covid中的countryafrica中的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,主要是breasklabel。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

    其实还可以更改里面字体类型及大小。
    后续会更新

    参考

    1. ggplot2 legend : Easy steps to change the position and the appearance of a graph legend in R software
    2. How To Customize ggplot2
    3. HOW TO CHANGE GGPLOT LEGEND SIZE
    4. GGPLOT LEGEND TITLE, POSITION AND LABEL
    5. Saving High-Resolution ggplots

    相关文章

      网友评论

          本文标题:COVID-19 in africa

          本文链接:https://www.haomeiwen.com/subject/qtekqktx.html