2. Networks in igraph

rm(list = ls()) # 清除以前建立的物件
library(igraph) # Load the igraph package
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union

2.1 Create networks

1.無向圖

產生有三個edge的無向圖(undirected graph) edge為:1–> 2、2–> 3、3–> 1

g1 <- graph(edges=c(1,2, 2,3, 3, 1), n = 3, directed = F ) 
plot(g1)

class(g1)
## [1] "igraph"
g1
## IGRAPH 0ff36e7 U--- 3 3 -- 
## + edges from 0ff36e7:
## [1] 1--2 2--3 1--3

2.有向圖

默認的時候是有向圖

g2 <- graph(edges=c(1,2, 2,3, 3, 1), n = 10 )
plot(g2)   

g2
## IGRAPH d2c7306 D--- 10 3 -- 
## + edges from d2c7306:
## [1] 1->2 2->3 3->1

3.命名vertices

g3 <- graph(c("John", "Jim", "Jim", "Jill", "Jill", "John")) #如果有頂點名稱,則不需要節點數
plot(g3)

g3
## IGRAPH 4a06451 DN-- 3 3 -- 
## + attr: name (v/c)
## + edges from 4a06451 (vertex names):
## [1] John->Jim  Jim ->Jill Jill->John

4. Isolate

g4 <- graph(c("John", "Jim", "Jim", "Jack", "Jim", "Jack", "John", "John"), 
             isolates = c("Jesse", "Janis", "Jennifer", "Justin"))

plot(g4, 
     edge.arrow.size = .5,  #箭頭大小
     vertex.color = "gold",  #頂點顏色
     vertex.size = 15,  #頂底大小
     vertex.frame.color = "gray", #頂點外框顏色 
     vertex.label.color = "black",  #頂點標籤顏色
     vertex.label.cex = 0.8,  #標籤文字大小
     vertex.label.dist = 2,  #頂點與標籤距離
     edge.curved = 0.2)  #edge的彎曲程度

5.用破折號和加號畫圖

(破折號數量沒有關係)

plot(graph_from_literal(a---b, b---c))

plot(graph_from_literal(a--+b, b+--c))

plot(graph_from_literal(a+-+b, b+-+c)) 

plot(graph_from_literal(a:b:c---c:d:e))

gl <- graph_from_literal(a-b-c-d-e-f, a-g-h-b, h-e:f:i, j)

plot(gl)

2.2 Edge, vertex, and network attributes

1. Access

E(g4) # g4的edge
## + 4/4 edges from 951c356 (vertex names):
## [1] John->Jim  Jim ->Jack Jim ->Jack John->John
V(g4) # g4的vertices
## + 7/7 vertices, named, from 951c356:
## [1] John     Jim      Jack     Jesse    Janis    Jennifer Justin
g4[] # g4的network matrix
## 7 x 7 sparse Matrix of class "dgCMatrix"
##          John Jim Jack Jesse Janis Jennifer Justin
## John        1   1    .     .     .        .      .
## Jim         .   .    2     .     .        .      .
## Jack        .   .    .     .     .        .      .
## Jesse       .   .    .     .     .        .      .
## Janis       .   .    .     .     .        .      .
## Jennifer    .   .    .     .     .        .      .
## Justin      .   .    .     .     .        .      .
g4[1,] 
##     John      Jim     Jack    Jesse    Janis Jennifer   Justin 
##        1        1        0        0        0        0        0

2. 設定Attributes(屬性)

V(g4)$name # name屬性會在創建network時自動生成
## [1] "John"     "Jim"      "Jack"     "Jesse"    "Janis"    "Jennifer" "Justin"
V(g4)$gender <- c("male", "male", "male", "male", "female", "female", "male")
#為vertices增加新的屬性

E(g4)$type <- "email" # Edge的屬性

E(g4)$weight <- 10    # Edge weight

3. 檢查屬性

edge_attr(g4)
## $type
## [1] "email" "email" "email" "email"
## 
## $weight
## [1] 10 10 10 10
vertex_attr(g4)
## $name
## [1] "John"     "Jim"      "Jack"     "Jesse"    "Janis"    "Jennifer" "Justin"  
## 
## $gender
## [1] "male"   "male"   "male"   "male"   "female" "female" "male"
graph_attr(g4)
## named list()

4. 設定屬性方法2

