R语言如何绘制桑基图

前言

本篇是R包ggalluvial绘制桑基图的教程。

什么是桑基图

桑基图(Sankey Diagram),即桑基能量分流图,也叫桑基能量平衡图。图中延伸的分支的宽度对应数据流量的大小。

桑基图主要由边、流量和节点组成,其中边代表了流动的数据,流量代表了流动数据的具体数值,节点代表了不同分类。边的宽度与流量成比例地显示,边越宽,数值越大。

桑基图原则上要保持能量的守恒。无论数据怎样流动,数据的总量从开始到结束都不能有变化,不能在中间过程创造出数据,损耗的数据应该流向表示损耗的结点。

绘图前的数据准备

前三列是桑基图结点的流向,从CLass1流向Class2,再流向Class3;Freq是这个流的大小。

demo数据可以从这下载:https://www.r2omics.cn/res/demodata/sankey.txt

# A tibble: 9 x 4
  Class1 Class2 CLass3  Freq
  <chr>  <chr>  <chr>  <int>
1 S1     S2     S2         1
2 S1     S2     S1         3
3 S1     S3     S2         2
4 S1     S1     S1         3
5 S1     S1     S3         1
6 S2     S1     S1         2
7 S2     S1     S2         2
8 S2     S3     S3         1
9 S2     S2     S2         1

R语言如何绘制桑基图

# 代码来源:https://www.r2omics.cn/
# 加载包
library(ggalluvial)

# 读数据
df = read.delim("https://www.bioladder.cn/shiny/zyp/bioladder2/demoData/sankeyNetwork/data.txt")

# 转换为长数据,更通用
dfLong = to_lodes_form(data.frame(df),
                       key = "x",
                       axes = 1:3)  # 将第1到3列进行宽边长转换,记得根据实际数据做调整

# 绘图
ggplot(data = dfLong,
       aes(x = x, 
           stratum = stratum, 
           alluvium = alluvium,
           y = Freq, 
           label = stratum,
           fill = stratum)) +
  geom_alluvium(fill = "darkgray") +  # 流向:完全的能量守恒
  # geom_flow(fill = "darkgray")+     # 流向:不完全的能量守恒
  geom_stratum() +                    # 结点柱子
  geom_text(stat = "stratum") +       # 柱子上的文字标签
  theme_void()                        # ggplot2主题方案:空白