之前有小伙伴再讨论群里提问关于分级统计地图(choropleth maps) 的绘制方法,刚开始看到这个问题的时候觉得比较简单,就给出了几个处理方法,有R的也有基于Python 的,但后来和提问小伙伴一聊,才知道是要绘制一个有 ”三元相映射图例的” 分级统计地图。之前也答应会出一期类似的推文,中间有太多的事情要做,导致拖得有点久。作为过完年的第一篇原创推文,本期我们就使用可视化功能强大的R来绘制此类地图,主要涉及内容如下:
-
R-tricolore包简介
-
R-tricolore包实践
-
更多详细的数据可视化教程,可订阅我们的店铺课程:
R-tricolore包简介
在得知类似需求后,我就根据类似需求进行资料查询,在经过多次查找之后,就找到了R-tricolore包可以较好的完成类似绘制需求(Python的目前还没找到绘制方法),介绍如下:
1. 官网网址
R-tricolore包的官方网址为:https://github.com/jschoeley/tricolore ,小伙伴们想了解更多的内容可浏览该网址查阅哈。
2. 主要功能
R-tricolore 包可为三元相图的组成成分提供灵活的可视化色标,其主要功能是将任何三元合成颜色编码为三种原色的混合,并绘制合适的颜色键。主要提供以下可视化颜色设置:
-
离散(discrete)和连续(continuous)色彩支持,
-
通过居中支持不平衡的成分数据(unbalanced compositional data),
-
通过缩放支持范围非常窄的数据(data with very narrow range),
-
色调,色度和亮度选项设置。
3. R-tricolore 包样例
R-tricolore 包提供了丰富的样例供学习参考,接下来,我将列举几个例子方便大家理解:
-
基本三元图绘制
代码:
library(tricolore)# 生成模拟数据
P <- as.data.frame(prop.table(matrix(runif(3^6), ncol = 3), 1))
# 使用Tricolore生成需要的数据:该步骤最为重要
colors_and_legend <- Tricolore(P, 'V1', 'V2', 'V3')
# 展示生成的数据(部分)
head(colors_and_legend$rgb)
#结果如下
"#A37D7D" "#7A86A1" "#AF9B47" "#6E8E72" "#00AFAE" "#727272"
而使用一下代码就可以直接绘制三元相图:
colors_and_legend$key
结果如下:
-
三元分级统计地图
绘制完tricolore包主要的绘图方法(用于定制化绘制三元相图),接下来我们看下官网提供的地图映射绘制方法(主要介绍的内容):
「样例一:」
# color-code the data set and generate a color-key
tric_educ <- Tricolore(euro_example,p1 = 'ed_0to2', p2 = 'ed_3to4', p3 = 'ed_5to8')
# add the vector of colors to the `euro_example` data
euro_example$educ_rgb <- tric_educ$rgb
library(ggplot2)
library(ggtern)plot_educ <-# using data sf data `euro_example`...ggplot(euro_example) +# ...draw a choropleth mapgeom_sf(aes(fill = educ_rgb, geometry = geometry), size = 0.1) +# ...and color each region according to the color-code# in the variable `educ_rgb`scale_fill_identity()plot_educ <-plot_educ +annotation_custom(ggplotGrob(tric_educ$key +labs(L = '0-2', T = '3-4', R = '5-8')),xmin = 55e5, xmax = 75e5, ymin = 8e5, ymax = 80e5) +
theme_void() +coord_sf(datum = NA) +labs(title = 'European inequalities in educational attainment',subtitle = 'Regional distribution of ISCED education levels for people aged 25-64 in 2016.')
可视化结果如下:
「样例二:breaks = 2」
# color-code the data set and generate a color-key
tric_educ_disc <- Tricolore(euro_example,p1 = 'ed_0to2', p2 = 'ed_3to4', p3 = 'ed_5to8',breaks = 2)
euro_example$educ_rgb_disc <- tric_educ_disc$rgbggplot(euro_example) +geom_sf(aes(fill = educ_rgb_disc, geometry = geometry), size = 0.1) +scale_fill_identity() +annotation_custom(ggplotGrob(tric_educ_disc$key +labs(L = '0-2', T = '3-4', R = '5-8')),xmin = 55e5, xmax = 75e5, ymin = 8e5, ymax = 80e5) +theme_void() +coord_sf(datum = NA) +labs(title = 'European inequalities in educational attainment',subtitle = 'Regional distribution of ISCED education levels for people aged 25-64 in 2016.')
可视化结果如下:
「样例三:Ternary centering」
tric_lf_non_centered <- Tricolore(euro_example, breaks = Inf,'lf_pri', 'lf_sec', 'lf_ter')euro_example$rgb_lf_non_centered <- tric_lf_non_centered$rgbggplot(euro_example) +geom_sf(aes(fill = rgb_lf_non_centered, geometry = geometry), size = 0.1) +scale_fill_identity() +annotation_custom(ggplotGrob(tric_lf_non_centered$key +labs(L = '% Primary', T = '% Secondary', R = '% Tertiary')),xmin = 55e5, xmax = 75e5, ymin = 8e5, ymax = 80e5) +theme_void() +coord_sf(datum = NA) +labs(title = 'European inequalities in labor force composition',subtitle = 'Regional distribution of labor force across the three sectors in 2016.')
可视化结果如下:
当然通过设置还可以绘制如下可视化效果:
而对于三元相图以及地图属性的设置可通过如下GIF动图进行详细设置:
DemoTricolore()设置
R-tricolore包实践
由于上述介绍的都是官网的例子,这部分我们使用新的数据进行这种 “三元分级统计地图” 的绘制,详细内容如下(数据和相关代码之前的推文绘图技巧 | 双变量映射地图可视化绘制方法 类似,这里直接给出相应的代码:
-
地图数据可视化
代码:
library(sf)
library(tidyverse)
library(hrbrthemes)
library(tricolore)us_data <- socviz::county_data %>% select(id,fips,name,state, land_area,hh_income,pop)
tric_usdata <- Tricolore(us_data,p1 = 'land_area', p2 = 'pop', p3 = 'hh_income',breaks = 3)
#添加新数据
us_data$us_rgb <- tric_usdata$rgb country_sf <- albersusa::counties_sf()
country_sf <- mutate(country_sf,fips=as.character(fips)) #mutate()生成新列
tri_data <- left_join(country_sf,us_data,by = c("fips"="id"))
us_map2 <- ggplot(data = process_data_2163) +geom_sf(aes(fill=us_rgb,geometry = geometry),size=.1) +scale_fill_identity() # 该步骤确保每个区域之为对应的颜色值
可视化结果如下:
-
添加三元相及美化
final_map <-us_map2 +annotation_custom(ggplotGrob(tric_usdata$key+theme(text = element_text(size = 8),plot.background = element_rect(fill = "#F0E5DE",colour = "#F0E5DE"))),xmin = 1478654 , xmax = 568885.4 , ymin = -2642789, ymax = -1753061) +labs(title = "Example Ternary Choropleth Map of <span style='color:#D20F26'>USA</span>",subtitle = "Made in <span style='color:#1A73E8'>tricolore</span>",caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>" ) +theme_void(base_family = "Roboto Condensed") +theme(plot.background = element_rect(fill = "#F0E5DE",colour = "#F0E5DE"),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))
最终的可视化结果如下:
总结
作为过完年的第一篇原创推文还是以小编喜欢的空间可视化作品开始,希望小伙伴们可以从中获取绘图灵感,大家也可以结合绘图技巧 | 双变量映射地图可视化绘制方法 这篇推文进行对比绘制。