桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。

也可以视为一种层级网络图,比如展示上一篇文章中的生物信息课程网络图;也可以展示菌群随时间变化的趋势,如3分和30分文章差距在哪里文章所示哈扎人肠道菌群的季节变化规律。

下面将用2个例子,以我们生物信息研讨班涉及的学习框架和课程分配为示例数据,展示如何用常见网络图数据绘制桑基图。

最简单桑基图

第一列为上游,第二列为下游,第三列为联通值,值越大线越粗。如果您自己有数据,只需要替换输入部分,后面数据格式转换代码是通用的。

network <- "Src;Target;Value
Bioinfo;Biology;20
Bioinfo;Math;20
Bioinfo;Program;20
Bioinfo;NGS;20
Program;Linux;8
Program;Python;8
Program;R;6
NGS;RNAseq;1
NGS;ChIPseq;1
NGS;m16Sseq;1
NGS;Metagenome;1
NGS;SingeCellSeq;1
NGS;DNAmethylseq;1
NGS;lncRNA;1
NGS;Exomeseq;1
NGS;TCGA;1
"

network <- read.table(text=network, sep=";", header=T, row.names=NULL, quote="", comment="")

network <- network[,1:3]
colnames(network) <- c("Src", "Target", "Value")

# 转换原始数据点为0起始的一系列整数表示
factor_list <- sort(unique(c(levels(network$Src), levels(network$Target))))
num_list <- 0:(length(factor_list)-1)
levels(network$Src) <- num_list[factor_list %in% levels(network$Src)]
levels(network$Target) <- num_list[factor_list %in% levels(network$Target)]

network$Src <- as.numeric(as.character(network$Src))
network$Target <- as.numeric(as.character(network$Target))

attribute <- data.frame(name=c(factor_list))

network

Src Target Value 

1      2    20 

1      8    20 

1     11    20

1     10    20 

11      6     8 

11     12     8

attribute

head(attribute[, 1]) 

[1] 16Sseq Bioinfo Biology ChIPseq  DNAmethylseq 

[6] Exomeseq

sankeyNetwork(Links = network, Nodes = attribute,
 Source = "Src", Target = "Target",
 Value = "Value", NodeID = "name",
 fontSize= 12, nodeWidth = 30)

b8474f91c900aca265f1b25f2fef811d.png

点线分组桑基图

网络数据比上一步的桑基图多一列,指示线的属性;再提供一个节点分组信息文件,获得层次更鲜明的桑基图。

只需要修改对应的数据,后面格式转换的代码通用。

network <- "Src;Target;Value;Link_Grp
Bioinfo;Biology;20;Main
Bioinfo;Math;20;Main
Bioinfo;Program;20;Main
Bioinfo;NGS;20;Main
Program;Linux;8;Sub
Program;Python;8;Sub
Program;R;6;Sub
NGS;RNAseq;1;Sub
NGS;ChIPseq;1;Sub
NGS;16Sseq;1;Sub
NGS;Metagenome;1;Sub
NGS;SingeCellSeq;1;Sub
NGS;DNAmethylseq;1;Sub
NGS;lncRNA;1;Sub
NGS;Exomeseq;1;Sub
NGS;TCGA;1;Sub
"

network <- read.table(text=network, sep=";", header=T, row.names=NULL, quote="", comment="")

network <- network[,1:4]
colnames(network) <- c("Src", "Target", "Value", "Link_Grp")

factor_list <- sort(unique(c(levels(network$Src), levels(network$Target))))
num_list <- 0:(length(factor_list)-1)
levels(network$Src) <- num_list[factor_list %in% levels(network$Src)]
levels(network$Target) <- num_list[factor_list %in% levels(network$Target)]

network$Src <- as.numeric(as.character(network$Src))
network$Target <- as.numeric(as.character(network$Target))

# 只需要前两列
attribute <- "name;group;size
Bioinfo;Class;4
Biology;Class;4
Math;Class;4
Program;Class;4
NGS;Class;4
Linux;On;2
Python;Off;2
R;Off;2
RNAseq;Off;1
ChIPseq;On;1
16Sseq;On;1
Metagenome;On;1
SingeCellSeq;InPrepare;1
DNAmethylseq;InPrepare;1
lncRNA;InPrepare;1
Exomeseq;InPrepare;1
TCGA;InPrepare;1"

attribute <- read.table(text=attribute, sep=";", header=T, row.names=NULL, quote="", comment="")
attribute <- attribute[,1:2]
colnames(attribute) <- c("name", "group")
attribute <- attribute[match(factor_list, attribute$name),]

sankeyNetwork(Links = network, Nodes = attribute,
 Source = "Src", Target = "Target",
 Value = "Value", NodeID = "name",
 NodeGroup = "group", LinkGroup = "Link_Grp",
 fontSize= 14, nodeWidth = 30)

248048a18cef3ed9c950a96d3ae54e82.png

桑基图还有类似的称为冲击图 (alluvial diagram)的展示,具体可见ggalluvial:冲击图展示组间变化、时间序列和复杂多属性alluvial diagram

说到交互式可视化,还有之前推出的:

往期精品(点击图片直达文字对应教程)

15ae2824977d67e811e9ddc14853f258.png

795a10e0178b2d8b3c528b59f9e2f5c1.png

3d04e9da98f8244a87feb4adbe4771f5.png

a6cdbf6da3833d47cd0c66d3c9986a24.png

100bd33259f9e6ae44920b7f2b99ec50.png

5b2ff19b418cf058049722c0105ce81c.png

34dad02c4ca73ccef465d33dc787e974.png

5cf78de8fe15656a249eac53af0bc314.png

ff4da583c0c5f585e7fdb673ac766c2f.png

3e1a189f004ef6f666dba2e01482a311.png

d3ee36fdc5d6a35e47561ae46c287403.png

26df8b5f0656e49e78fcc75c86a584ef.png

73c742ee3cd58c7dacc272cd7b99e8e4.png

b627b026568e51b434156a1aa6f0e482.png

8091ae4235092be2dc4abd48a124cd22.png

9fb855ca2d15a7bbd27c159e9d94549d.png

abe70ac4f792a2e1fa46b325c75be0ee.png

e49f1a3fdbf0edc08478513588df9cde.png

7573a579e62d26dd39deb263cc317042.png

0e3730734e8c8ebc30c1ac1df740ed3d.png

404aed2847c1e44e20447241f9c49c48.png

3cab208b88930df7fc9acc73959302b1.png

d5b32fbb4b2b1a39a861a54b5c7ffeaf.png

22d93dcb05417406ff58bef0ce70883e.png

24d32a820c64b8e000d8b05785a1aaee.png

36e1fb87ff404ebbc5beee25325626ff.png

d38a8aac4078486877f09a764c5daeb3.png

76468b3d3b5aa09ac4478810b4bb7cc9.png

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

ed444ff16b56327ff7f3129cb65e4c3d.png

f553b41c762acbb1f21a65104da47586.png

520c4ac34087e0b7543cf87677233931.png

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