使用highcharter绘制交互式中国地图

使用highcharter绘制交互式中国地图

上次我讲解了如何使用 highcharter 绘制世界地图,这次我们再讲解下如何使用 highcharter 绘制中国地图,代码基本类似。

视频讲解

首先导入我们需要的一些 R 包:

1
2
3
4
5
6
7
8
library(highcharter)
library(tidyverse)
library(lubridate)
library(sf)
library(geojsonsf)
library(geojsonio)
library(jsonlite)
library(haven)

市级地图

读取一份中国市级地图数据:

1
city <- read_sf("china_city_full_map.json")

不过这份地图数据过于精细,直接使用绘图会导致下面的地图绘制很卡,所以我们把它简化下:

1
city_simple <- st_simplify(city, dTolerance = 3000)

把简化的地图数据保存为 json 文件:

1
2
3
city_simple %>%
sf_geojson() %>%
writeLines("china_city_full_map_simple.json")

再次按照 highcharter 包绘制地图需要的数据格式读取这个 json 文件:

1
2
city <- fromJSON("china_city_full_map_simple.json", 
simplifyVector = FALSE)

下面读取中国市级疫情数据,这个数据就是我通过 cuse 数据库提供的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
haven::read_dta('china-covid19.dta') %>% 
dplyr::filter(date == max(date)) %>%
add_row(tibble(
date = ymd("2020-04-21"),
provcode = "210000",
prov = "辽宁",
citycode = "210400",
city = "抚顺",
confirmed = 0,
recovered = 0,
deaths = 0
)) %>%
mutate(current_confirmed = confirmed - recovered - deaths) -> df

df
#> # A tibble: 468 x 9
#> date provcode prov citycode city confirmed recovered deaths
#> <date> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl>
#> 1 2020-04-21 110000 北京 110000 北京 593 516 8
#> 2 2020-04-21 120000 天津 120000 天津 189 176 3
#> 3 2020-04-21 130000 河北 130100 石家庄… 29 29 0
#> 4 2020-04-21 130000 河北 130200 唐山 58 57 1
#> 5 2020-04-21 130000 河北 130300 秦皇岛… 10 9 1
#> 6 2020-04-21 130000 河北 130400 邯郸 32 32 0
#> 7 2020-04-21 130000 河北 130500 邢台 23 22 1
#> 8 2020-04-21 130000 河北 130521 邢台 23 22 1
#> 9 2020-04-21 130000 河北 130600 保定 32 32 0
#> 10 2020-04-21 130000 河北 130700 张家口… 41 41 0
#> # … with 458 more rows, and 1 more variable: current_confirmed <dbl>

这里面我使用了 add_row 函数添加了一行。

最后是使用 highcharter 绘制地图,代码和之前绘制世界地图的基本一致:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

省级地图

首先我们汇总市级的数据得到省级的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
df %>% 
group_by(date, provcode, prov) %>%
summarise(confirmed = sum(confirmed),
recovered = sum(recovered),
deaths = sum(deaths)) %>%
ungroup() %>%
mutate(current_confirmed = confirmed - recovered - deaths) %>%
type_convert() -> provdf

provdf

#> # A tibble: 34 x 7
#> date provcode prov confirmed recovered deaths current_confirmed
#> <date> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 2020-04-21 110000 北京 593 516 8 69
#> 2 2020-04-21 120000 天津 189 176 3 10
#> 3 2020-04-21 130000 河北 358 346 7 5
#> 4 2020-04-21 140000 山西 197 140 0 57
#> 5 2020-04-21 150000 内蒙古 206 120 1 85
#> 6 2020-04-21 210000 辽宁 174 169 3 2
#> 7 2020-04-21 220000 吉林 117 109 1 7
#> 8 2020-04-21 230000 黑龙江 913 475 13 425
#> 9 2020-04-21 310000 上海 638 530 7 101
#> 10 2020-04-21 320000 江苏 767 758 0 9
#> # … with 24 more rows

同样,简化省级地图数据:

1
2
3
4
5
read_sf("china_prov_full_map.json") %>% 
st_simplify(dTolerance = 3000) %>%
dplyr::filter(省 != "中朝共有") %>%
sf_geojson() %>%
fromJSON(simplifyVector = FALSE) -> provmap

绘制地图的方法一样:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

是不是也非常的酷!

知识星球附件链接:https://t.zsxq.com/uz3J2bA

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×