天天看点

绘图技巧 | 三元相分级统计地图(Ternary Choropleth Map)可视化绘制

之前有小伙伴在讨论群里提问关于分级统计地图(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
           

复制

结果如下:

绘图技巧 | 三元相分级统计地图(Ternary Choropleth Map)可视化绘制
  • 三元分级统计地图

绘制完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 map
  geom_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.')
           

复制

可视化结果如下:

绘图技巧 | 三元相分级统计地图(Ternary Choropleth Map)可视化绘制

「样例二: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$rgb

ggplot(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 Choropleth Map)可视化绘制

「样例三: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$rgb

ggplot(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.')
           

复制

可视化结果如下:

绘图技巧 | 三元相分级统计地图(Ternary Choropleth Map)可视化绘制

当然通过设置还可以绘制如下可视化效果:

绘图技巧 | 三元相分级统计地图(Ternary Choropleth Map)可视化绘制

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() # 该步骤确保每个区域之为对应的颜色值

           

复制

可视化结果如下:

绘图技巧 | 三元相分级统计地图(Ternary Choropleth Map)可视化绘制
  • 添加三元相图及美化
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)
      )
           

复制

最终的可视化结果如下:

绘图技巧 | 三元相分级统计地图(Ternary Choropleth Map)可视化绘制

总结

作为过完年的第一篇原创推文还是以小编喜欢的空间可视化作品开始,希望小伙伴们可以从中获取绘图灵感,大家也可以结合绘图技巧 | 双变量映射地图可视化绘制方法 这篇推文进行对比绘制。