可视化:网络图
今天继续分享生信分析中常见的图形 -- 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。当然,可以画网络图的包还有其他选择,比如visNetwork
和ggraph
以及画圈圈图最厉害的circlize
。春节即将到来,小编也即将放假准备返乡过年了,所以这也是年前最后更新的一个帖子了。回想这一年写了三十来个帖子,虽然阅读量有些感人,但小编心里还是觉得有所获。因为在这个过程中自身学习和巩固了一些知识,并且记录下来能让需要的人看到,这也是自己做分享的初衷。好了,不啰嗦了,咱们来年见~~~
往期回顾
可视化:Wordcloud
可视化:Dumbbell Chart
可视化:Arc Diagrams
可视化:circular dendrogram
可视化:和弦图