桑基图

桑基图 (Sankey Diagram),是一种特定类型的流图,用于描述一组值到另一组值的流向。图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的“蒸汽机的能源效率图”而闻名,此后便以其名字命名为“桑基图”。

桑基图的特点如下:

  • 起始流量和结束流量相同,所有主支宽度的总和与所有分出去的分支宽度总和相等,保持能量的平衡
  • 在内部,不同的线条代表了不同的流量分流情况,它的宽度成比例地显示此分支占有的流量
  • 节点不同的宽度代表了特定状态下的流量大小

ggalluvial绘制桑基图

在R语言中ggalluvial是一个比较方便的可以绘制桑基图的工具,绘制出的图形可以参考下图:

  1. ## Warning: package 'ggalluvial' was built under R version 4.0.5

example alluvial plot using Titanic dataset-1.png

桑基图组成元素

根据上边的示例图,我们可以确定使用ggalluvial绘制桑基图的主要元素:

  1. 确定每个分组的轴
  2. 每个轴中对应的分组
  3. 每两个轴之间连接的线
  4. 所有分组之间线的流动

绘制图形

ggalluvial只接受两种格式的流数据(alluvial data),与R语言中的长格式和宽格式数据相对应。可以使用is_alluvia_form()is_lodes_form()进行检测,并且也可以使用to_lodes_form()to_alluvia_form()将数据转化成需要的格式。

一个具体的例子如下:

  1. head(as.data.frame(UCBAdmissions), n = 12)
  1. ## Admit Gender Dept Freq
  2. ## 1 Admitted Male A 512
  3. ## 2 Rejected Male A 313
  4. ## 3 Admitted Female A 89
  5. ## 4 Rejected Female A 19
  6. ## 5 Admitted Male B 353
  7. ## 6 Rejected Male B 207
  8. ## 7 Admitted Female B 17
  9. ## 8 Rejected Female B 8
  10. ## 9 Admitted Male C 120
  11. ## 10 Rejected Male C 205
  12. ## 11 Admitted Female C 202
  13. ## 12 Rejected Female C 391
  1. is_alluvia_form(as.data.frame(UCBAdmissions), axes = 1:3, silent = TRUE)
  1. ## [1] TRUE
  1. ggplot(as.data.frame(UCBAdmissions),
  2. aes(y = Freq, axis1 = Gender, axis2 = Dept)) +
  3. geom_alluvium(aes(fill = Admit), width = 1/12) +
  4. geom_stratum(width = 1/12, fill = "black", color = "grey") +
  5. geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
  6. scale_x_discrete(limits = c("Gender", "Dept"), expand = c(.05, .05)) +
  7. scale_fill_brewer(type = "qual", palette = "Set1") +
  8. ggtitle("UC Berkeley admissions and rejections, by sex and department")

alluvial plot of UC Berkeley admissions dataset-1.png

主要使用stat_alluvium()stat_stratum()对线条和轴进行设置

长格式数据的转换如下所示:

  1. UCB_lodes <- to_lodes_form(as.data.frame(UCBAdmissions),
  2. axes = 1:3,
  3. id = "Cohort")
  4. head(UCB_lodes, n = 12)
  1. ## Freq Cohort x stratum
  2. ## 1 512 1 Admit Admitted
  3. ## 2 313 2 Admit Rejected
  4. ## 3 89 3 Admit Admitted
  5. ## 4 19 4 Admit Rejected
  6. ## 5 353 5 Admit Admitted
  7. ## 6 207 6 Admit Rejected
  8. ## 7 17 7 Admit Admitted
  9. ## 8 8 8 Admit Rejected
  10. ## 9 120 9 Admit Admitted
  11. ## 10 205 10 Admit Rejected
  12. ## 11 202 11 Admit Admitted
  13. ## 12 391 12 Admit Rejected
  1. is_lodes_form(UCB_lodes, key = x, value = stratum, id = Cohort, silent = TRUE)
  1. ## [1] TRUE

总结

总的来说,ggalluvial对于数据格式的要求比较高,不过也提供了特定的函数进行数据格式的转换,重点是理解图形中每个要素的设置及其所代表的含义。

Reference:Alluvial Plots in ggplot2