1. 程式人生 > >採用igraph包分析網路資料

採用igraph包分析網路資料

歡迎關注微信公眾號《生信修煉手冊》!

對於網路的視覺化和資料探勘,有很多圖形介面的軟體可供選擇,比如cytoscape, gephi 等等,這些軟體使用方便,操作簡單,功能的強大,但是同時也有著一個缺點,就是無法自動處理,只能通過人工點選滑鼠來操作,對於大批量資料的分析而言,依靠人工費事費力。

為了能夠自動化程式設計處理,有很多的程式被開發出來,專門用於網路資料的視覺化和分析,igraph就是其中的佼佼者。igraph是一個開源專案,旨在提供一個簡單易用,功能強大的網路資料處理框架,在R,Python, C語言中都有具體實現,網址如下

http://igraph.org/

在這裡插入圖片描述

本篇以R語言為例,展示其用法。在R語言中,對應的包名為igraph, 安裝方式如下

install.packages("igraph")

network對應的資料結構為graph, 通常用大寫字母G表示,頂點的英文為vertex, 用大寫字母V表示,邊的英文為edge, 用大寫字母E表示。對於igraph而言,常用的操作包括以下幾種

1. 在R中建立一個network

建立network有很多種方式,這裡我們只展示最常用的一種,從檔案中讀取節點和邊的資訊,然後在R中建立一個network, 對於節點而言,檔案內容示例如下
在這裡插入圖片描述
每一行代表一個節點,每一列代表一個節點的屬性,可以有很多列,這裡只給出了兩個基本屬性,id

用來唯一表徵一個節點, name表示節點上標記的字元,其他屬性可以自定義,比如如果節點有分類資訊,可以加一個type列。

對於邊而言,檔案內容示例如下
在這裡插入圖片描述
每一行代表一條邊,fromto指定一條邊所連線的兩個頂點,後面的列是邊對應的屬性,可以自定義。

在R中,讀取檔案並建立network的程式碼如下

# 載入包
library(igraph)

# 讀取節點檔案
nodes <- read.table("nodes.txt")

# 讀取邊檔案
links <- read.table("links.txt")

# 建立netwok
net <- graph_from_data_frame(
d = links,
vertices = nodes,
directed = F)

directed引數代表建立的network是否為有向圖。建立好之後,可以通過V(net)$name訪問節點的屬性,類似的,通過E(net)$type訪問邊的屬性。

2. 視覺化

建立好之後,可以對網路進行視覺化。在視覺化時,有兩個因素需要考慮,一個就是節點和邊的屬性展示,比如節點的顏色,不同分類的節點是否用不同顏色展示,另外一個就是layout佈局,選擇何種佈局演算法,在igraph中,可以方便的進行處理

第一個例子展示如何根據邊的屬性對邊的顏色進行劃分,示例如下

# 設定不同type的邊顏色不同
E(net)$color <-  "red"
index <- E(net)$type == "mention"
E(net)$color <- "green"

# 視覺化
plot(
net,
vertex.color = "gray50",
edge.color = E(net)$color
)

根據type屬性,自定義了一個color屬性,不同type對應不同顏色,在視覺化時,直接指定邊的顏色為我們自定義的color屬性就可以了,對於節點的顏色,統一指定為灰色。plot函式還支援非常多的屬性,詳細引數請參考函式的幫助文件。

第二個例子展示佈局,對於layout而言,在igraph中,有非常多的佈局演算法,具體的可以檢視layout函式的幫助文件,呼叫佈局演算法繪圖的程式碼如下

plot(net, layout = layout_in_circle)

3. 統計網路的拓撲屬性

通過``統計節點的度,用法如下

> degree(g, mode="all")
[1] 3 4 3 2 2 1 1

通過edge_dentisy統計密度,用法如下

> edge_density(net)
[1] 0.3809524

通過transitivity函式統計clustering coefficient, 用法如下

> transitivity(g, type="global")
[1] 0.4285714
> transitivity(g, type="local")
[1] 0.6666667 0.3333333 0.0000000 1.0000000
> transitivity(g, type="average")
[1] 0.6

4. 對網路進行聚類

igraph中,支援多種網路聚類演算法,來挖掘複雜網路中的community, 示例如下

cfg <- cluster_fast_greedy(net)
plot(cfg, net)

cluster_fast_greedy呼叫fast greedy algorithm演算法,來預測community,其他聚類函式的用法和上述用法一致,生成的圖片如下
在這裡插入圖片描述
節點對應的community資訊可以從cfg這個物件中得到

> cfg
IGRAPH clustering fast greedy, groups: 10, mod: 0.77
+ groups:
  $`1`
   [1]  5  6 13 16 31 32 54 59 63 67 69 72 75
  
  $`2`
   [1]  8 10 18 44 45 50 55 66 68 74 7

對於每個community, 可以通過如下方式得到其子圖,

nodes <- V(net)[cfg$membership == 1]
g <- induced_subgraph(net, nodes)
plot(g, layout = layout_in_circle)

生成的圖片如下
在這裡插入圖片描述
通過igraph包,可以自動化的程式設計處理網路資料。

掃描關注微訊號,更多精彩內容等著你!
在這裡插入圖片描述