採用igraph包分析網路資料
歡迎關注微信公眾號《生信修煉手冊》!
對於網路的視覺化和資料探勘,有很多圖形介面的軟體可供選擇,比如cytoscape, gephi 等等,這些軟體使用方便,操作簡單,功能的強大,但是同時也有著一個缺點,就是無法自動處理,只能通過人工點選滑鼠來操作,對於大批量資料的分析而言,依靠人工費事費力。
為了能夠自動化程式設計處理,有很多的程式被開發出來,專門用於網路資料的視覺化和分析,igraph就是其中的佼佼者。igraph是一個開源專案,旨在提供一個簡單易用,功能強大的網路資料處理框架,在R,Python, C語言中都有具體實現,網址如下
本篇以R語言為例,展示其用法。在R語言中,對應的包名為igraph
, 安裝方式如下
install.packages("igraph")
network對應的資料結構為graph
, 通常用大寫字母G
表示,頂點的英文為vertex
, 用大寫字母V
表示,邊的英文為edge
, 用大寫字母E
表示。對於igraph
而言,常用的操作包括以下幾種
1. 在R中建立一個network
建立network有很多種方式,這裡我們只展示最常用的一種,從檔案中讀取節點和邊的資訊,然後在R中建立一個network, 對於節點而言,檔案內容示例如下
每一行代表一個節點,每一列代表一個節點的屬性,可以有很多列,這裡只給出了兩個基本屬性,id
name
表示節點上標記的字元,其他屬性可以自定義,比如如果節點有分類資訊,可以加一個type
列。
對於邊而言,檔案內容示例如下
每一行代表一條邊,from
和to
指定一條邊所連線的兩個頂點,後面的列是邊對應的屬性,可以自定義。
在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
包,可以自動化的程式設計處理網路資料。
掃描關注微訊號,更多精彩內容等著你!