g4 <- set_graph_attr(g4, "name", "Email Network")
g4 <- set_graph_attr(g4, "something", "A thing")

graph_attr_names(g4)
## [1] "name"      "something"
graph_attr(g4, "name")
## [1] "Email Network"
graph_attr(g4)
## $name
## [1] "Email Network"
## 
## $something
## [1] "A thing"
g4 <- delete_graph_attr(g4, "something")
graph_attr(g4)
## $name
## [1] "Email Network"
plot(g4, 
     edge.arrow.size = .5, 
     vertex.label.color = "black", 
     vertex.label.dist = 1.5,
     vertex.color = c( "pink", "skyblue")[1+(V(g4)$gender == "male")] ) 

g4有兩條從Jim到Jack的edge,以及一條從John到自己的edge,我們可以簡化graph刪除相同節點之間的loop和重複的edge edge.attr.comb():設定要如何合併edge(可能利用sum,mean,prod,min,max,first/last(選第一個)) “ignore”:應該忽略且刪除該屬性

g4s <- simplify(g4, remove.multiple = T, remove.loops = F, 
                 edge.attr.comb = c(weight = "sum", type = "ignore") )

plot(g4s, vertex.label.dist = 1.5)

g4s
## IGRAPH c6b5a83 DNW- 7 3 -- Email Network
## + attr: name (g/c), name (v/c), gender (v/c), weight (e/n)
## + edges from c6b5a83 (vertex names):
## [1] John->John John->Jim  Jim ->Jack
  • D,U:有向/無向圖(directed/undirected graph)
  • N:命名圖(nodes有name的屬性)
  • W:權重圖(edge有weight的屬性)
  • B:二分圖(bipartite (two-mode) graph)(node有type的屬性)

(7 5)代表(node edge)數量
(g/c):graph-level character attribute
(v/c):vertex-level character attribute
(e/n):edge-level numeric attribute

2.3 Specific graphs and graph models

1. Empty graph

eg <- make_empty_graph(40)

plot(eg, vertex.size = 10, vertex.label = NA)

2. Full graph

fg <- make_full_graph(40)

plot(fg, vertex.size = 10, vertex.label = NA)

3. Simple star graph

st <- make_star(40)

plot(st, vertex.size = 10, vertex.label = NA) 

4. Tree graph

tr <- make_tree(40, children = 3, mode = "undirected")

plot(tr, vertex.size = 10, vertex.label = NA) 

5. Ring graph

rn <- make_ring(40)

plot(rn, vertex.size = 10, vertex.label = NA)

6. Erdos-Renyi random graph model

(n:node數,m:edge數)

er <- sample_gnm(n = 100, m = 40) 

plot(er, vertex.size = 6, vertex.label = NA)  

7. Watts-Strogatz small-world model

建立一個個子(dim:維度,size:維度上的節點,p:以p機率隨機分布edge) edge相鄰的為:nei 可以允許loop和multiple edges

sw <- sample_smallworld(dim = 2, size = 10, nei = 1, p = 0.1)

plot(sw, vertex.size = 6, vertex.label = NA, layout = layout_in_circle)

8. Barabasi-Albert preferential attachment model for scale-free graphs

(無比例圖的Barabasi-Albert優先依附模型) n:節點數,power:依附力(1是線性),m:每個時間步上添加的edge

ba <-  sample_pa(n=100, power=1, m=1,  directed=F)
plot(ba, vertex.size=6, vertex.label=NA)

igraph package可以提供著名的歷史圖

zach <- graph("Zachary") # the Zachary carate club

plot(zach, vertex.size = 10, vertex.label = NA)

9. Rewiring a graph

(重新接線圖) each_edge():重新布線的方法,以機率均勻隨機更改edge的端點

rn.rewired <- rewire(rn, each_edge(prob = 0.1))

plot(rn.rewired, vertex.size = 10, vertex.label = NA)

重新將頂點連接到一定距離的其他頂點

rn.neigh = connect.neighborhood(rn, 5)

plot(rn.neigh, vertex.size = 8, vertex.label = NA)

合併graph用%du%:(不相交,假設單獨頂點集合)

plot(rn, vertex.size = 10, vertex.label = NA)

plot(tr, vertex.size = 10, vertex.label = NA)

plot(rn %du% tr, vertex.size = 10, vertex.label = NA)