Cytoscape可视化物种分类树结构
Cytoscape可视化物种分类树结构
前两天偶然看到了这样一张图,听群友说这是Cytoscape调出来的效果,就想试一试。
折腾一番后,发现这个图的工作量貌似蛮大的。因此本篇就只是概括了一下大致的过程,包括如何准备输入数据,以及在Cytoscape可视化时大致上要点击哪些按钮等,并未仔细琢磨成品图。所以,下文略显粗糙,大家有兴趣就看吧……
这其实是个物种分类树,代表的微生物分类。从高级分类水平(界,细菌和真菌)的根节点开始,依次往低分类层级(门纲目科属等)延伸,逐渐形成分支,末端节点应该是OTU或者种水平。因此,分支呈簇状展示,分支的颜色主要按门水平着色,将衍生自同一类门的微生物分支赋值相同的颜色。节点的大小应该对应了微生物的丰度,而节点的颜色主要有两种,猜测红色代表了一些重要的微生物,白色是不重要的。图中文字部分则标识了主要的微生物门所含的节点数量,以及这些微生物的总丰度占比。
好吧,其实白鱼同学并不知道这是来自哪篇文章的插图,不清楚它的任何细节,包括其具体的指代信息以及作者试图表达的意义等,上一段文字纯粹是看图瞎猜的……又懒得问其来源,那就按照这种理解去模仿吧,反正只是随手画个图嘛,不要在意那么多细节。
准备数据
示例数据和预处理R代码的百度盘链接(提取码,sf9f):
https://pan.baidu.com/s/1nS402FLH3lQu8CNq6JjEsA
网盘附件“otu.txt”如下所示,以OTU的丰度为主,后面跟上这些OTU所属的界门纲目科属分类。需要事先把一些注释不明确的物种提前去除(比如unidentified、unknown、others等),否则导致了一些分类关系混乱。然后将它读到R中,整合各个分类水平的包含关系,即上一级分类和下一级分类的对应列表用作边列表,并统计共计多少分类类型及其丰度用作节点列表。
#读入数据
otu <- read.delim('otu.txt', stringsAsFactors = FALSE, check.names = FALSE)#整合各分类层级和所含物种丰度的嵌套关系,构建网络边列表
#source 和 target 分别对应了上下级物种分类层级的对应关系,abundance 表示 target 的丰度
genus_otu <- otu[c('genus', 'otu', 'abundance')]
names(genus_otu) <- c('source', 'target', 'abundance')
family_genus <- aggregate(otu$abundance, by = list(otu$family, otu$genus), FUN = sum)
names(family_genus) <- c('source', 'target', 'abundance')
order_family <- aggregate(otu$abundance, by = list(otu$order, otu$family), FUN = sum)
names(order_family) <- c('source', 'target', 'abundance')
class_order <- aggregate(otu$abundance, by = list(otu$class, otu$order), FUN = sum)
names(class_order) <- c('source', 'target', 'abundance')
phylum_class <- aggregate(otu$abundance, by = list(otu$phylum, otu$class), FUN = sum)
names(phylum_class) <- c('source', 'target', 'abundance')
kingdom_phylum <- aggregate(otu$abundance, by = list(otu$kingdom, otu$phylum), FUN = sum)
names(kingdom_phylum) <- c('source', 'target', 'abundance')edge_list <- rbind(kingdom_phylum, phylum_class, class_order, order_family, family_genus, genus_otu)#将各个分类层级对应至 phylum,以便用于在 Cytoscape 中调整树分支的颜色
otu_phylum <- otu[c('phylum', 'otu')]
names(otu_phylum)[2] <- 'target'
genus_phylum <- otu[c('phylum', 'genus')]
names(genus_phylum)[2] <- 'target'
family_phylum <- otu[c('phylum', 'family')]
names(family_phylum)[2] <- 'target'
order_phylum <- otu[c('phylum', 'order')]
names(order_phylum)[2] <- 'target'
class_phylum <- otu[c('phylum', 'class')]
names(class_phylum)[2] <- 'target'
phylum_phylum <- otu[c('phylum', 'phylum')]
names(phylum_phylum)[2] <- 'target'tax_phylum <- rbind(phylum_phylum, class_phylum, order_phylum, family_phylum, genus_phylum, otu_phylum)
tax_phylum <- tax_phylum[!duplicated(tax_phylum$target), ]
edge_list <- merge(edge_list, tax_phylum, by = 'target', all.x = TRUE)#输出边列表
edge_list <- edge_list[c('source', 'target', 'abundance', 'phylum')]
edge_list$weight <- 1
head(edge_list)write.table(edge_list, 'edge_list.txt', row.names = FALSE, sep = '\t', quote = FALSE)
#构建节点列表,包括各个分类水平的名称,以及所含物种总丰度等
node_list <- reshape2::melt(otu, id = 'abundance')
node_list <- aggregate(node_list$abundance, by = list(node_list$value, node_list$variable), FUN = sum)
names(node_list) <- c('shared name', 'taxonomy', 'abundance')#原始丰度 abundance 的数值差较大,不利于直接使用该列在 Cytoscape 中定义节点大小
#再指定个新列 abundance2,对原始的 abundance 作些转换,比如 log 降低高丰度的权重等
node_list$abundance2 <- log(node_list$abundance+1, 2) #log 转化时加个基数 1#添加节点的 phylum 水平分类
otu_phylum <- otu[c('phylum', 'otu')]
names(otu_phylum)[2] <- 'shared name'
genus_phylum <- otu[c('phylum', 'genus')]
names(genus_phylum)[2] <- 'shared name'
family_phylum <- otu[c('phylum', 'family')]
names(family_phylum)[2] <- 'shared name'
order_phylum <- otu[c('phylum', 'order')]
names(order_phylum)[2] <- 'shared name'
class_phylum <- otu[c('phylum', 'class')]
names(class_phylum)[2] <- 'shared name'
phylum_phylum <- otu[c('phylum', 'phylum')]
names(phylum_phylum)[2] <- 'shared name'tax_phylum <- rbind(phylum_phylum, class_phylum, order_phylum, family_phylum, genus_phylum, otu_phylum)
tax_phylum <- tax_phylum[!duplicated(tax_phylum$'shared name'), ]
node_list <- merge(node_list, tax_phylum, by = 'shared name', all.x = TRUE)#根据事先选择的一些重要节点名称,在节点列表中标识出后输出节点列表
select_node <- read.delim('select_node.txt', stringsAsFactors = FALSE)node_list[which(node_list$'shared name' %in% select_node$id),'select'] <- 1
node_list[which(! node_list$'shared name' %in% select_node$id),'select'] <- 0
head(node_list)write.table(node_list, 'node_list.txt', row.names = FALSE, sep = '\t', quote = FALSE)
Cytoscape的可视化
这样两个输入文件就准备好了,分别为上述R输出的“edge_list.txt”和“node_list.txt”,导入至Cytoscape中进行可视化。
1 读取输入文件
打开Cytoscape后,点击“Import Network from File System”读取边列表,也就是上述输出的“edge_list.txt”;以及点击“Import Table from File”读取节点列表,“node_list.txt”。
文件导入后,Cytoscape中自动呈现一幅网络图,这个网络图的结构就代表了给定的物种分类树了。
2 边的颜色和尺寸等属性调整
点击界面左侧“Style”按钮进入外观调整选项。首先是对边的调整,点击下方“Edge”后进入边样式调整界面。
已知该网络代表了物种分类树,如上所述,从高级分类水平(界)的根节点开始,依次往低分类层级(门纲目科属等)延伸,逐渐形成分支。因此,下游的分类分支都衍生自上游高级分类分支。参考图中将衍生自同一门分类的微生物分支赋值相同的颜色,这里我们效仿,在上文的R操作过程中已经对网络中每条边做了归类,边列表中的“phylum”列就记录了分支对应的门分类水平。点击“Stroke Color”,按边列表中的“phylum”列分配颜色。
边的颜色是主要的调节属性。对于其它的属性,视情况自定义修改。例如如果觉得边太细,就可以点击“Width”将边的尺寸设置的宽一些,使其更清晰。
3 背景色调整
随后,点击下方“Network”,将“Background Paint”背景色设置为黑色。
4 节点的颜色和尺寸等属性调整
然后是对节点的调整,点击下方“Node”后进入节点样式调整界面。
对于节点颜色,点击“Fill Color”,按节点列表中的“select”列分配颜色,将1(标记的重要的微生物)赋值为红色,0(不重要的)赋值为白色。
对于节点形状,勾选下方“Lock node width and height”后,点击“Shape”统一设置为圆形。
对于节点大小,点击“Size”,按节点列表中的“abundance2”列指定大小。该列是个连续的数值,大值对应大点,小值对应小点。
以及点击“Properties”显示出“Label Transparency”选项后统一设置为0,即将节点标签均设置为透明,以去除节点标签。
5 网络布局调整
上述过程都很简单,不再多说了,大家看着来设置就行。
最后是调整网络布局,获得类似示例图中的树状结构。可以先尝试一些自动布局,看看哪些布局风格效果较好。下图展示一些和示例图较为相似的自动布局,以及一些不相似但是可能有趣的自动布局,供大家参考吧。
点击菜单栏“Layout”,提供了N种预设布局;此外“Apps”中可以下载更多样式的插件,例如yFiles布局就是在“Apps”中找的拓展插件之一。
这些自动布局也就是有几分相似而已。一般来说,网络图布局光靠自动布局是难以满足需求的,配合手工调整肯定是免不了的,只是手工调整的过程会很糟心……哦对了,说不定真的有自动布局能够出来示例图样式,只是没找到而已。
以下简单展示一个手工调节布局的过程。以“Prefuse Force Directed Layout (按 weight 列定义布局)”布局为例,因为它的微生物节点分类层次不明确,有待手动拖一下。当然,实际情况中尽可能找一个最相似的布局来,这样可以简化手动的工作量。点击“Select”,按微生物节点所属的门分类水平进行选择,并将选中的节点拉动至一旁,就可和其它类群分开了。随后,设法手动选择节点子集,并拖动将该类群内部的节点的层次结构尽可能区分明显。
把所有节点的层次关系调整好,将微生物的分类关系较好地呈现出,总之工作量挺大的。所以,白鱼同学就没再继续,为了一个示例耗费大量时间在里面就不值得了……本篇教程只是作为方法类指引,帮助大家了解大体上是怎样的操作过程就可以了。真正有需要时,再花点时间配合手工琢磨布局,再慢1天也能搞定了吧。
6 关于文字图例的添加
最后,如果在Cytoscape中调试出了想要的结果,点击“File > Export > Network to Image”将图片导出为pdf矢量图后,放在AI(Adobe Illustrator)中补充文字标签。例如示例图中,微生物门水平的名称、节点数量和所含物种的丰度占比等,就可以通过AI补充。
整体过程大致就这样吧,最麻烦的在布局调整那一步,其它倒还好。总之真要有待于可视化这样一张图的话,有耐心就是了……集中精力,1天差不多也能搞定了。
新出炉的Cytoscape视频教程
Cytoscape制作带bar图和pie图节点的网络图
往期精品(点击图片直达文字对应教程)
后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集
Cytoscape可视化物种分类树结构相关推荐
- Nature子刊:古菌基因组的标准化物种分类方法
基因组物种分类数据库的标准化古菌分类 A standardized archaeal taxonomy for the Genome Taxonomy Database Nature Microbio ...
- EL:固氮能力主要取决于物种分类而不是土壤养分
文章目录 分类学特征决定了低地热带森林中冠层树木对氮的固定 写在前面 摘要 背景 结果 图 1 在干扰条件下六种物种中有结瘤的部分树木的分布 图 2 低地热带森林中99棵豆科植物的N2固定率 图 3 ...
- Python使用matplotlib可视化小提琴图、seaborn中的violinplot函数可视化多分类变量的小提琴图(Violin Plot)
Python使用matplotlib可视化小提琴图.seaborn中的violinplot函数可视化多分类变量的小提琴图(Violin Plot) 目录
- Python使用matplotlib可视化多分类变量组合下分组小提琴图、使用seaborn中的catplot函数可视化多分类变量组合下分组小提琴图(Categorical Plots)
Python使用matplotlib可视化多分类变量组合下分组小提琴图.使用seaborn中的catplot函数可视化多分类变量组合下分组小提琴图(Categorical Plots) 目录
- python使用matplotlib可视化条形图、使用barh函数可视化条形图(使用barh函数可视化多分类的并行条形图、side by side)
python使用matplotlib可视化条形图.使用barh函数可视化条形图(使用barh函数可视化多分类的并行条形图.side by side) 目录
- R语言配对图可视化:pivot_longer函数将宽格式的数据重塑为长格式并进行数据全连接和左连接(left join)、配对图可视化(根据分类变量的值为散点图上的数据点添加颜色)
R语言配对图可视化:pivot_longer函数将宽格式的数据重塑为长格式并进行数据全连接和左连接(left join).配对图可视化(根据分类变量的值为散点图上的数据点添加颜色,Add color ...
- R语言构建logistic回归模型并评估模型:模型预测结果抽样、可视化模型分类预测的概率分布情况、使用WVPlots包绘制ROC曲线并计算AUC值
R语言构建logistic回归模型并评估模型:模型预测结果抽样.可视化模型分类预测的概率分布情况.使用WVPlots包绘制ROC曲线并计算AUC值 目录
- 高维数据PCA降维可视化(KNN分类)
在做机器学习的时候,经常会遇到三个特征以上的数据,这类数据通常被称为高维数据.数据做好类别分类后,通过二维图或者三维图进行可视化,对于高维数据可以通过PCA(Principal Component A ...
- 宏基因组序列物种分类之kraken 1/2和Bracken的使用
细菌基因组测序完,想看看样本有没有被其他的菌污染? 人的转录组测序完,想快速看看人.微生物的序列的比例? 元/宏基因组测序完,想快速获得样本中物种的丰度信息? REFERENCE Wood DE, S ...
最新文章
- 【文本分类】基于改进TF-IDF特征的中文文本分类系统
- 测试书籍推荐(收集)
- Ubuntu安装screen
- Linux帮助信息获取
- bigdecimal如何做除法_二胎家庭如何平衡两个孩子的关系?聪明的父母都懂这四个法则...
- zabbix使用宏自动发现挂载的文件系统并进行监控
- 双盘转子动力学仿真c语言程序,递归牛顿欧拉(正)动力学仿真
- as my sql 后面加表达式_SQL.WITH AS.公用表表达式(CTE)(转)
- VS2015配置jsoncpp详解
- 卡西欧计算机怎么传程序,卡西欧计算器程序传输软件fa-124的使用方法
- [HEOI2016/TJOI2016]序列
- 看朋友日志发现的一个ios下block相关的内存管理问题,非常奇怪,请大家帮忙一起来回答!...
- eclipse中基于maven构建多模块项目
- 树莓派自带wifi工作不正常
- C# http请求挂代理
- Apple邮箱配置QQ邮箱,163邮箱,edu邮箱,gmail邮箱,获取gmail日历
- 上海怎样查询最近三年社保明细
- void*的用法【转】
- LINUX ROUTE命令详解-2
- 如何高效设计游戏——增强游戏体验游戏背景音乐无缝循环
热门文章
- 《大数据》第1期“研究”——大数据管理系统评测基准的 挑战与研究进展(上)...
- 去重的Set解不出“斯诺登的密码”(洛谷P1603题题解,Java语言描述)
- 【数据结构与算法】哈夫曼树的Java实现
- 浅谈Taro和Apollo在开发过程中的实践
- 基于 Kubernetes 实践弹性的 CI/CD 系统 1
- 简单的自动更新程序实现
- 读写文件、文件方法、python2的乱码问题、python对passwd文件进行排序
- Lync Server 2013企业版部署系列之四:SQL准备
- NVIDIA显卡Linux驱动180.44正式版
- js操作select相关方法(收集)