71-R语言新冠疫情地图可视化

1、导入数据

> library(pacman)
> p_load(dplyr)
> covid <- readr::read_csv("./data_set/novel-corona-virus-2019-dataset/time_series_covid_19_confirmed.csv") %>%
+   rename(province=`Province/State`,region=`Country/Region`)
> names(covid)
##   [1] "province" "region"   "Lat"      "Long"     "1/22/20"  "1/23/20" 
##   [7] "1/24/20"  "1/25/20"  "1/26/20"  "1/27/20"  "1/28/20"  "1/29/20" 
##  [13] "1/30/20"  "1/31/20"  "2/1/20"   "2/2/20"   "2/3/20"   "2/4/20"  
##  [19] "2/5/20"   "2/6/20"   "2/7/20"   "2/8/20"   "2/9/20"   "2/10/20" 
##  [25] "2/11/20"  "2/12/20"  "2/13/20"  "2/14/20"  "2/15/20"  "2/16/20" 
##  [31] "2/17/20"  "2/18/20"  "2/19/20"  "2/20/20"  "2/21/20"  "2/22/20" 
##  [37] "2/23/20"  "2/24/20"  "2/25/20"  "2/26/20"  "2/27/20"  "2/28/20" 
##  [43] "2/29/20"  "3/1/20"   "3/2/20"   "3/3/20"   "3/4/20"   "3/5/20"  
##  [49] "3/6/20"   "3/7/20"   "3/8/20"   "3/9/20"   "3/10/20"  "3/11/20" 
##  [55] "3/12/20"  "3/13/20"  "3/14/20"  "3/15/20"  "3/16/20"  "3/17/20" 
##  [61] "3/18/20"  "3/19/20"  "3/20/20"  "3/21/20"  "3/22/20"  "3/23/20" 
##  [67] "3/24/20"  "3/25/20"  "3/26/20"  "3/27/20"  "3/28/20"  "3/29/20" 
##  [73] "3/30/20"  "3/31/20"  "4/1/20"   "4/2/20"   "4/3/20"   "4/4/20"  
##  [79] "4/5/20"   "4/6/20"   "4/7/20"   "4/8/20"   "4/9/20"   "4/10/20" 
##  [85] "4/11/20"  "4/12/20"  "4/13/20"  "4/14/20"  "4/15/20"  "4/16/20" 
##  [91] "4/17/20"  "4/18/20"  "4/19/20"  "4/20/20"  "4/21/20"  "4/22/20" 
##  [97] "4/23/20"  "4/24/20"  "4/25/20"  "4/26/20"

2、数据适配

因为REmap包中获取的国家(region)名称和我们数据中的名称可能不一致,需要手动将其一一对应。比如美国在我们数据中为US,而在REmap中为United States of America。

> covid$region[which(covid$region=="Antigua and Barbuda")] <- "Bermuda"
> covid$region[which(covid$region=="Czechia")] <- "Czech Republic"
> covid$region[which(covid$region=="Congo (Kinshasa)")] <- "Democratic Republic of the Congo"
> covid$region[which(covid$region=="Timor-Leste")] <- "East Timor"
> covid$region[which(covid$region=="Guinea-Bissau")] <- "Guinea Bissau"
> covid$region[which(covid$region=="Cote d'Ivoire")] <- "Ivory Coast"
> covid$region[which(covid$region=="North Macedonia")] <- "Macedonia"
> covid$region[which(covid$region=="Serbia")] <- "Republic of Serbia"
> covid$region[which(covid$region=="Congo (Brazzaville)")] <- "Republic of the Congo"
> covid$region[which(covid$region=="Korea, South")] <- "South Korea"
> covid$region[which(covid$region=="Eswatini")] <- "Swaziland"
> covid$region[which(covid$region=="Bahamas")] <- "The Bahamas"
> covid$region[which(covid$region=="Tanzania")] <- "United Republic of Tanzania"
> covid$region[which(covid$region=="US")] <- "United States of America"
> covid$region[which(covid$region=="West Bank and Gaza")] <- "West Bank"
> # covid$region[which(covid$region=="china")] <- "xianggang"

3、汇总数据

> # 按行求和
> covid.sel <- covid %>% 
+   reshape2::dcast(`province` + `region` + `Long` + `Lat` ~ .,
+                   fun.aggregate = sum) %>%
+   # 更名
+   rename(vol=".")
> str(covid.sel)
## 'data.frame':    264 obs. of  5 variables:
##  $ province: chr  "Alberta" "Anguilla" "Anhui" "Aruba" ...
##  $ region  : chr  "Canada" "United Kingdom" "China" "Netherlands" ...
##  $ Long    : num  -116.6 -63.1 117.2 -70 149 ...
##  $ Lat     : num  53.9 18.2 31.8 12.5 -35.5 ...
##  $ vol     : num  4480 3 991 100 106 ...

4、画图

