2019-nCoV疫情地圖動態(tài)可視化

來自 https://mp.weixin.qq.com/s/9IrY9kajZG2SJcoewUVH8w

  • 1 簡介

數(shù)據(jù)介紹:
該數(shù)據(jù)是從丁香園·丁香醫(yī)生通過爬蟲獲取的全國2019-ncov病毒的感染病例编饺。
時間的分辨率:1小時
空間分辨率:城市和省份
起止時間:從2020/1/25/17時到疫情結(jié)束

  • 2 需要的包

devtools::install_github("microly/alimap")
library(alimap) # to get China map at the prefecture city level
library(sf)
library(ggplot2)
library(dplyr)
library(tibble)
library(tidyr)
library(magrittr)
library(purrr)
library(readr)
library(stringr)
library(gganimate)
library(lubridate)
library(Cairo)
library(magick)
  • 3 地圖數(shù)據(jù)

如果有本地數(shù)據(jù),可以自行讀取响驴。
因為很多市級地名存在變化透且,
而且爬取的比較亂,部分沒有“市”這個字豁鲤,
所以使用前2個漢字進行聯(lián)結(jié)表秽誊。以地圖數(shù)據(jù)集中的城市名為準。

Chinamap_cities_sf <- map_prefecture_city() %>% 
  mutate(c2 = str_sub(name, 1, 2))
  • 4 時間序列

每12小時更新1次琳骡,從早上9點到晚上9點锅论。

# set start day
startTime <- ymd_h("2020/1/25 21")
nowTime <- Sys.time() %>% with_tz(tz = "Asia/Shanghai") # only support Shanghai timezone
endTime <- if(hour(nowTime) > 21) {
  date(nowTime) + dhours(21)
} else if (hour(nowTime) > 9){
  date(nowTime) + dhours(9)
} else {
  date(nowTime) - ddays(1) + dhours(21)
}

timeLength <- interval(startTime, endTime) %>% 
  time_length("hour") %>% `/`(12)
# time sequence
mytime <- startTime + dhours(12*(0:timeLength)) %>% .[-6] # 404 at the time
mymonth <- month(mytime)
myday <- day(mytime)
myhour <- hour(mytime) %>% as.character() %>% 
  str_pad(width = 2, side = "left", pad = "0") # make character string same length

myAPI <- paste(date(mytime), myhour, sep = "T")
  • 5 疫情數(shù)據(jù)

通過API接口讀取疫情歷史數(shù)據(jù),API接口由網(wǎng)友提供日熬,爬取自丁香園棍厌。

# define a function to read epidemic data of a day
read_epidemic <- function(oneAPI) {
  url_API <- paste0("http://69.171.70.18:5000/download/city_level_", oneAPI, ".csv")
  epidemic_df <- read_csv(file = url_API)
  colnames(epidemic_df) <- c("x1","unnamed", "city", "confirmed_c", "suspected_c",
                             "cured_c", "dead_c", "province", "short_p", "confirmed_p",
                             "suspected_p", "cured_p", "dead_p", "comment")
  epidemic_df %<>% select(city, confirmed_c)
  return(epidemic_df)
}
  
  
epidemic_nest <- tibble(time = mytime,
                        myAPI = myAPI) %>% 
  mutate(., data = map(.$myAPI, ~read_epidemic(.x))) %>% 
  select(-myAPI) %>% unnest()
  • 5.1 分箱

因為很多市級地名存在變化,
而且爬取的比較亂竖席,部分沒有“市”這個字耘纱,
所以使用前2個漢字進行聯(lián)結(jié)表。以地圖數(shù)據(jù)集中的城市名為準毕荐。

mybreaks <- c(0, 1, 10, 50, 100, 500, 1000, 5000, 100000)
mylabels <- c("0", "1-9", "10-49", "50-99", "100-499",
              "500-999", "1000-4999", ">=5000")

epidemic_df <- epidemic_nest %>% 
  mutate(conf2 = cut(confirmed_c, breaks = mybreaks,
                     labels = mylabels, include.lowest = TRUE,
                     right = FALSE, ordered_result = TRUE)) %>% 
  mutate(c2 = str_sub(city, 1, 2))
  • 6 聯(lián)結(jié)表及循環(huán)繪圖

