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
產生有三個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
默認的時候是有向圖
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
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
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的彎曲程度
(破折號數量沒有關係)
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)
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
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
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()
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
eg <- make_empty_graph(40)
plot(eg, vertex.size = 10, vertex.label = NA)
fg <- make_full_graph(40)
plot(fg, vertex.size = 10, vertex.label = NA)
st <- make_star(40)
plot(st, vertex.size = 10, vertex.label = NA)
tr <- make_tree(40, children = 3, mode = "undirected")
plot(tr, vertex.size = 10, vertex.label = NA)
rn <- make_ring(40)
plot(rn, vertex.size = 10, vertex.label = NA)
(n:node數,m:edge數)
er <- sample_gnm(n = 100, m = 40)
plot(er, vertex.size = 6, vertex.label = NA)
建立一個個子(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)
(無比例圖的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)
(重新接線圖) 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)