使用网络图展示Venn图集合及Cytoscape操作演示
前几天,有同学咨询这样的网络图如何实现。
微生物OTU在植物不同组织中的存在及交集关系,作者使用网络图作为呈现。图中各个圆形小节点代表不同的微生物OTU,不同颜色表示其属于不同的分类;3个大节点代表植物不同部位的组织。特定微生物OTU在对应植物组织中存在就绘制一条边,不存在就没有边,图中的数字表示了各组织区域中交集/或特有微生物OTU的数量。
当然这种图反映的主要信息和Venn图是非常像的,组间元素的交集关系。不过相比之下,网络图的形似展示了更丰富的内容,如集合中元素的分类等。
联想到大佬师兄在3年前发表的一篇文献中,也使用到了这种方法描述集合关系(不同类群微生物对各试验处理环境的响应状态)。师兄文章里称这种网络图为“Bipartite association network”。
(Temporal dynamics of microbial communities in microcosms in response to pollutants)
模仿上述第一个的风格录制了Cytoscape的操作过程,这里分享下。
下文用到的数据集的网盘链接(提取码,et55):
https://pan.baidu.com/s/16kWHL5fp722lX5MNsVsO-w
准备数据
类似地,本篇首先从给定的微生物OTU丰度表出发,在R中计算各OTU在各样本中的存在状态,获取交集关系后输出网络边列表和节点属性列表,以便导入至Cytoscape中构建网络。
网盘示例数据内容如下。
“OTU.txt”是微生物OTU丰度表,记录了各OTU在各个样本(或分组)中的丰度,示例数据中包含Root、Rhizosphere和Soil共3个样本作演示。
“taxonomy.txt”记录了微生物OTU的分类,示例数据以这些OTU所属的门分类(界门纲目科属种的门)水平为例。
接下来,将这两个文件读入到R中稍作处理,根据OTU丰度表计算各样本(或分组)交集/或特有OTU的数量,并将OTU-样本对应关系(是否存在,以及存在丰度等)整理为能够被Cytoscape识别的网络边列表以在后续构建网络,同时根据OTU所属分类及样本已知分组获得节点属性列表以方便后续调整网络布局。
##读取数据,OTU 丰度表和注释信息
otu <- read.delim('OTU.txt', row.names = 1, stringsAsFactors = FALSE)
tax <- read.delim('taxonomy.txt', row.names = 1, stringsAsFactors = FALSE)
##转换为边列表,即 OTU 和样本的对应关系
#结果中,所有非 0 的值代表该 OTU 在该样本中存在丰度
edge <- otu
edge$OTU <- rownames(edge)
edge <- reshape2::melt(edge, id = 'OTU')
#删除不存在的边
#即去除 0 丰度的值,该 OTU 不在该样本中存在
edge <- subset(edge, value != 0)
#修改列名称(以便后续软件识别),其中权重可表示为 OTU 在样本中的丰度
names(edge) <- c('source', 'target', 'weight')
#添加一列“shared name”,以“->”连接 source 和 target
#便于 cytoscape 读取识别,并防止读取后的名称错乱
edge$'shared name' <- paste(edge$source, edge$target, sep = '->')
#输出边列表,后续可导入至 cytoscape 用于构建网络
write.table(edge, 'edge.txt', sep = '\t', quote = FALSE, row.names = FALSE)
##获取节点属性列表
#获得 OTU 在各组中的分布状态(Venn 分布)
otu[otu>0] <- 1
otu$venn <- apply(otu, 1, function(x) paste(x, collapse = '-'))
otu <- otu[unique(edge$source), ]
#OTU 属性列表
node_otu <- data.frame(
'shared name' = rownames(otu), #OTU 名称,以“shared name”命名列名称,便于 cytoscape 读取识别,并防止读取后的名称错乱
group1 = tax[unique(edge$source),'phylum'], #用于后续按指定分组赋值颜色,这里定义为 OTU 所属的门分类水平
group2 = 'otu', #用于后续按指定分组定义形状,这里统一分组为“otu”
group3 = otu$venn, #用于后续按指定分组调整聚群,按 OTU 在各组中的分布状态定义
stringsAsFactors = FALSE,
check.names = FALSE
)
#样本属性列表
otu <- otu[-ncol(otu)]
node_sample <- data.frame(
'shared name' = names(otu), #样本名称,以“shared name”命名列名称,便于 cytoscape 读取识别,并防止读取后的名称错乱
group1 = names(otu), #用于后续按指定分组赋值颜色,指定样本分组
group2 = names(otu), #用于后续按指定分组定义形状,指定样本分组
group3 = names(otu), #用于后续按指定分组调整聚群,指定样本分组
stringsAsFactors = FALSE,
check.names = FALSE
)
#二者合并构建节点属性列表后输出,后续可导入至 cytoscape 用于调整节点可视化
node <- rbind(node_otu, node_sample)
write.table(node, 'node.txt', sep = '\t', quote = FALSE, row.names = FALSE)
“edge.txt”中,source列是OTU名称,target列是样本名称,代表了该OTU在该样本中存在,其丰度表示为weight列(0值则代表不存在,已经在过程中去除)。shared name列用于在Cytoscape中定义这条边的名称。
“node.txt”中,shared name列为OTU及样本名称,group1-3则定义了OTU和样本的不同属性的分组,以便在Cytoscape中用作调整节点的颜色、形状、大小、布局等。详见下文视频操作即可。
Cytoscape网络图可视化演示
现在就可以将上述获得的“edge.txt”和“node.txt”导入至Cytoscape中,构建网络图了。
过程录制了视频,网络图的大致风格和开篇所展示的示例图是类似的。不过作为演示,我操作的过程比较糙……但也基本上凑合吧,总之细节方法都展示出来了,比如节点颜色、形状、尺寸、布局、标签设置,边的粗细、透明度等。
注:视频没有声音(除了前3秒有杂音外,这是上传后才发现的但懒得改了),操作过程看鼠标点击的位置和字幕注解即可,还是很好理解的。
备注:bilibili视频链接:https://www.bilibili.com/video/BV15V411o7CX/
10000+:菌群分析 宝宝与猫狗 梅毒狂想曲 提DNA发Nature Cell专刊 肠道指挥大脑
系列教程:微生物组入门 Biostar 微生物组 宏基因组
专业技能:学术图表 高分文章 生信宝典 不可或缺的人
一文读懂:宏基因组 寄生虫益处 进化树
必备技能:提问 搜索 Endnote
文献阅读 热心肠 SemanticScholar Geenmedical
扩增子分析:图表解读 分析流程 统计绘图
16S功能预测 PICRUSt FAPROTAX Bugbase Tax4Fun
在线工具:16S预测培养基 生信绘图
科研经验:云笔记 云协作 公众号
编程模板: Shell R Perl
生物科普: 肠道细菌 人体上的生命 生命大跃进 细胞暗战 人体奥秘
为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外5000+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。PI请明示身份,另有海内外微生物相关PI群供大佬合作交流。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍未解决群内讨论,问题不私聊,帮助同行。
学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”
点击阅读原文,跳转最新文章目录阅读