桑基图
桑基图 (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