1. 程式人生 > >igraph軟體包建立圖和網路(建立鄰接矩陣)

igraph軟體包建立圖和網路(建立鄰接矩陣)

一、igraph軟體包建立圖和網路

igraph 是一個獨立的庫,底層是 C,上層有 Python 和 R 介面,主要做圖和網路方面的計算,附帶繪圖功能。

除錯頂點的大小(引數vertex.size)和頂點標籤(引數vertex.label.cex)的大小。

igraph中圖的資料結構
igraph中基本的graph structure採用的是EdgeList,所以在igraph中自然而然的允許multiedge的存在,當然它也提供了Adjancency list(對某些演算法,大部分演算法接受的引數是edgelist)。資料結構igraph_t定義如下:
typedef struct igraph_s {
igraph_integer_t n; #圖的頂點個數
igraph_bool_t directed; #有向圖,無向圖
igraph_vector_t from; #邊的起點
igraph_vector_t to; #邊的終點
igraph_vector_t oi; #尾結點下標
igraph_vector_t ii; #頭結點下標
igraph_vector_t os;
igraph_vector_t is;
void *attr;
} igraph_t;

igraph中頂點和邊都是從0開始編號。n是圖的頂點個數,directed是有向圖示識。所有邊的頂點儲存在from和to兩個向量(igraph_vector_t)中,oi[e]對應的是編號為e的邊所對應的尾結點在from中的index,同樣ii[e]對應於e的頭節點在to中的index(也就是是說e 可以表示為 from[oi[e]] -> to[ii[e]])。所以from,to,oi,ii都是長度與邊數相同的向量。

os和is則和oi,ii相反,表示的是從頂點到邊的對映,從頂點v出發的第一條邊為 from[oi[os[v]]] -> to[ii[os[v]]],所以當os[v] == os[v + 1]時候就表示從該頂點沒有出邊。向量is同理。os,is都是長度為頂點數加一的向量。

操作igraph_t的一些基本API如igraph_empty, igraph_adjacent等見於文件手冊。

因為採用的是edgelist的結構,所以增/減邊(頂點)的操作在igraph中是相當耗費時間的。add和delete操作的時間複雜度基本上都是O(|V| + |E|)或者O(|V|)。


二、例題

eg1.有weight的圖

require(igraph)
d = data.frame(p1 = c('a', 'b', 'c'),
p2 = c('b', 'c', 'a'),
weight = c(1, 2, 4))
g = graph.data.frame(d, directed = TRUE) #有向圖
plot(g, edge.width=E(g)$weight)

eg2. 頂點的顏色

ramp =colorRamp(c("red", "white","blue"));

#ramp(seq(0, 1, length = length(unique(label))))

panel=rgb( ramp(seq(0, 1, length = length(unique(label)))), max = 255)#設定顏色

使用者可以根據color、rgb值和hsv值來設定不同的顏色

註釋:R語言設定顏色的方法

library(grDevices);
ramp <- colorRamp(c("red", "white","blue"));
ramp(seq(0, 1, length = 5))
[,1] [,2] [,3]
[1,] 255.0 0.0 0.0
[2,] 255.0 127.5 127.5
[3,] 255.0 255.0 255.0
[4,] 127.5 127.5 255.0
[5,] 0.0 0.0 255.0
color<-rgb( ramp(seq(0, 1, length = 5)), max = 255)
color
[1] "#FF0000" "#FF7F7F" "#FFFFFF" "#7F7FFF" "#0000FF"

eg3. 鄰接矩陣的圖


