knitr::opts_chunk$set( collapse = TRUE, comment = "#>", warning = FALSE )
用leafletCN画省份疫情图存在两个问题,一是leafletCN中地图数据跟ncov数据中城市的
名字不一致,可能是一些城市已经改名,如襄樊已经改成襄阳,北京市早已把撤县设区,
而现有数据中还是县;或者是ncov中采用了地名的缩写。二是需要把除该省之外的区域去
掉,以便很好的展示,虽然通过修改geojsonMap
中tileType
参数可以实现,但是map
周围存在边线(如下图所示存在蓝色边线)。
knitr::include_graphics("old_leafletCN_ncov_map.png")
所以,要想画疫情省份图,首先对
leafletCN中地图数据更新,我把其中的关于省和直辖市地图数据更新了一下,然后修改了geojsonMap()
可通过设置
tileType = NULL
去除map周围边线。可以从
这里安装。目前没有对地级市数据进行更
新,并且我所用的地图数据也不是最新的数据,可能存在个别城市名字错误(目前还没发
现任何错误)。
# 安装修改后的leafletCN if (!require(remotes)) install.packages("remotes") if (!require(leafletCN) || packageVersion("leafletCN") < "0.2.3") { remotes::install_github("yiluheihei/leafletCN") } if (!require(ncovmap)) remotes::install_github("yiluheihei/ncovmap")
ncov数据中有个别城市名字是用缩写,比如湖北省的如"恩施州"实际上是"恩施土家族苗 族自治州"。所以再画图之前首先需要对ncov中城市的名字和地图数据中的名字进行对应。
然后就是写函数画图,主要包含两个函数plot_province_map()
和
plot_province_map2()
。
plot_province_map()
。把数据分组稍微作了修改,提供bins
参数,为了突出没有感染ncov的城市(例数为0)
,只要有0例的城市存在,就手动设置它的颜色为白色。如
bins = c(1, 10, 100)
分组为1~9,10~99,>=100,如果存在例数为0的城市,那么会多一
个0组。
plot_province_map2()
。完全参考ncovr::plot_map()
写的,只是添加了bins
参数。
另外还参考ncovr::plot_map()
的method
参数,感觉省份图基本用不到log
处理,目前只是把bins简单设置成了4。
读取数据,加载包
library(ncovmap) library(leafletCN) library(magrittr) # 为了通过 travis CI 选择从数据仓库下载数据 ncov <- get_ncov2()
取子集
hubei <- ncov["湖北省"] guangdong <- ncov["广东省"] china <- ncov["china"] world <- ncov["world"]
plot_province_map()
画图
# 例数为0的城市以白色突出显示 hubei <- ncov["湖北省"] plot_province_map(hubei, "湖北省", bins = c(0, 100, 200, 500, 1000, 10000))
guangdong <- ncov["广东省"] plot_province_map(guangdong, "广东省", bins = c(0, 10, 100, 200))
plot_province_map2()
画图
plot_province_map2(hubei, "湖北省", bins = c(0, 100, 200, 500, 1000, 10000))
plot_province_map2(guangdong, "广东省", bins = c(0, 10, 100, 200))
直接画所有省份图,台湾,香港,澳门数据没有细分,不需要画。
# # 没有台湾,香港,澳门,南海等地数据 # provinces <- setdiff( # leafletCN::regionNames('china'), # c("台湾", "香港", # "澳门", "南海诸岛" # ) # ) # # htmltools::tagList(purrr::map(provinces, # ~ plot_province_map(ncov[.x], .x, bins = c(0, 10, 100, 500, 1000, 10000))))
虽然简单几行代码就可以把所有省份疫情图画出来,但是实际上根据各省份例数不同,个
性化设置bins
才能更好的进行展示。以上面最后一张上海疫情图为例,实际上海每个区
疫情都在100以内,可以把bins设置小一些。
plot_province_map(ncov["上海市"], "上海市", bins = c(0, 5, 10, 20, 60))
2020年2月23日增加
之前china map缺少南海诸岛数据,后来找到了包括南海诸岛的中国地图数据,然后
根据ncovr::plot_map()
简单写了个plot_china_map()
用于画国内整体疫情图。
# 国内疫情整体图, 地图中包含南海诸岛i china <- ncov["china"] plot_china_map(china, legend_position = "bottomleft")
2020年2月27日增加
world <- ncov["world"] plot_world_map(world, legend_position = "bottomleft")
korea_ncov <- get_foreign_ncov("韩国") plot_foreign_map(korea_ncov, "korea")
jp_ncov <- get_foreign_ncov("日本") plot_foreign_map(jp_ncov, "japan")
foreign_countries <- c("韩国", "伊朗", "日本", "意大利") names(foreign_countries) <- c("korea", "iran", "japan", "italy") htmltools::tagList(purrr::imap( foreign_countries, ~ get_foreign_ncov(.x) %>% plot_foreign_map(.y) ))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.