Cytoscape网络图可视化

可视化:网络图

2023-01-13  本文已影响0人  生信云笔记

  今天继续分享生信分析中常见的图形 -- Network。网络图可以直观地展示复杂系统中各元素之间的联系,从而有助于我们发现网络的特征,揭示元素之间的联系规律。网络图的具体可视化方式有很多,如前面介绍过的一些特定类型的网络图Arc Diagrams和弦图桑基图等都属于网络图的范畴。在生信分析中,网络图经常被用于展示基因之间、基因组区域之间的相互联系。废话不多说,下面进入主题。

创建网络

  想要绘制网络图,首先需要创建网络,下面我们使用igraph包来展示如何创建网络:

library(igraph)

vertices <- data.frame(name=c('A','B','C','D','E'))
edges <- data.frame(from=c('A','B','C','D','E'),to=c('B','C','A','E','B'))
net <- graph_from_data_frame(edges, directed=T, vertices=vertices)
net
IGRAPH 70d9213 DN-- 5 5 --
+ attr: name (v/c)
+ edges from 70d9213 (vertex names):
[1] A->B B->C C->A D->E E->B

  从数据框创建网络,需要准备好两个数据框,一个是顶点数据框,包含所有顶点相关的数据,至少一列,其余的列作为顶点的属性;另外一个是边数据框,包含所有边相关的数据,即顶点之间的相互关系,至少包含两列,多余的列作为边的属性。创建网络时,可以调整参数directed来选择创建无向网络或者有向网络(方向从边数据框的第一列到第二列)。

adjm <- matrix(sample(0:1, 100, replace=TRUE, prob=c(0.9,0.1)), nc=10)
adjm
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0    0    0    0    0    0    0    0     0
 [2,]    0    0    0    0    0    0    0    0    0     0
 [3,]    1    0    0    0    0    0    1    0    0     1
 [4,]    0    0    0    0    0    0    0    1    0     0
 [5,]    0    0    0    0    0    0    0    0    0     1
 [6,]    1    0    0    0    0    0    0    0    0     0
 [7,]    0    0    0    0    0    0    0    0    0     0
 [8,]    0    1    0    0    1    0    0    0    0     0
 [9,]    0    1    1    0    0    0    0    0    0     0
[10,]    0    1    0    0    0    0    1    0    0     0

g1 <- graph_from_adjacency_matrix(adjm)
g1
IGRAPH bec5380 D--- 10 12 --
+ edges from bec5380:
 [1]  3-> 1  3-> 7  3->10  4-> 8  5->10  6-> 1  8-> 2  8-> 5  9-> 2  9-> 3
[11] 10-> 2 10-> 7

g2 <- graph_from_adjacency_matrix(t(adjm))
g2
IGRAPH 93bf652 D--- 10 12 --
+ edges from 93bf652:
 [1]  1-> 3  1-> 6  2-> 8  2-> 9  2->10  3-> 9  5-> 8  7-> 3  7->10  8-> 4
[11] 10-> 3 10-> 5

  使用矩阵创建网络更为简单。从上面的结果不难看出(g1),使用矩阵创建有向网络时,方向是从行到列,这一点需要留心以免方向弄反了。

绘图

  下面使用R里面的mtcars数据集,来演示展示绘制网络图的过程:

library(RColorBrewer)

mat <- cor(t(mtcars[,c(1,3:6)]))
mat[mat < 0.995] <- 0
network <- graph_from_adjacency_matrix( mat, weighted=T, mode="undirected", diag=F)
coul <- brewer.pal(nlevels(as.factor(mtcars$cyl)), "Set2")
mycolor <- coul[as.numeric(as.factor(mtcars$cyl))]

par(bg="grey13", mar=c(1,1,1,1))
plot(network, vertex.size=15, vertex.color=mycolor, vertex.label.cex=0.6, vertex.label.color="white", layout=layout.circle)
legend(x=0.8, y=-0.85, legend=paste( levels(as.factor(mtcars$cyl)), " cylinders", sep=""),
       title = 'network', col = coul , bty = "n", pch=20 , pt.cex = 2, cex = 0.7, text.col="white" , horiz = F)

结果如下:

  绘图过程还是挺容易的,只需自定义一些颜色,修改一下布局,就可以绘制出充满高级感的图。当然,对于给图化妆美化的能力,我觉得网友们应该比本人厉害,这里就班门弄斧了。不过,对于布局我们可以借用igraph包提供的模板,如果不满意可以稍加修改,省时省力岂不美哉!该包可是自带了不少的布局模块,想要符合数据的美图可自行尝试。

layouts <- grep("^layout\\.", ls("package:igraph"), value=T)
layouts
 [1] "layout.auto"                      "layout.bipartite"
 [3] "layout.circle"                    "layout.davidson.harel"
 [5] "layout.drl"                       "layout.fruchterman.reingold"
 [7] "layout.fruchterman.reingold.grid" "layout.gem"
 [9] "layout.graphopt"                  "layout.grid"
[11] "layout.grid.3d"                   "layout.kamada.kawai"
[13] "layout.lgl"                       "layout.mds"
[15] "layout.merge"                     "layout.norm"
[17] "layout.random"                    "layout.reingold.tilford"
[19] "layout.sphere"                    "layout.spring"
[21] "layout.star"                      "layout.sugiyama"
[23] "layout.svd"

结束语

  igraph的图形调整参数还有很多,这里就不介绍了,如果需要的话可以参考这篇帖子:https://www.jianshu.com/p/a40b7534155c。当然,可以画网络图的包还有其他选择,比如visNetworkggraph以及画圈圈图最厉害的circlize。春节即将到来,小编也即将放假准备返乡过年了,所以这也是年前最后更新的一个帖子了。回想这一年写了三十来个帖子,虽然阅读量有些感人,但小编心里还是觉得有所获。因为在这个过程中自身学习和巩固了一些知识,并且记录下来能让需要的人看到,这也是自己做分享的初衷。好了,不啰嗦了,咱们来年见~~~

往期回顾

可视化:Wordcloud
可视化:Dumbbell Chart
可视化:Arc Diagrams
可视化:circular dendrogram
可视化:和弦图

上一篇下一篇

猜你喜欢

热点阅读