# create temporary document
dir.create(dir1 <- file.path(tempdir(), "testdir"))

for (i in 1:length(mytime)) {
  # join epidemic data with map data
  epidemic_time <- epidemic_df %>% filter(time == mytime[i])
  epidemic_city <- Chinamap_cities_sf %>% left_join(epidemic_time, by = "c2")
  # treatment NA
  conf2 <- epidemic_city$conf2 %>% replace_na(0)
  epidemic_city %<>% select(-c2, -city, -conf2)
  epidemic_city$conf2 <- conf2

  # plot
  gg_epidemic <-  ggplot(epidemic_city) + 
    geom_sf(aes(fill = conf2)) + 
    coord_sf() + 
    scale_fill_brewer(palette = "YlOrRd", direction = 1) + 
    guides(fill = guide_legend(title = "確診人數(shù)", reverse = T)) + 
    labs(title = "2019-ncov疫情數(shù)據(jù)可視化",
        subtitle = mytime[i],
        caption = "數(shù)據(jù)來源:丁香園·丁香醫(yī)生") + 
    theme(
      # 標題
      plot.title = element_text(face = "bold", hjust = 0.5,
                                color = "black"),
      plot.subtitle = element_text(face = "bold", hjust = 0.5, size = 20,
                                color = "red"),
      plot.caption = element_text(face = "bold", hjust = 1,
                                color = "blue"),
      # 圖例
      legend.title = element_text(face = "bold",
                                  color = "black"),
      legend.text = element_text(face = "bold",
                                 color = "black"),
      legend.background = element_rect(colour = "black"),
      legend.key = element_rect(fill = NA), # 圖例箱體無背景
      legend.position = c(0.85, 0.2),
      axis.ticks = element_blank(),
      axis.text = element_blank(),
      # 繪圖面板
      panel.background = element_blank(),
      panel.border = element_rect(color = "black", linetype = "solid", size = 1, fill = NA)
      )
  
  # save picture
  ggsave(filename = paste0(date(mytime[i]), "_", hour(mytime[i]), ".png"),
         plot = gg_epidemic, path = dir1,
         width = 20, height = 20, units = "cm")
}
  • 7 動畫

path_pre <- "./"
animate_epidemic <- 
  image_animate(image = image_read(path = paste0(dir1, "/",
                                            date(mytime), "_", hour(mytime), ".png")))
anim_save(filename = "疫情地圖可視化動態(tài)圖.gif",
          animation = animate_epidemic, path = path_pre)

unlink(dir1)
2019-nCoV疫情地圖動態(tài)可視化
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末束析,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子憎亚,更是在濱河造成了極大的恐慌员寇,老刑警劉巖弄慰,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝶锋,居然都是意外死亡陆爽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門扳缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慌闭,“玉大人,你說我怎么就攤上這事躯舔÷刻蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵粥庄,是天一觀的道長丧失。 經(jīng)常有香客問我,道長惜互,這世上最難降的妖魔是什么布讹? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮载佳,結(jié)果婚禮上炒事,老公的妹妹穿的比我還像新娘。我一直安慰自己蔫慧,他們只是感情好挠乳,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姑躲,像睡著了一般睡扬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黍析,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天卖怜,我揣著相機與錄音,去河邊找鬼阐枣。 笑死马靠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蔼两。 我是一名探鬼主播甩鳄,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼额划!你這毒婦竟也來了妙啃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俊戳,失蹤者是張志新(化名)和其女友劉穎揖赴,沒想到半個月后馆匿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡燥滑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年渐北,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片突倍。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡腔稀,死狀恐怖盆昙,靈堂內(nèi)的尸體忽然破棺而出羽历,到底是詐尸還是另有隱情,我是刑警寧澤淡喜,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布秕磷,位于F島的核電站,受9級特大地震影響炼团,放射性物質(zhì)發(fā)生泄漏澎嚣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一瘟芝、第九天 我趴在偏房一處隱蔽的房頂上張望易桃。 院中可真熱鬧,春花似錦锌俱、人聲如沸晤郑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽造寝。三九已至,卻和暖如春吭练,著一層夾襖步出監(jiān)牢的瞬間诫龙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工鲫咽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留签赃,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓分尸,卻偏偏與公主長得像锦聊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寓落,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容