桑基图
桑基图 (Sankey Diagram),是一种特定类型的流图,用于描述一组值到另一组值的流向。图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的“蒸汽机的能源效率图”而闻名,此后便以其名字命名为“桑基图”。
桑基图的特点如下:
- 起始流量和结束流量相同,所有主支宽度的总和与所有分出去的分支宽度总和相等,保持能量的平衡
- 在内部,不同的线条代表了不同的流量分流情况,它的宽度成比例地显示此分支占有的流量
- 节点不同的宽度代表了特定状态下的流量大小
ggalluvial绘制桑基图
在R语言中ggalluvial是一个比较方便的可以绘制桑基图的工具,绘制出的图形可以参考下图:
## Warning: package 'ggalluvial' was built under R version 4.0.5

桑基图组成元素
根据上边的示例图,我们可以确定使用ggalluvial绘制桑基图的主要元素:
- 确定每个分组的轴
- 每个轴中对应的分组
- 每两个轴之间连接的线
- 所有分组之间线的流动
绘制图形
ggalluvial只接受两种格式的流数据(alluvial data),与R语言中的长格式和宽格式数据相对应。可以使用is_alluvia_form()和is_lodes_form()进行检测,并且也可以使用to_lodes_form()和to_alluvia_form()将数据转化成需要的格式。
一个具体的例子如下:
head(as.data.frame(UCBAdmissions), n = 12)
## Admit Gender Dept Freq## 1 Admitted Male A 512## 2 Rejected Male A 313## 3 Admitted Female A 89## 4 Rejected Female A 19## 5 Admitted Male B 353## 6 Rejected Male B 207## 7 Admitted Female B 17## 8 Rejected Female B 8## 9 Admitted Male C 120## 10 Rejected Male C 205## 11 Admitted Female C 202## 12 Rejected Female C 391
is_alluvia_form(as.data.frame(UCBAdmissions), axes = 1:3, silent = TRUE)
## [1] TRUE
ggplot(as.data.frame(UCBAdmissions),aes(y = Freq, axis1 = Gender, axis2 = Dept)) +geom_alluvium(aes(fill = Admit), width = 1/12) +geom_stratum(width = 1/12, fill = "black", color = "grey") +geom_label(stat = "stratum", aes(label = after_stat(stratum))) +scale_x_discrete(limits = c("Gender", "Dept"), expand = c(.05, .05)) +scale_fill_brewer(type = "qual", palette = "Set1") +ggtitle("UC Berkeley admissions and rejections, by sex and department")

主要使用
stat_alluvium()和stat_stratum()对线条和轴进行设置
长格式数据的转换如下所示:
UCB_lodes <- to_lodes_form(as.data.frame(UCBAdmissions),axes = 1:3,id = "Cohort")head(UCB_lodes, n = 12)
## Freq Cohort x stratum## 1 512 1 Admit Admitted## 2 313 2 Admit Rejected## 3 89 3 Admit Admitted## 4 19 4 Admit Rejected## 5 353 5 Admit Admitted## 6 207 6 Admit Rejected## 7 17 7 Admit Admitted## 8 8 8 Admit Rejected## 9 120 9 Admit Admitted## 10 205 10 Admit Rejected## 11 202 11 Admit Admitted## 12 391 12 Admit Rejected
is_lodes_form(UCB_lodes, key = x, value = stratum, id = Cohort, silent = TRUE)
## [1] TRUE
总结
总的来说,ggalluvial对于数据格式的要求比较高,不过也提供了特定的函数进行数据格式的转换,重点是理解图形中每个要素的设置及其所代表的含义。
Reference:Alluvial Plots in ggplot2
