可视化:网络图

作者: 生信云笔记 | 来源:发表于2023-01-13 21:33 被阅读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
    可视化:和弦图

    相关文章

      网友评论

        本文标题:可视化:网络图

        本文链接:https://www.haomeiwen.com/subject/dobgcdtx.html