可视化:网络图

  今天继续分享生信分析中常见的图形 -- 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
可视化:和弦图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容