分享

network3D: 交互式桑基图

 微笑如酒 2018-02-21

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

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

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

最简单桑基图

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

network <- 'src;target;valuebioinfo;biology;20bioinfo;math;20bioinfo;program;20bioinfo;ngs;20program;linux;8program;python;8program;r;6ngs;rnaseq;1ngs;chipseq;1ngs;m16sseq;1ngs;metagenome;1ngs;singecellseq;1ngs;dnamethylseq;1ngs;lncrna;1ngs;exomeseq;1ngs;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="">

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)

点线分组桑基图

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

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

network <- 'src;target;value;link_grpbioinfo;biology;20;mainbioinfo;math;20;mainbioinfo;program;20;mainbioinfo;ngs;20;mainprogram;linux;8;subprogram;python;8;subprogram;r;6;subngs;rnaseq;1;subngs;chipseq;1;subngs;16sseq;1;subngs;metagenome;1;subngs;singecellseq;1;subngs;dnamethylseq;1;subngs;lncrna;1;subngs;exomeseq;1;subngs;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;sizebioinfo;class;4biology;class;4math;class;4program;class;4ngs;class;4linux;on;2python;off;2r;off;2rnaseq;off;1chipseq;on;116sseq;on;1metagenome;on;1singecellseq;inprepare;1dnamethylseq;inprepare;1lncrna;inprepare;1exomeseq;inprepare;1tcga;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="">

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

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

精品回顾

画图三字经 生信视频 生信系列教程 心得体会 癌症数据库 

高通量分析 Linux Python 在线画图

(错误矫正基金:如果您在阅读过程中发现文字或命令错误,请留言或加小编微信指出,获取红包或累积奖励。希望大家多监督,反馈。适用于所有原创文章。)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多