> p_load(REmap)
> # 获取REmap中的国家名
> country <- data.frame(region=mapNames("world"))
> # 根据名称对应数据
> mapdata <- left_join(country,covid.sel,by="region") %>%
+   select(region,vol)
> str(mapdata)
## 'data.frame':    257 obs. of  2 variables:
##  $ region: chr  "Afghanistan" "Angola" "Albania" "United Arab Emirates" ...
##  $ vol   : num  1531 26 726 10349 3892 ...
> covid.world <- remapC(mapdata,maptype = "world",
+                       color = c('#FD0100','#FFB8B5'),
+                       theme = get_theme("dark"),
+                       title = "2019-nCoV全球分布图",
+                       subtitle = "截止2020年4月26日",)
> covid.world
## Save img as: C:\Users\Admin\AppData\Local\Temp\RtmpKs931s/ID_20200504184333_2814895.html
REmap地图

使用REmap包画的图会通过浏览器展示出来,鼠标放在某一区域,会自动显示相应数值。
灰色地带为region名称没有对应上的区域。

5、按时间序列画动态图

> p_load(animation,sp,maptools,ggplot2)
> # 读取中国地图的多边形数据
> china <- readShapePoly("./data_set/china_basic_map/bou2_4p.shp")
> # 提取省级名称
> province.name <- china$NAME %>% as.character()
> # 转换为数据框
> china.sel <- fortify(china) %>% select(long,lat,group,id)
> # 添加province列
> china.sel$province[!duplicated(china.sel$id)] <- province.name
> # 填充其他列
> china.sel <- tidyr::fill_(china.sel,fill_cols="province",.direction="down")
## 'data.frame':    89912 obs. of  5 variables:
##  $ long    : num  121 121 122 122 122 ...
##  $ lat     : num  53.3 53.3 53.3 53.3 53.3 ...
##  $ group   : Factor w/ 925 levels "0.1","1.1","2.1",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ id      : chr  "0" "0" "0" "0" ...
##  $ province: chr  "黑龙江省" "黑龙江省" "黑龙江省" "黑龙江省" ...
> # 抽取中国的疫情数据
> china.data <- covid %>% filter(region=="China" | region=="Taiwan*") %>%
+   select(-"region")
> 
> china.data$province <-
+   c("安徽省","北京市","重庆市","福建省","甘肃省","广东省",
+   "广西壮族自治区","贵州省","海南省","河北省","黑龙江省","河南省",
+   "香港特别行政区","湖北省","湖南省","内蒙古自治区","江苏省",
+   "江西省","吉林省","辽宁省","澳门特别行政区","宁夏回族自治区","青海省",
+   "陕西省","山东省","上海市","山西省","四川省","天津市",
+   "西藏自治区","新疆维吾尔自治区","云南省","浙江省","台湾省")
> 
> # 合并数据
> china.data <- china.data[,-c(2:3)] %>% 
+   right_join(china.sel,by="province")
> china.data <- select(china.data,-c("id"))
> str(china.data)
> # 设置播放速度及图片大小,转换器路径
> ani.options(interval=0.5,
+             convert=shQuote("C:/Program Files/ImageMagick-7.0.10-Q16/convert.exe"),
+             ani.width=800,ani.height=800)
> 
> saveGIF(
+  for(i in seq(2,97,by=11)) {
+     data <- china.data[,c(1,98:100,i)] %>% as.data.frame()
+     names(data)[5] <- "vol"
+     p <- ggplot(data,aes(long,lat,group=group,fill=vol)) +
+          geom_polygon(col="gray60") +
+          scale_fill_gradient(low="white",high="red") +
+          labs(title = names(china.data)[i],x="",y="") +
+          theme(panel.grid = element_blank(),
+                panel.background = element_blank(),
+                axis.text = element_blank(),
+                axis.ticks = element_blank(),
+                legend.position = "none")
+     print(p)
+   }
+ )
疫情时间序列图

因为湖北的数据太大,导致其他区域的填充颜色太浅。
这个地方需要注意的有两点:1、数据一定要转换为data.frame,因为目前还不支持tibble;2、图片的长宽比例需要手动调整,不然图片会很难看。

6、动态点图

> # 画一个空白的中国地图
> p <- ggplot() +
+   geom_polygon(data=china,aes(long,lat,group=group),col="gray40",fill="white") +
+   labs(title = "疫情地图",x="",y="") +
+   theme(panel.grid = element_blank(),
+        panel.background = element_blank(),
+        axis.text = element_blank(),
+        axis.ticks = element_blank(),
+        legend.position = "none")
>
> china.data2 <- covid %>% filter(region=="China" | region=="Taiwan*") %>%
+   select(-c("region","province"))

> saveGIF(
+   for(i in seq(3,98,by=11)) {
+     data <- china.data2[,c(1,2,i)] %>% as.data.frame()
+     names(data)[3] <- "vol"
+     pic <- p + geom_jitter(aes(Long,Lat,size=vol),
+                           data=data,shape=19,col="red") +
+       scale_size(range = c(1.2,10)) +
+       labs(title = names(china.data2)[i],x="",y="")
+     print(pic)
+   })
疫情时间序列点图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266