library(igraph)
cells<-c(0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,1,0,3,0,3,3,3,0,0,0,0,0,0,0,0,3,0,3,1,1,1,0,0,0,0,0,0,1,1
,0,3,0,0,0,0,1,0,0,0,0,0,1,1,3,1,0,0,3,0,0,0,0,0,0,0,0,0,3,1,0,3,0,0,3,1,0,3,0,0,1,1,3,1,0,0,0,0,0,3,0,3,1,1,0,0,0,0,1,3,3,0,0,3,1,3,0,0,0,0,0,0,0,0,1,3,3,0,0,3,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,1,0)
cells=matrix(cells,14,14,byrow=T) #建立鄰接矩陣
> cells
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
[1,] 0 0 1 0 1 1 0 1 0 0 0 0 0
[2,] 0 0 1 0 1 1 0 1 0 0 0 0 0
[3,] 1 1 0 3 0 3 3 3 0 0 0 0 0
[4,] 0 0 3 0 3 1 1 1 0 0 0 0 0
[5,] 1 1 0 3 0 0 0 0 1 0 0 0 0
[6,] 1 1 3 1 0 0 3 0 0 0 0 0 0
[7,] 0 0 3 1 0 3 0 0 3 1 0 3 0
[8,] 1 1 3 1 0 0 0 0 0 3 0 3 1
[9,] 0 0 0 0 1 3 3 0 0 3 1 3 0
[10,] 0 0 0 0 0 0 1 3 3 0 0 3 1
[11,] 0 0 0 0 0 0 0 0 1 0 0 0 0
[12,] 0 0 0 0 0 0 3 3 3 3 0 0 1
[13,] 0 0 0 0 0 0 0 1 0 1 0 1 0
[14,] 0 0 0 0 0 0 0 1 0 1 0 1 1
[,14]
[1,] 0
[2,] 0
[3,] 0
[4,] 0
[5,] 0
[6,] 0
[7,] 0
[8,] 1
[9,] 0
[10,] 1
[11,] 0
[12,] 1
[13,] 1
[14,] 0
myCoord<-c(1,2,7.5,5,3,6,6,8,8,11,8,10,11,13,2,1,2,4,5.5,1,6,4,9,8,14,5.5,2.2,4)
myCoord<-matrix(myCoord,14,2,byrow=F) #建立頂點座標
> myCoord
[,1] [,2]
[1,] 1.0 2.0
[2,] 2.0 1.0
[3,] 7.5 2.0
[4,] 5.0 4.0
[5,] 3.0 5.5
[6,] 6.0 1.0
[7,] 6.0 6.0
[8,] 8.0 4.0
[9,] 8.0 9.0
[10,] 11.0 8.0
[11,] 8.0 14.0
[12,] 10.0 5.5
[13,] 11.0 2.2
[14,] 13.0 4.0
cnames=paste("e",1:14,sep="") #頂點標籤
> cnames
[1] "e1" "e2" "e3" "e4" "e5" "e6" "e7" "e8" "e9" "e10" "e11" "e12"
[13] "e13" "e14"
g=graph.adjacency(cells,mode="undirected",weighted=T) #建立圖
> g
IGRAPH U-W- 14 35 --
+ attr: weight (e/n)
+ edges:
[1] 1-- 3 1-- 5 1-- 6 1-- 8 2-- 3 2-- 5 2-- 6 2-- 8 3-- 4 3-- 6
[11] 3-- 7 3-- 8 4-- 5 4-- 6 4-- 7 4-- 8 5-- 9 6-- 7 6-- 9 7-- 9
[21] 7--10 7--12 8--10 8--12 8--13 8--14 9--10 9--11 9--12 10--12
[31] 10--13 10--14 12--13 12--14 13--14
plot(g,vertex.color="green",layout=myCoord,vertex.shape="square",
vertex.label=cnames,vertex.label.font=2,vertex.label.dist=-1,
vertex.label.degree=-pi/2,vertex.label.color="black",
vertex.frame.color="gray",
edge.width=E(g)$weight,edge.color="gray")
igraph建立圖igraph建立圖

三、函式應用

1.輸出圖中所有節點

  V(g)$name

  g是相應的圖

2.根據節點degree輸出節點

  V(g)[degree(g)>3] 將圖中degree大於3的節點輸出

  g是相應的圖

3.


V(g) #返回圖g的頂點
E(g) #返回圖g的邊

4.圖形建立:


(1)
> g=graph(c(1,2,5,6,1,4),n=6,directed=T)
> plot(g)
(2)
>g=graph.formula(Alice-Bob-Cecil-Alice,Daniel-Cecil-Engene,Cecil-Gordon)
> plot(g)
(3)
graph.data.frame() #從資料框畫圖
graph.adjacency() #從鄰接矩陣建立圖
(4)
erdos.renyi.game() #根據Erdos-Renyi模型生成隨機圖
ba.game() #根據Barabasi-Albert模型生成scale-free圖
(5)
vcount(g)/ecount(g) #返回圖g的定點數、邊數
is.connected(g) #圖g是否連通
is.clusters(g) #圖g有多少分支
(6)
設定圖的屬性:set/get.graph/vertex/edge() # 具體用法詳見help
5.視覺化
(1)plot()命令 :畫普通的二維圖
(2)tkplot():互動繪圖命令
例:
> library(igraph)
> g=barabasi.game(100,m=1)
>id=tkplot(g,vertex.size=4,vertex.label=NA,edge.color="black",edge.arrow.size=0.7,vertex.color="red")
> coords <- tkplot.getcoords(id)
(3)rgplot:畫3D圖