本期推文我们绘制不常见的双变量主题地图,该类地图可以很好的在地图上用颜色展示两个变量的信息,相较于单一变量映射地图,此类地图表达的信息更加丰富和全面。本期推文主要涉及的内容如下:
-
双变量映射地图(Bivariate Choropleth Map)简介
-
R-ggplot2+biscale 轻松绘制双变量映射地图
-
更多详细的数据可视化教程,可阅读我们的课程店铺:
Bivariate Choropleth Map
在绘制地图时,我们常常使用单一变量进行映射处理,当然,这样展示的结果可以很好的表现我们研究的特征(如收入、房价等)的变化情况或者具体的情况,如下图:
单一变量映射地图
首先,我们先通过通过下图来简单解释下双变量映射的含义:
-
首先我们创建单一变量的3级顺序配色色系。色系从较浅的中性色开始,代表第一个变量的最小值。色系颜色逐渐变暗,并朝着您代表较高值的色相饱和。中间色应与底色具有相同的色相,但其饱和度应较低而亮度较高,如下:
-
根据第一步,我们再创建一个色系,色系颜色含义类似,如下:
-
我们将所选择的6种颜色经过旋转拉伸等操作,即可获得 如下效果:
4.双变量配色色系的数值表示可以用以下这幅图表示:
此外,我们还可以使用A,B或C标记水平方向的单元格,用1、2或3标记垂直方向的单元格:如下:
(注:以上双变量简介参考资料:Bivariate Choropleth Maps: A How-to Guide[1])
R-ggplot2+biscale 轻松绘制双变量映射地图
在简单介绍完之后,接下来,我们使用R语言的biscale、ggplot2以及cowplot包完成此类地图的绘制。R-biscale包是专门为了绘制双变量映射地图而产生的R绘图包,其官网为:https://slu-opengis.github.io/biscale/articles/biscale.html,目前支持2×2和3×3的二元映射,以下为官网提供的样例,更多例子及函数用法,大家可以参考官网:
「样例01」
「样例02」
two-by-two palettes
three-by-three palettes
接下来,我们使用具体的例子介绍使用biscale包绘制双变量映射地图教程。这里的数据地图数据和指标数据分别来自albersusa和socviz包,albersusa包提供了美国标准地图地图文件数据,socviz包则提供了许多常用的指标数据,这两个包也为绘制美国地图省去了寻找数据的时间(小编可是找了好久的数据,最后才找到这个宝藏包哦~~),话不多说,我们直接上代码,具体如下:
「数据处理」:
library(albersusa)
country_sf <- albersusa::counties_sf(proj = "laea")
usa_map <- ggplot() +
geom_sf(data = country_sf,size=.125) +
theme_ipsum(base_family = "Roboto Condensed")
usa_map
可视化预览效果如下:
具体的数据格式如下:
counties <- counties_sf()
head(counties)
而我们选择socviz包中的数据操作代码如下:
us_data <- socviz::county_data %>% select(id,fips,name,state, pop,hh_income,travel_time)
head(us_data)
接下来,我们将两种数据(地图数据+指标数据)根据fips编码进行合并,需要注意的是我们需要将地图文件中fips列转换成字符串类型,详细代码如下:
counties <- mutate(counties,fips=as.character(fips)) #mutate()生成新列
bio_data <- left_join(counties,us_data,by = c("fips"="id"))
最后,我们使用biscale::bi_class()方法将合并后的数据转换成可用于绘制双变量映射的数据集,代码如下:
process_data <- biscale::bi_class(bio_data,x = hh_income,y = travel_time,style = "quantile",dim = 3)
head(process_data)
注意:红框中的数据就是我们用于映射的数据集,接下来,我们进行可视化展示:
「可视化绘制」: 在此之前,我们需将绘制数据使用sf::st_transform()进行投影转换,使其更好的展示美国地图,代码如下:
process_data_2163 <- sf::st_transform(process_data,crs = 2163)
可视化绘制代码如下:
usa_bivar_2163_them <- ggplot() +
geom_sf(data = process_data_2163, mapping = aes(fill = bi_class), color = "black", size = 0.025, show.legend = FALSE) +
bi_scale_fill(pal = "DkBlue", dim = 3) +
labs(
title = "Example Bivariate choropleth Map of <span style='color:#D20F26'>USA</span>",
subtitle = "Dark Blue (DkBlue) Palette in <span style='color:#1A73E8'>biscale</span>",
caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>"
) +
bi_theme() +
theme(
plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
size = 24, margin = margin(t = 1, b = 12)),
plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
plot.caption = element_markdown(face = 'bold',size = 12,hjust = 1)
)
usa_bivar_2163_them
可视化效果如下:
「双变量图例绘制」:
biscale包也提供了用于绘制双变量映射地图图例的简单绘制方法,对于本例子,图例绘制如下:
legend_us <- bi_legend(pal = "DkBlue",
dim = 3,
xlab = "Higher Income ",
ylab = "Higher Travel Time ",
size = 6)
legend_us
图例效果如下:
legend
最后,我们使用cowplot包进行图片组合即可:
library(cowplot)
# combine map with legend
finalPlot <- ggdraw() +
draw_plot(usa_bivar_2163_them, 0, 0, 1, 1) +
draw_plot(legend_us, .58, .05, 0.2, 0.2)
finalPlot
最终效果如下:
总结
双变量映射地图其实在很早的时候就准备进行绘制了,虽然查阅到相关绘制资料,但其较多的代码量是我一直不敢写教程(怕自己还没整明白,误导小伙伴们),但是有了biscale包就可以较简单的进行绘制了,这里需要夸下R-ggplot2绘图体系真的十分完善哦好了,本篇推文就结束了,文本需要绘制的数据都可以直接通过安装相应的包进行获取,希望大家可以好好练习下哦~~
参考资料
[1]
Bivariate Choropleth Maps: A How-to Guide: https://www.joshuastevens.net/cartography/make-a-bivariate-choropleth-map/。