使用 Cytoscape 画网络互作

一、写在开头

因为项目的原因,必须得画网络互作图,之前一直想用脚本实现,不想手动在可视化的软件界面(因为觉得麻烦),但是又一直找不到合适的,即使找到了也不知道怎么用于我目前项目的数据,就一直拖着。

后来看到好多文献都是用 Cytoscape 这个软件画,我想,那行吧,我学习一下,就利用同事的教程生成了配置文件然后请教了一些问题(特别感谢),花了不少的时间终于鼓捣出来了,虽然结果依旧不美观,但是至少有产出了。

写这个文档,是因为后来发现自己年纪大了,总是有忘记事情的倾向,如果不做记录,隔一段时间不用了,肯定马上就忘了,所有后来总是有记录的习惯,脚本也好,日记也好,技术文档也罢。下边是正式的记录内容:

二、网络互作图简易教程

  1. 生成 Edges 和 Nodes 文件,两种文件格式如下(同事脚本生成的):
    Edges 文件列名: Source Target Correlation LineWidth LineColor
    Nodes 文件列名:Node NodeFontFace NodeSize NodeColor

  2. 导入文件
    Edges 文件导入方法:File -> Import -> Network from File
    Nodes 文件导入方法:File -> Import -> Table from File

  3. 设置格式
    Style 里可以选择默认的网络图模板;
    Node 和 Edge 可以分别设置节点和边的属性;

  4. 布局(拖)网络互作图
    可以删除一些和任何其他节点没有相关性的点,工具栏 Layout 可以选择各种 Layout,因为要看不同门的属水平的网络互作情况,我用的是 Layout -> Group Attributes Layout -> 列名(我的是 Node color , 因为按照不同的门给的颜色),另外在 Mac 上可以 按住 cmd + 触摸板 选择多个进行同时拖动(我过了好久才弄明白)…

  5. 如何设置让节点其他网络图相同的位置相同?
    Layout -> Copycat Layout 就可以选择了,如果没有的话可以去 Apps -> App Manager 下载相应的工具, App Manager 还有其他许多的工具可以下载使用,我还没有尝试太多其他的。

  6. 如何分析网络互作图,比如计算点度中心性(degree centrality),接近中心性(closeness centrality)之类的数据 ?
    Tools -> NetworkAnalyzer -> Network analysis -> Analyze Network -> Treat the network as undirected (我的网络图是无向的)
    然后就可以在下边的 Table Panel 看到关于 Node 和 Edge 的各种计算得出的信息了。

  7. 后续分析以及可视化(比较不同的网络图)
    可以分析共有的节点和特有的节点,这个可以使用 Venn 图或者 Upset 这个包;
    也可以比较衡量网络互作图的各种属性的值,比如接近中心性(closeness centrality);
    也可以比较两种网络图相关性值的分布,我画了箱线图,发现一个组的相关系数和另外一组的显著差异;
    以及其他的。

附:如何用 upset 画图?
1)首先用 python 生成画图的文件, 格式是:行名是边,列名是分组,中间是 0,1 代表有无。

1
2
3
4
5
6
7
8
9
10
# 生成画 upset 的文件, 
se = pd.DataFrame(columns=['CS', 'NS']) # 创建一个数据框
edge = list(set(list(dt['edge']) + list(df['edge']))) # 所有的 边的对
cs_edge = [1 if x in list(dt['edge']) else 0 for x in edge] # 生成 0,1,下同
cs_edge
ns_edge = [1 if x in list(df['edge']) else 0 for x in edge]
se['CS'] = cs_edge
se['NS'] = ns_edge
se.index = edge
se.to_csv('edge.xls', sep = '\t')

2)然后再用 R 的包画图(比较简单):

1
2
3
4
5
6
7
8
library("UpSetR")
pdf("upset.pdf", width=3,height=3)
gene <- read.csv('edge.xls', header = T, sep = '\t')
upset(gene, order.by = "freq",
mb.ratio = c(0.70, 0.30),
#point.size = 2, line.size = 1,
sets.bar.color=c("#24abe1", "#f3796f"), mainbar.y.label = "Edges Intersections", sets.x.label = "Edges Size")
dev.off()

3) 最后竖起你的大拇指,夸自己一下,完成撒花。

三、参考资料

https://kateto.net/tutorials/
谁是社会网络中最重要的人? - 知乎
Draw Venn Diagram
Hacking our way through UpSetR | R-bloggers
https://cran.r-project.org/web/packages/UpSetR/vignettes/basic.usage.html

四、联系方式

我想适当开放一下,可以通过以下方式联系我,但是不保证解决问题.. (因为菜)
邮箱: Pengzai16@gmail.com

(✪ω✪)