使用 hchinamap 绘制中国地图

使用 hchinamap 绘制中国地图

hchinamap 包是我写的一个 R 包,已经发表在 CRAN 上了。这个包可以非常方便的绘制交互式的中国地图。

之所以编写这个 R 包,是因为我发现外国人开发的基于 htmlwidgets 的 R 包里面的中国地图都没有九段线和台湾。所以我就想开发一个能够绘制完整的中国地图的 R 包。

首先加载这个包,注意不要先不要安装 GitHub 上的版本,因为 GitHub
上的跟这个有一些不一样,且正在开发中,先从 CRAN 上安装就好:

R
1
install.packages('hchinamap')

加载这个包:

R
1
library(hchinamap)

绘制中国地图

首先我们导入一个数据集,因为这个数据集中含有中文,所以没有放在包里面,需要下载后导入:

R
1
2
3
4
5
6
dir <- tempdir()
download.file('https://czxb.github.io/br/chinadf.rda', file.path(dir, 'chinadf.rda'))
load(file.path(dir, 'chinadf.rda'), verbose = TRUE)

## Loading objects:
## chinadf

然后你就会发现你的 Environment 里面多了个 chinadf
数据框,下面的示例都将使用这个数据集进行演示,首先我们先画个中国地图:

R
1
2
3
4
5
6
7
8
library(tidyverse)
# 只保留 region === "China" 的行
china <- chinadf %>%
dplyr::filter(region == "China")
hchinamap(region = "China",
name = china$name, value = china$value,
width = "100%", height = "400px",
title = "中国地图")

hchinamap() 函数有三个必须的参数,region、name 和 value,region 是选择绘制中国地图还是那个省的地图的,需要注意的是 region 参数需要传入 China 或者各个省份的汉语拼音,例如山西是 Shanxi, 陕西是 Shaanxi(注意首字母大写)。

修改的参数有很多,开发 htmlwidgets 控件中最烦人的部分就是设置参数了,下面介绍一些参数:

首先值得注意的是,这个地图映射的是连续变量,我们可以使用 minColormaxColor 参数控制最小值和最大值处的颜色:

R
1
2
3
# 我们试试这个调色板
tidyquant::palette_light() %>%
scales::show_col()

R
1
2
3
4
5
6
hchinamap(region = "China", 
name = china$name, value = china$value,
width = "100%", height = "400px",
title = "中国地图",
minColor = "#CAB2D6",
maxColor = "#6A3D9A")

更多参数的调试可以使用我开发的 shiny
应用测试:https://czxa.top/shiny/packages/

绘制各个省的地图

我们就画两个最难以区分的省份吧,首先是陕西的:

R
1
2
3
4
5
6
sx <- chinadf %>%
dplyr::filter(region == "Shaanxi")
hchinamap(region = "Shaanxi",
name = sx$name, value = sx$value,
width = "100%", height = "400px",
title = "陕西地图")

然后是山西的:

R
1
2
3
4
5
6
sx2 <- chinadf %>%
dplyr::filter(region == "Shanxi")
hchinamap(region = "Shanxi",
name = sx2$name, value = sx2$value,
width = "100%", height = "400px",
title = "山西地图")

使用 manipulateWidget 包可以组合多个 HTML 控件:

R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
library(manipulateWidget)
anhui <- chinadf %>%
dplyr::filter(region == "Anhui")
jiangsu <- chinadf %>%
dplyr::filter(region == "Jiangsu")
combineWidgets(
hchinamap(region = "Anhui",
name = anhui$name, value = anhui$value,
width = "100%", height = "400px",
title = "安徽地图"),
hchinamap(region = "Jiangsu",
name = jiangsu$name, value = jiangsu$value,
width = "100%", height = "400px",
title = "江苏地图"),
byrow = TRUE, ncol = 2, width = "100%", height = "300px"
)

是不是觉得这个控制放大和缩小的按钮非常烦人。。。我没有设置控制它的参数,所以暂时不能去除,不过下一篇我会介绍 GitHub 上的开发版,增加了控制这个按钮显示与否的参数。

主题

最有趣的参数就是修改主题了,我设置了九种主题:

  • darkgreen
  • darkblue
  • avocado
  • darkunica
  • gray
  • gridlight
  • grid
  • sandsignika
  • sunset

例如
sandsignika 主题:

R
1
2
3
4
5
6
7
gd <- chinadf %>%
dplyr::filter(region == "Guangdong")
hchinamap(name = gd$name, value = gd$value,
width = "100%", height = "400px",
title = "Map of Guangdong",
region = "Guangdong",
theme = "sandsignika")

不要问我为什么这些主题的名字都这么奇怪。。。因为 Highcharts 就是这么设计的,我是直接封装的。。。

回到 ggplot2 + sf

这里我们有各个省的数据了!我们再回到使用 ggplot2 + sf 绘制地图的方法中,我们使用 china 数据框绘图:

R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
library(ggplot2)
library(sf)
library(tidyverse)
library(hrbrthemes)
# 设置绘图主题
enfont = "CascadiaCode-Regular"
cnfont = "STYuanti-SC-Regular"
theme_set(theme_ipsum(base_family = enfont))
mapdata <- read_sf("chinamap/中国省界.shp")
mapborder <- read_sf("chinaboundary/china_official_boundary.shp")
# 合并 china 和 mapdata 数据:
mapdata <-
mapdata %>%
left_join(china, by = c("NAME" = "name"))
ggplot() +
geom_sf(data = mapdata, aes(geometry = geometry,
fill = value),
size = 0.05, color = "white") +
geom_sf(data = mapborder, aes(geometry = geometry),
size = 0.05, color = "white") +
theme_modern_rc(base_family = enfont) +
scale_fill_viridis_c() +
worldtilegrid::theme_enhance_wtg() +
labs(title = "China Map")

# R

评论

Your browser is out-of-date!

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

×