3.Reading network data from files

3.1 Dataset1:edgelist

nodes <- read.csv("Dataset1-Media-Example-NODES.csv", header=T, as.is=T)
links <- read.csv("Dataset1-Media-Example-EDGES.csv", header=T, as.is=T)

檢查數據

head(nodes)
##    id               media media.type type.label audience.size
## 1 s01            NY Times          1  Newspaper            20
## 2 s02     Washington Post          1  Newspaper            25
## 3 s03 Wall Street Journal          1  Newspaper            30
## 4 s04           USA Today          1  Newspaper            32
## 5 s05            LA Times          1  Newspaper            20
## 6 s06       New York Post          1  Newspaper            50
head(links)
##   from  to weight      type
## 1  s01 s02     10 hyperlink
## 2  s01 s02     12 hyperlink
## 3  s01 s03     22 hyperlink
## 4  s01 s04     21 hyperlink
## 5  s04 s11     22   mention
## 6  s05 s15     21   mention
nrow(nodes); length(unique(nodes$id))
## [1] 17
## [1] 17
nrow(links); nrow(unique(links[,c("from", "to")]))
## [1] 52
## [1] 49

link比unique的from-to還多:所以存在相同兩個nodes中有multiple links

links[,-3]
##    from  to      type
## 1   s01 s02 hyperlink
## 2   s01 s02 hyperlink
## 3   s01 s03 hyperlink
## 4   s01 s04 hyperlink
## 5   s04 s11   mention
## 6   s05 s15   mention
## 7   s06 s17   mention
## 8   s08 s09   mention
## 9   s08 s09   mention
## 10  s03 s04 hyperlink
## 11  s04 s03 hyperlink
## 12  s01 s15   mention
## 13  s15 s01 hyperlink
## 14  s15 s01 hyperlink
## 15  s16 s17   mention
## 16  s16 s06 hyperlink
## 17  s06 s16 hyperlink
## 18  s09 s10   mention
## 19  s08 s07   mention
## 20  s07 s08   mention
## 21  s07 s10 hyperlink
## 22  s05 s02 hyperlink
## 23  s02 s03 hyperlink
## 24  s02 s01 hyperlink
## 25  s03 s01 hyperlink
## 26  s12 s13 hyperlink
## 27  s12 s14   mention
## 28  s14 s13   mention
## 29  s13 s12 hyperlink
## 30  s05 s09 hyperlink
## 31  s02 s10 hyperlink
## 32  s03 s12 hyperlink
## 33  s04 s06   mention
## 34  s10 s03 hyperlink
## 35  s03 s10   mention
## 36  s04 s12 hyperlink
## 37  s13 s17   mention
## 38  s06 s06 hyperlink
## 39  s14 s11   mention
## 40  s03 s11 hyperlink
## 41  s12 s06   mention
## 42  s04 s17   mention
## 43  s17 s04 hyperlink
## 44  s08 s03 hyperlink
## 45  s03 s08 hyperlink
## 46  s07 s14   mention
## 47  s15 s06 hyperlink
## 48  s15 s04 hyperlink
## 49  s05 s01   mention
## 50  s02 s09 hyperlink
## 51  s03 s05 hyperlink
## 52  s07 s03   mention

3.2 DATASET 2: matrix

nodes2 <- read.csv("Dataset2-Media-User-Example-NODES.csv", header=T, as.is=T)

links2 <- read.csv("Dataset2-Media-User-Example-EDGES.csv", header=T, row.names=1)

檢查數據

head(nodes2)
##    id   media media.type media.name audience.size
## 1 s01     NYT          1  Newspaper            20
## 2 s02    WaPo          1  Newspaper            25
## 3 s03     WSJ          1  Newspaper            30
## 4 s04    USAT          1  Newspaper            32
## 5 s05 LATimes          1  Newspaper            20
## 6 s06     CNN          2         TV            56
head(links2)
##     U01 U02 U03 U04 U05 U06 U07 U08 U09 U10 U11 U12 U13 U14 U15 U16 U17 U18 U19
## s01   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
## s02   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
## s03   0   0   0   0   0   1   1   1   1   0   0   0   0   0   0   0   0   0   0
## s04   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0   0   0
## s05   0   0   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0
## s06   0   0   0   0   0   0   0   0   0   0   0   0   1   1   0   0   1   0   0
##     U20
## s01   0
## s02   1
## s03   0
## s04   0
## s05   0
## s06   0
links2 <- as.matrix(links2)

dim(links2)
## [1] 10 20
dim(nodes2)
## [1] 30  5

4. Turning networks into igraph objects

  • d:edges,前兩個column是每個edge的來源節點ID和目標節點的ID。剩下的是屬性(weight, type, label…)
  • vertices:開頭column為node的ID,剩下的為節點屬性

4.1 Dataset1

library(igraph)
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
net <- graph_from_data_frame(d=links, vertices=nodes, directed=T) 
class(net)
## [1] "igraph"
net
## IGRAPH d5245e0 DNW- 17 49 -- 
## + attr: name (v/c), media (v/c), media.type (v/n), type.label (v/c),
## | audience.size (v/n), type (e/c), weight (e/n)
## + edges from d5245e0 (vertex names):
##  [1] s01->s02 s01->s03 s01->s04 s01->s15 s02->s01 s02->s03 s02->s09 s02->s10
##  [9] s03->s01 s03->s04 s03->s05 s03->s08 s03->s10 s03->s11 s03->s12 s04->s03
## [17] s04->s06 s04->s11 s04->s12 s04->s17 s05->s01 s05->s02 s05->s09 s05->s15
## [25] s06->s06 s06->s16 s06->s17 s07->s03 s07->s08 s07->s10 s07->s14 s08->s03
## [33] s08->s07 s08->s09 s09->s10 s10->s03 s12->s06 s12->s13 s12->s14 s13->s12
## [41] s13->s17 s14->s11 s14->s13 s15->s01 s15->s04 s15->s06 s16->s06 s16->s17
## [49] s17->s04

查看屬性

E(net) # 查看edge
## + 49/49 edges from d5245e0 (vertex names):
##  [1] s01->s02 s01->s03 s01->s04 s01->s15 s02->s01 s02->s03 s02->s09 s02->s10
##  [9] s03->s01 s03->s04 s03->s05 s03->s08 s03->s10 s03->s11 s03->s12 s04->s03
## [17] s04->s06 s04->s11 s04->s12 s04->s17 s05->s01 s05->s02 s05->s09 s05->s15
## [25] s06->s06 s06->s16 s06->s17 s07->s03 s07->s08 s07->s10 s07->s14 s08->s03
## [33] s08->s07 s08->s09 s09->s10 s10->s03 s12->s06 s12->s13 s12->s14 s13->s12
## [41] s13->s17 s14->s11 s14->s13 s15->s01 s15->s04 s15->s06 s16->s06 s16->s17
## [49] s17->s04
V(net) # 查看vertices
## + 17/17 vertices, named, from d5245e0:
##  [1] s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17
E(net)$type # Edge的屬性:"type"
##  [1] "hyperlink" "hyperlink" "hyperlink" "mention"   "hyperlink" "hyperlink"
##  [7] "hyperlink" "hyperlink" "hyperlink" "hyperlink" "hyperlink" "hyperlink"
## [13] "mention"   "hyperlink" "hyperlink" "hyperlink" "mention"   "mention"  
## [19] "hyperlink" "mention"   "mention"   "hyperlink" "hyperlink" "mention"  
## [25] "hyperlink" "hyperlink" "mention"   "mention"   "mention"   "hyperlink"
## [31] "mention"   "hyperlink" "mention"   "mention"   "mention"   "hyperlink"
## [37] "mention"   "hyperlink" "mention"   "hyperlink" "mention"   "mention"  
## [43] "mention"   "hyperlink" "hyperlink" "hyperlink" "hyperlink" "mention"  
## [49] "hyperlink"
V(net)$media # Vertex的屬性:"media"
##  [1] "NY Times"            "Washington Post"     "Wall Street Journal"
##  [4] "USA Today"           "LA Times"            "New York Post"      
##  [7] "CNN"                 "MSNBC"               "FOX News"           
## [10] "ABC"                 "BBC"                 "Yahoo News"         
## [13] "Google News"         "Reuters.com"         "NYTimes.com"        
## [16] "WashingtonPost.com"  "AOL.com"

繪圖

plot(net, edge.arrow.size = 0.4, vertex.label = NA)

移除loop

net <- simplify(net, remove.multiple = F, remove.loops = T)

plot(net, edge.arrow.size = 0.4, vertex.label = NA)

extract an edge list or a matrix

as_edgelist(net, names = T)
##       [,1]  [,2] 
##  [1,] "s01" "s02"
##  [2,] "s01" "s03"
##  [3,] "s01" "s04"
##  [4,] "s01" "s15"
##  [5,] "s02" "s01"
##  [6,] "s02" "s03"
##  [7,] "s02" "s09"
##  [8,] "s02" "s10"
##  [9,] "s03" "s01"
## [10,] "s03" "s04"
## [11,] "s03" "s05"
## [12,] "s03" "s08"
## [13,] "s03" "s10"
## [14,] "s03" "s11"
## [15,] "s03" "s12"
## [16,] "s04" "s03"
## [17,] "s04" "s06"
## [18,] "s04" "s11"
## [19,] "s04" "s12"
## [20,] "s04" "s17"
## [21,] "s05" "s01"
## [22,] "s05" "s02"
## [23,] "s05" "s09"
## [24,] "s05" "s15"
## [25,] "s06" "s16"
## [26,] "s06" "s17"
## [27,] "s07" "s03"
## [28,] "s07" "s08"
## [29,] "s07" "s10"
## [30,] "s07" "s14"
## [31,] "s08" "s03"
## [32,] "s08" "s07"
## [33,] "s08" "s09"
## [34,] "s09" "s10"
## [35,] "s10" "s03"
## [36,] "s12" "s06"
## [37,] "s12" "s13"
## [38,] "s12" "s14"
## [39,] "s13" "s12"
## [40,] "s13" "s17"
## [41,] "s14" "s11"
## [42,] "s14" "s13"
## [43,] "s15" "s01"
## [44,] "s15" "s04"
## [45,] "s15" "s06"
## [46,] "s16" "s06"
## [47,] "s16" "s17"
## [48,] "s17" "s04"
as_adjacency_matrix(net, attr = "weight")
## 17 x 17 sparse Matrix of class "dgCMatrix"
##    [[ suppressing 17 column names 's01', 's02', 's03' ... ]]
##                                                      
## s01  . 22 22 21 .  .  .  .  .  .  .  .  .  . 20  .  .
## s02 23  . 21  . .  .  .  .  1  5  .  .  .  .  .  .  .
## s03 21  .  . 22 1  .  .  4  .  2  1  1  .  .  .  .  .
## s04  .  . 23  . .  1  .  .  .  . 22  3  .  .  .  .  2
## s05  1 21  .  . .  .  .  .  2  .  .  .  .  . 21  .  .
## s06  .  .  .  . .  .  .  .  .  .  .  .  .  .  . 21 21
## s07  .  .  1  . .  .  . 22  . 21  .  .  .  4  .  .  .
## s08  .  .  2  . .  . 21  . 23  .  .  .  .  .  .  .  .
## s09  .  .  .  . .  .  .  .  . 21  .  .  .  .  .  .  .
## s10  .  .  2  . .  .  .  .  .  .  .  .  .  .  .  .  .
## s11  .  .  .  . .  .  .  .  .  .  .  .  .  .  .  .  .
## s12  .  .  .  . .  2  .  .  .  .  .  . 22 22  .  .  .
## s13  .  .  .  . .  .  .  .  .  .  . 21  .  .  .  .  1
## s14  .  .  .  . .  .  .  .  .  .  1  . 21  .  .  .  .
## s15 22  .  .  1 .  4  .  .  .  .  .  .  .  .  .  .  .
## s16  .  .  .  . . 23  .  .  .  .  .  .  .  .  .  . 21
## s17  .  .  .  4 .  .  .  .  .  .  .  .  .  .  .  .  .
as_data_frame(net, what = "edge")
##    from  to      type weight
## 1   s01 s02 hyperlink     22
## 2   s01 s03 hyperlink     22
## 3   s01 s04 hyperlink     21
## 4   s01 s15   mention     20
## 5   s02 s01 hyperlink     23
## 6   s02 s03 hyperlink     21
## 7   s02 s09 hyperlink      1
## 8   s02 s10 hyperlink      5
## 9   s03 s01 hyperlink     21
## 10  s03 s04 hyperlink     22
## 11  s03 s05 hyperlink      1
## 12  s03 s08 hyperlink      4
## 13  s03 s10   mention      2
## 14  s03 s11 hyperlink      1
## 15  s03 s12 hyperlink      1
## 16  s04 s03 hyperlink     23
## 17  s04 s06   mention      1
## 18  s04 s11   mention     22
## 19  s04 s12 hyperlink      3
## 20  s04 s17   mention      2
## 21  s05 s01   mention      1
## 22  s05 s02 hyperlink     21
## 23  s05 s09 hyperlink      2
## 24  s05 s15   mention     21
## 25  s06 s16 hyperlink     21
## 26  s06 s17   mention     21
## 27  s07 s03   mention      1
## 28  s07 s08   mention     22
## 29  s07 s10 hyperlink     21
## 30  s07 s14   mention      4
## 31  s08 s03 hyperlink      2
## 32  s08 s07   mention     21
## 33  s08 s09   mention     23
## 34  s09 s10   mention     21
## 35  s10 s03 hyperlink      2
## 36  s12 s06   mention      2
## 37  s12 s13 hyperlink     22
## 38  s12 s14   mention     22
## 39  s13 s12 hyperlink     21
## 40  s13 s17   mention      1
## 41  s14 s11   mention      1
## 42  s14 s13   mention     21
## 43  s15 s01 hyperlink     22
## 44  s15 s04 hyperlink      1
## 45  s15 s06 hyperlink      4
## 46  s16 s06 hyperlink     23
## 47  s16 s17   mention     21
## 48  s17 s04 hyperlink      4
as_data_frame(net, what = "vertices")
##     name               media media.type type.label audience.size
## s01  s01            NY Times          1  Newspaper            20
## s02  s02     Washington Post          1  Newspaper            25
## s03  s03 Wall Street Journal          1  Newspaper            30
## s04  s04           USA Today          1  Newspaper            32
## s05  s05            LA Times          1  Newspaper            20
## s06  s06       New York Post          1  Newspaper            50
## s07  s07                 CNN          2         TV            56
## s08  s08               MSNBC          2         TV            34
## s09  s09            FOX News          2         TV            60
## s10  s10                 ABC          2         TV            23
## s11  s11                 BBC          2         TV            34
## s12  s12          Yahoo News          3     Online            33
## s13  s13         Google News          3     Online            23
## s14  s14         Reuters.com          3     Online            12
## s15  s15         NYTimes.com          3     Online            24
## s16  s16  WashingtonPost.com          3     Online            28
## s17  s17             AOL.com          3     Online            33

4.2dataset2

轉為graph

bipartite networks有“type”的屬性(值為T/F)

head(nodes2)
##    id   media media.type media.name audience.size
## 1 s01     NYT          1  Newspaper            20
## 2 s02    WaPo          1  Newspaper            25
## 3 s03     WSJ          1  Newspaper            30
## 4 s04    USAT          1  Newspaper            32
## 5 s05 LATimes          1  Newspaper            20
## 6 s06     CNN          2         TV            56
head(links2)
##     U01 U02 U03 U04 U05 U06 U07 U08 U09 U10 U11 U12 U13 U14 U15 U16 U17 U18 U19
## s01   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
## s02   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
## s03   0   0   0   0   0   1   1   1   1   0   0   0   0   0   0   0   0   0   0
## s04   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0   0   0
## s05   0   0   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0
## s06   0   0   0   0   0   0   0   0   0   0   0   0   1   1   0   0   1   0   0
##     U20
## s01   0
## s02   1
## s03   0
## s04   0
## s05   0
## s06   0
net2 <- graph_from_incidence_matrix(links2)

table(V(net2)$type)
## 
## FALSE  TRUE 
##    10    20

bipartite共同成員

net2.bp <- bipartite.projection(net2)
as_incidence_matrix(net2) %*% t(as_incidence_matrix(net2))
##     s01 s02 s03 s04 s05 s06 s07 s08 s09 s10
## s01   3   0   0   0   0   0   0   0   0   1
## s02   0   3   0   0   0   0   0   0   1   0
## s03   0   0   4   1   0   0   0   0   1   0
## s04   0   0   1   3   1   0   0   0   0   1
## s05   0   0   0   1   3   1   0   0   0   1
## s06   0   0   0   0   1   3   1   1   0   0
## s07   0   0   0   0   0   1   3   1   0   0
## s08   0   0   0   0   0   1   1   4   1   0
## s09   0   1   1   0   0   0   0   1   3   0
## s10   1   0   0   1   1   0   0   0   0   2
t(as_incidence_matrix(net2)) %*% as_incidence_matrix(net2)
##     U01 U02 U03 U04 U05 U06 U07 U08 U09 U10 U11 U12 U13 U14 U15 U16 U17 U18 U19
## U01   2   1   1   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0
## U02   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
## U03   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
## U04   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
## U05   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
## U06   0   0   0   0   0   2   1   1   1   0   0   0   0   0   0   0   0   0   1
## U07   0   0   0   0   0   1   1   1   1   0   0   0   0   0   0   0   0   0   0
## U08   0   0   0   0   0   1   1   1   1   0   0   0   0   0   0   0   0   0   0
## U09   0   0   0   0   0   1   1   1   2   1   1   0   0   0   0   0   0   0   0
## U10   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0   0   0
## U11   1   0   0   0   0   0   0   0   1   1   3   1   1   0   0   0   0   0   0
## U12   0   0   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0
## U13   0   0   0   0   0   0   0   0   0   0   1   1   2   1   0   0   1   0   0
## U14   0   0   0   0   0   0   0   0   0   0   0   0   1   2   1   1   1   0   0
## U15   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   0   0   0
## U16   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   2   1   1   1
## U17   0   0   0   0   0   0   0   0   0   0   0   0   1   1   0   1   2   1   1
## U18   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   1
## U19   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   1   1   1   2
## U20   0   0   0   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   1
##     U20
## U01   0
## U02   0
## U03   0
## U04   1
## U05   1
## U06   1
## U07   0
## U08   0
## U09   0
## U10   0
## U11   0
## U12   0
## U13   0
## U14   0
## U15   0
## U16   0
## U17   0
## U18   0
## U19   1
## U20   2
plot(net2.bp$proj1, vertex.label.color = "black", vertex.label.dist = 1,
     vertex.size = 7, vertex.label = nodes2$media[!is.na(nodes2$media.type)])

plot(net2.bp$proj2, vertex.label.color = "black", vertex.label.dist = 1,
     vertex.size = 7, vertex.label = nodes2$media[is.na(nodes2$media.type)])

5.Plotting networks with igraph

5.1 Plotting parameters

NODES
vertex.color:Node color
vertex.frame.color:Node border color
vertex.shape:One of “none”, “circle”, “square”, “csquare”, “rectangle”, “crectangle”, “vrectangle”, “pie”, “raster”, or “sphere”
vertex.size:Size of the node (default is 15)
vertex.size2:The second size of the node (e.g. for a rectangle)
vertex.label:Character vector used to label the nodes
vertex.label.family:Font family of the label (e.g.“Times”, “Helvetica”)
vertex.label.font:Font: 1 plain, 2 bold, 3, italic, 4 bold italic, 5 symbol
vertex.label.cex:Font size (multiplication factor, device-dependent)
vertex.label.dist:Distance between the label and the vertex
vertex.label.degree:The position of the label in relation to the vertex, where 0 right, “pi” is left, “pi/2” is below, and “-pi/2” is above

EDGES
edge.color:Edge color
edge.width:Edge width, defaults to 1
edge.arrow.size:Arrow size, defaults to 1
edge.arrow.width:Arrow width, defaults to 1
edge.lty:Line type, could be 0 or “blank”, 1 or “solid”, 2 or “dashed”, 3 or “dotted”, 4 or “dotdash”, 5 or “longdash”, 6 or “twodash”
edge.label:Character vector used to label edges
edge.label.family:Font family of the label (e.g.“Times”, “Helvetica”)
edge.label.font:Font 1 plain, 2 bold, 3, italic, 4 bold italic, 5 symbol
edge.label.cex:Font size for edge labels
edge.curved:Edge curvature, range 0-1 (FALSE sets it to 0, TRUE to 0.5)
arrow.mode:Vector specifying whether edges should have arrows, possible values: 0 no arrow, 1 back, 2 forward, 3 both

OTHER
margin:Empty space margins around the plot, vector with length 4
frame:if TRUE, the plot will be framed
main:If set, adds a title to the plot
sub:If set, adds a subtitle to the plot

plot(net, edge.arrow.size = 0.4, edge.curved = 0.1)

plot(net, edge.arrow.size=.2, edge.curved=0,
     vertex.color="orange", vertex.frame.color="#555555",
     vertex.label = V(net)$media, vertex.label.color = "black",
     vertex.label.cex = .7)

改變node的呈現方式

#根據type設定顏色
colors <- c("gray50", "tomato", "gold")
V(net)$color <- colors[V(net)$media.type]

#根據觀眾數量設定大小
V(net)$size <- V(net)$audience.size*0.7

#設定標籤
V(net)$label.color <- "black"
V(net)$label <- NA

#根據weight設定寬度
E(net)$width <- E(net)$weight/6

#設定箭頭
E(net)$arrow.size <- 0.2
E(net)$edge.color <- "gray80"

E(net)$width <- 1+E(net)$weight/12

plot(net)

直接覆蓋屬性

plot(net, edge.color="orange", vertex.color="gray50") 

增加圖示

plot(net)
legend(x = -1.5, y = -1.1, c("Newspaper","Television", "Online News"), 
       pch = 21, col = "#777777", pt.bg = colors, pt.cex = 2, cex = 0.8,
       bty = "n", ncol = 1)

只有標籤的圖

plot(net, vertex.shape = "none", vertex.label=V(net)$media,
     vertex.label.font=2, vertex.label.color="gray40",
     vertex.label.cex=.7, edge.color="gray85")

edge的顏色

ends():取得開始節點

edge.start <- ends(net, es = E(net), names = F)[,1]
edge.col <- V(net)$color[edge.start]

plot(net, edge.color = edge.col, edge.curved = 0.1)

5.2 Network layouts

Network layouts return 每個節點的座標

創造一個Barabasi-Albert model

利用sample_pa()

net.bg <- sample_pa(80)

V(net.bg)$size <- 8
V(net.bg)$frame.color <- "white"
V(net.bg)$color <- "orange"
V(net.bg)$label <- ""
E(net.bg)$arrow.mode <- 0
plot(net.bg)

set layout

plot(net.bg, layout = layout_randomly)

計算頂點座標

l <- layout_in_circle(net.bg)
plot(net.bg, layout = l)

class(l)
## [1] "matrix"

l是n個節點的座標(nx2矩陣)

l <- cbind(1:vcount(net.bg), c(1, vcount(net.bg):2))
plot(net.bg, layout=l)

randomly placed vertices

l <- layout_randomly(net.bg)
plot(net.bg, layout = l)

Circle layout

l <- layout_in_circle(net.bg)
plot(net.bg, layout = l)

3D sphere layout

l <- layout_on_sphere(net.bg)
plot(net.bg, layout = l)

Force-directed layouts-Fruchterman-Reingold

Force-directed layouts:盡可能讓edge不會交叉,當node靠太近時會互相排斥

l <- layout_with_fr(net.bg)
plot(net.bg, layout=l)

設定使graph每次出現的狀態相同

par(mfrow = c(2,2), mar = c(0,0,0,0)) #繪製四張圖(2X2)

plot(net.bg, layout = layout_with_fr)

plot(net.bg, layout = layout_with_fr)

plot(net.bg, layout = l)

plot(net.bg, layout = l)

# 關閉設置圖形的設備
# dev.off()

設置圖形x,y座標

l <- layout_with_fr(net.bg)
l <- norm_coords(l, ymin = -1, ymax = 1, xmin = -1, xmax = 1)

par(mfrow=c(2,2), mar=c(0,0,0,0))

plot(net.bg, rescale=F, layout=l*0.4)

plot(net.bg, rescale=F, layout=l*0.6)

plot(net.bg, rescale=F, layout=l*0.8)

plot(net.bg, rescale=F, layout=l*1.0)

Force-directed layouts-Kamada Kawai

l <- layout_with_kk(net.bg)

plot(net.bg, layout = l)

LGL algorithm

可以設定root(放置中間的節點)

plot(net.bg, layout = layout_with_lgl)

igraph中可以用的layout

layouts <- grep("^layout_", ls("package:igraph"), value=TRUE)[-1] 

# Remove layouts that do not apply to our graph.

layouts <- layouts[!grepl("bipartite|merge|norm|sugiyama|tree", layouts)]



par(mfrow=c(3,3), mar=c(1,1,1,1))

for (layout in layouts) {

  print(layout)

  l <- do.call(layout, list(net)) 

  plot(net, edge.arrow.mode=0, layout=l, main=layout) }
## [1] "layout_as_star"
## [1] "layout_components"
## [1] "layout_in_circle"
## [1] "layout_nicely"
## [1] "layout_on_grid"
## [1] "layout_on_sphere"
## [1] "layout_randomly"
## [1] "layout_with_dh"
## [1] "layout_with_drl"

## [1] "layout_with_fr"
## [1] "layout_with_gem"
## [1] "layout_with_graphopt"
## [1] "layout_with_kk"
## [1] "layout_with_lgl"
## [1] "layout_with_mds"

5.3 Improving network plots

保留重要的部分

hist(links$weight)

mean(links$weight)
## [1] 12.40816
sd(links$weight)
## [1] 9.905635

刪除edge

#把小於平均數的刪掉
cut.off <- mean(links$weight)

net.sp <- delete_edges(net, E(net)[weight < cut.off])

plot(net.sp)

依照type分開畫

E(net)$width <- 1.5

plot(net, edge.color=c("dark red", "slategrey")[(E(net)$type=="hyperlink")+1],

      vertex.color="gray40", layout=layout.circle)

net.m <- net - E(net)[E(net)$type=="hyperlink"] # another way to delete edges

net.h <- net - E(net)[E(net)$type=="mention"]



# Plot the two links separately:

par(mfrow=c(1,2))

plot(net.h, vertex.color="orange", main="Tie: Hyperlink")

plot(net.m, vertex.color="lightsteelblue2", main="Tie: Mention")

layout_with_fr:把圖映射到一個二維畫布=>每個edge長度差不多

# Make sure the nodes stay in place in both plots:

l <- layout_with_fr(net)

plot(net.h, vertex.color="orange", layout=l, main="Tie: Hyperlink")

plot(net.m, vertex.color="lightsteelblue2", layout=l, main="Tie: Mention")

5.4 Interactive plotting with tkplot

# tkid <- tkplot(net) #tkid is the id of the tkplot that will open

# l <- tkplot.getcoords(tkid) # grab the coordinates from tkplot

# tk_close(tkid, window.close = T)

# plot(net, layout=l)

5.5 Other ways to represent a network

heatmap of the network matrix(網絡矩陣的熱圖)

netm <- get.adjacency(net, attr="weight", sparse=F)

colnames(netm) <- V(net)$media

rownames(netm) <- V(net)$media



palf <- colorRampPalette(c("gold", "dark orange")) 

heatmap(netm[,17:1], Rowv = NA, Colv = NA, col = palf(100), 

        scale="none", margins=c(10,10) )

5.6 Plotting two-mode networks with igraph

改變node形狀

#設定顏色
V(net2)$color <- c("steel blue", "orange")[V(net2)$type+1]

#設定形狀
V(net2)$shape <- c("square", "circle")[V(net2)$type+1]

#設定標籤
V(net2)$label <- ""

V(net2)$label[V(net2)$type==F] <- nodes2$media[V(net2)$type==F] 

V(net2)$label.cex=.4

V(net2)$label.font=2


plot(net2, vertex.label.color="white", vertex.size=(2-V(net2)$type)*8) 

bipartite networks

plot(net2, vertex.label=NA, vertex.size=7, layout=layout_as_bipartite) 

node改為標籤

plot(net2, vertex.shape="none", vertex.label=nodes2$media,
     vertex.label.color=V(net2)$color, vertex.label.font=2.5, 
     vertex.label.cex=.6, edge.color="gray70", edge.width=2)

6. Network and node descriptives

6.1 Density

edge_density(net, loops = F)
## [1] 0.1764706
#for a directed network
ecount(net)/(vcount(net)*(vcount(net)-1))
## [1] 0.1764706

6.2 Reciprocity

reciprocity(net)
## [1] 0.4166667
dyad_census(net) #相互,不對稱和nyll節點對
## $mut
## [1] 10
## 
## $asym
## [1] 28
## 
## $null
## [1] 98
2*dyad_census(net)$mut/ecount(net) # Calculating reciprocity
## [1] 0.4166667

6.3 Transitivity

  • global:ratio of triangles (direction disregarded) to connected triples.
  • local: ratio of triangles to connected triples each vertex is part of.
transitivity(net, type = "global") #net被視為無向圖
## [1] 0.372549
transitivity(as.undirected(net, mode = "collapse")) #net被視為無向圖
## [1] 0.372549
transitivity(net, type = "local")
##  [1] 0.2142857 0.4000000 0.1153846 0.1944444 0.5000000 0.2666667 0.2000000
##  [8] 0.1000000 0.3333333 0.3000000 0.3333333 0.2000000 0.1666667 0.1666667
## [15] 0.3000000 0.3333333 0.2000000
triad_census(net) # 有向圖
##  [1] 244 241  80  13  11  27  15  22   4   1   8   4   4   3   3   0

6.4 Diameter

diameter():回傳距離 get_diameter():回傳沿該距離的第一個找到的路徑的節點

diameter(net, directed = F, weights = NA)
## [1] 4
diameter(net, directed=F)
## [1] 28

沒有設定weights = NA,則會使用weight

diam <- get_diameter(net, directed = T)
diam
## + 7/17 vertices, named, from 434c53a:
## [1] s12 s06 s17 s04 s03 s08 s07

回傳的是vertex sequence

class(diam)
## [1] "igraph.vs"
as.vector(diam)
## [1] 12  6 17  4  3  8  7
vcol <- rep("gray40", vcount(net))

vcol[diam] <- "gold"

ecol <- rep("gray80", ecount(net))

ecol[E(net, path=diam)] <- "orange" 

# E(net, path=diam) finds edges along a path, here 'diam'

plot(net, vertex.color=vcol, edge.color=ecol, edge.arrow.mode=0)

6.5 Node degrees

  • in:in-degree
  • out:out-degree
  • all:total degree
  • total:total degree
deg <- degree(net, mode = "all")
plot(net, vertex.size = deg*3) # degree越大圓越大

hist(deg, breaks=1:vcount(net)-1, main="Histogram of node degree")

6.6 Degree distribution

deg.dist <- degree_distribution(net, cumulative = T, mode = "all")
plot(x = 0:max(deg), y = 1-deg.dist, pch = 19, cex = 1.2, col = "orange",
     xlab = "Degree", ylab = "Cumulative Frequency")

6.7 Centrality & centralization

  • Centrality functions (vertex level)
  • Centralization functions (graph level)

Degree

degree(net, mode="in")
## s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17 
##   4   2   6   4   1   4   1   2   3   4   3   3   2   2   2   1   4
centr_degree(net, mode="in", normalized=T)
## $res
##  [1] 4 2 6 4 1 4 1 2 3 4 3 3 2 2 2 1 4
## 
## $centralization
## [1] 0.1985294
## 
## $theoretical_max
## [1] 272

Closeness(親密度)

closeness(net, mode="all", weights=NA) 
##        s01        s02        s03        s04        s05        s06        s07 
## 0.03333333 0.03030303 0.04166667 0.03846154 0.03225806 0.03125000 0.03030303 
##        s08        s09        s10        s11        s12        s13        s14 
## 0.02857143 0.02564103 0.02941176 0.03225806 0.03571429 0.02702703 0.02941176 
##        s15        s16        s17 
## 0.03030303 0.02222222 0.02857143
centr_clo(net, mode="all", normalized=T) 
## $res
##  [1] 0.5333333 0.4848485 0.6666667 0.6153846 0.5161290 0.5000000 0.4848485
##  [8] 0.4571429 0.4102564 0.4705882 0.5161290 0.5714286 0.4324324 0.4705882
## [15] 0.4848485 0.3555556 0.4571429
## 
## $centralization
## [1] 0.3753596
## 
## $theoretical_max
## [1] 7.741935

Eigenvector

eigen_centrality(net, directed=T, weights=NA)
## $vector
##       s01       s02       s03       s04       s05       s06       s07       s08 
## 0.6638179 0.3314674 1.0000000 0.9133129 0.3326443 0.7468249 0.1244195 0.3740317 
##       s09       s10       s11       s12       s13       s14       s15       s16 
## 0.3453324 0.5991652 0.7334202 0.7519086 0.3470857 0.2915055 0.3314674 0.2484270 
##       s17 
## 0.7503292 
## 
## $value
## [1] 3.006215
## 
## $options
## $options$bmat
## [1] "I"
## 
## $options$n
## [1] 17
## 
## $options$which
## [1] "LR"
## 
## $options$nev
## [1] 1
## 
## $options$tol
## [1] 0
## 
## $options$ncv
## [1] 0
## 
## $options$ldv
## [1] 0
## 
## $options$ishift
## [1] 1
## 
## $options$maxiter
## [1] 1000
## 
## $options$nb
## [1] 1
## 
## $options$mode
## [1] 1
## 
## $options$start
## [1] 1
## 
## $options$sigma
## [1] 0
## 
## $options$sigmai
## [1] 0
## 
## $options$info
## [1] 0
## 
## $options$iter
## [1] 7
## 
## $options$nconv
## [1] 1
## 
## $options$numop
## [1] 31
## 
## $options$numopb
## [1] 0
## 
## $options$numreo
## [1] 18
centr_eigen(net, directed=T, normalized=T) 
## $vector
##  [1] 0.6638179 0.3314674 1.0000000 0.9133129 0.3326443 0.7468249 0.1244195
##  [8] 0.3740317 0.3453324 0.5991652 0.7334202 0.7519086 0.3470857 0.2915055
## [15] 0.3314674 0.2484270 0.7503292
## 
## $value
## [1] 3.006215
## 
## $options
## $options$bmat
## [1] "I"
## 
## $options$n
## [1] 17
## 
## $options$which
## [1] "LR"
## 
## $options$nev
## [1] 1
## 
## $options$tol
## [1] 0
## 
## $options$ncv
## [1] 0
## 
## $options$ldv
## [1] 0
## 
## $options$ishift
## [1] 1
## 
## $options$maxiter
## [1] 1000
## 
## $options$nb
## [1] 1
## 
## $options$mode
## [1] 1
## 
## $options$start
## [1] 1
## 
## $options$sigma
## [1] 0
## 
## $options$sigmai
## [1] 0
## 
## $options$info
## [1] 0
## 
## $options$iter
## [1] 7
## 
## $options$nconv
## [1] 1
## 
## $options$numop
## [1] 31
## 
## $options$numopb
## [1] 0
## 
## $options$numreo
## [1] 18
## 
## 
## $centralization
## [1] 0.5071775
## 
## $theoretical_max
## [1] 16

Betweenness

betweenness(net, directed=T, weights=NA)
##         s01         s02         s03         s04         s05         s06 
##  24.0000000   5.8333333 127.0000000  93.5000000  16.5000000  20.3333333 
##         s07         s08         s09         s10         s11         s12 
##   1.8333333  19.5000000   0.8333333  15.0000000   0.0000000  33.5000000 
##         s13         s14         s15         s16         s17 
##  20.0000000   4.0000000   5.6666667   0.0000000  58.5000000
edge_betweenness(net, directed=T, weights=NA)
##  [1] 10.833333 11.333333  8.333333  9.500000  4.000000 12.500000  3.000000
##  [8]  2.333333 24.000000 16.000000 31.500000 32.500000  9.500000  6.500000
## [15] 23.000000 65.333333 11.000000  6.500000 18.000000  8.666667  5.333333
## [22] 10.000000  6.000000 11.166667 15.000000 21.333333 10.000000  2.000000
## [29]  1.333333  4.500000 11.833333 16.833333  6.833333 16.833333 31.000000
## [36] 17.000000 18.000000 14.500000  7.500000 28.500000  3.000000 17.000000
## [43]  5.666667  9.666667  6.333333  1.000000 15.000000 74.500000
centr_betw(net, directed=T, normalized=T)
## $res
##  [1]  24.0000000   5.8333333 127.0000000  93.5000000  16.5000000  20.3333333
##  [7]   1.8333333  19.5000000   0.8333333  15.0000000   0.0000000  33.5000000
## [13]  20.0000000   4.0000000   5.6666667   0.0000000  58.5000000
## 
## $centralization
## [1] 0.4460938
## 
## $theoretical_max
## [1] 3840

6.8 Hubs and authorities

hs <- hub_score(net, weights = NA)$vector

as <- authority_score(net, weights = NA)$vector

par(mfrow = c(1,2))

plot(net, vertex.size=hs*50, main="Hubs")
plot(net, vertex.size=as*30, main="Authorities")

7. Distances and paths

平均路徑長度:每個節點間的最短距離平均

mean_distance(net, directed = F)
## [1] 2.058824
mean_distance(net, directed = T)
## [1] 2.742188
distances(net) # with edge weights
##     s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17
## s01   0   4   2   6   1   5   3   4   3   4   3   3   9   4   7  26   8
## s02   4   0   4   8   3   7   5   6   1   5   5   5  11   6   9  28  10
## s03   2   4   0   4   1   3   1   2   3   2   1   1   7   2   5  24   6
## s04   6   8   4   0   5   1   5   6   7   6   5   3   3   6   1  22   2
## s05   1   3   1   5   0   4   2   3   2   3   2   2   8   3   6  25   7
## s06   5   7   3   1   4   0   4   5   6   5   4   2   4   5   2  21   3
## s07   3   5   1   5   2   4   0   3   4   3   2   2   8   3   6  25   7
## s08   4   6   2   6   3   5   3   0   5   4   3   3   9   4   7  26   8
## s09   3   1   3   7   2   6   4   5   0   5   4   4  10   5   8  27   9
## s10   4   5   2   6   3   5   3   4   5   0   3   3   9   4   7  26   8
## s11   3   5   1   5   2   4   2   3   4   3   0   2   8   1   6  25   7
## s12   3   5   1   3   2   2   2   3   4   3   2   0   6   3   4  23   5
## s13   9  11   7   3   8   4   8   9  10   9   8   6   0   9   4  22   1
## s14   4   6   2   6   3   5   3   4   5   4   1   3   9   0   7  26   8
## s15   7   9   5   1   6   2   6   7   8   7   6   4   4   7   0  23   3
## s16  26  28  24  22  25  21  25  26  27  26  25  23  22  26  23   0  21
## s17   8  10   6   2   7   3   7   8   9   8   7   5   1   8   3  21   0
distances(net, weights=NA) # ignore weights
##     s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17
## s01   0   1   1   1   1   2   2   2   2   2   2   2   3   3   1   3   2
## s02   1   0   1   2   1   3   2   2   1   1   2   2   3   3   2   4   3
## s03   1   1   0   1   1   2   1   1   2   1   1   1   2   2   2   3   2
## s04   1   2   1   0   2   1   2   2   3   2   1   1   2   2   1   2   1
## s05   1   1   1   2   0   2   2   2   1   2   2   2   3   3   1   3   3
## s06   2   3   2   1   2   0   3   3   3   3   2   1   2   2   1   1   1
## s07   2   2   1   2   2   3   0   1   2   1   2   2   2   1   3   4   3
## s08   2   2   1   2   2   3   1   0   1   2   2   2   3   2   3   4   3
## s09   2   1   2   3   1   3   2   1   0   1   3   3   4   3   2   4   4
## s10   2   1   1   2   2   3   1   2   1   0   2   2   3   2   3   4   3
## s11   2   2   1   1   2   2   2   2   3   2   0   2   2   1   2   3   2
## s12   2   2   1   1   2   1   2   2   3   2   2   0   1   1   2   2   2
## s13   3   3   2   2   3   2   2   3   4   3   2   1   0   1   3   2   1
## s14   3   3   2   2   3   2   1   2   3   2   1   1   1   0   3   3   2
## s15   1   2   2   1   1   1   3   3   2   3   2   2   3   3   0   2   2
## s16   3   4   3   2   3   1   4   4   4   4   3   2   2   3   2   0   1
## s17   2   3   2   1   3   1   3   3   4   3   2   2   1   2   2   1   0

挑出有興趣的集合

dist.from.NYT <- distances(net, v = V(net)[media == "NY Times"],
                           to = V(net), weights = NA)

#設定顏色
oranges <- colorRampPalette(c("dark red", "gold"))
col <- oranges(max(dist.from.NYT)+1)
col <- col[dist.from.NYT+1]

plot(net, vertex.color=col, vertex.label=dist.from.NYT, edge.arrow.size=.6, 
     vertex.label.color="white")

最短路徑

news.path <- shortest_paths(net,
                            from = V(net)[media == "MSNBC"],
                            to = V(net)[media == "New York Post"],
                            output = "both") #both path nodes and edges
#設定edge顏色
ecol <- rep("gray80", ecount(net))
ecol[unlist(news.path$epath)] <- "orange"

#設定edge寬度
ew <- rep(2, ecount(net))
ew[unlist(news.path$epath)] <- 4

#設定node顏色
vcol <- rep("gray40", vcount(net))
vcol[unlist(news.path$vpath)] <- "gold"

plot(net, vertex.color=vcol, edge.color=ecol, edge.width=ew, edge.arrow.mode=0)

in/out edge判斷

單節點使用:identity() 多節點使用:incident_edges()

inc.edges <- incident(net, V(net)[media == "Wall Street Journal"], mode = "all")

ecol <- rep("gray80", ecount(net))
ecol[inc.edges] <- "orange"
vcol <- rep("grey40", vcount(net))
vcol[V(net)$media=="Wall Street Journal"] <- "gold"

plot(net, vertex.color=vcol, edge.color=ecol)

找出鄰居節點

neighboes():找出一個節點相距一步的節點 adjacent_vertices():找出多節點的鄰居 ego():用order設定要找出多少步外的節點

neigh.nodes <- neighbors(net, V(net)[media == "Wall Street Journal"], mode = "out")

vcol[neigh.nodes] <- "#ff9d00"

plot(net, vertex.color=vcol)

特殊運算符號

  • E(network)[X %-% Y]:選出在X和Y之間的edge,並忽略方向
  • E(network)[X %->% Y]:選出X指到Y的edge
  • E(network)[X %<-% Y]:選出Y指到X的edge
E(net)[V(net)[type.label == "Newspaper"] %->% V(net)[type.label == "Online"]]
## + 7/48 edges from 434c53a (vertex names):
## [1] s01->s15 s03->s12 s04->s12 s04->s17 s05->s15 s06->s16 s06->s17

Co-citation(共同引用)

對於幾個節點有共享的提名

cocitation(net)
##     s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17
## s01   0   1   1   2   1   1   0   1   2   2   1   1   0   0   1   0   0
## s02   1   0   1   1   0   0   0   0   1   0   0   0   0   0   2   0   0
## s03   1   1   0   1   0   1   1   1   2   2   1   1   0   1   1   0   1
## s04   2   1   1   0   1   1   0   1   0   1   1   1   0   0   1   0   0
## s05   1   0   0   1   0   0   0   1   0   1   1   1   0   0   0   0   0
## s06   1   0   1   1   0   0   0   0   0   0   1   1   1   1   0   0   2
## s07   0   0   1   0   0   0   0   0   1   0   0   0   0   0   0   0   0
## s08   1   0   1   1   1   0   0   0   0   2   1   1   0   1   0   0   0
## s09   2   1   2   0   0   0   1   0   0   1   0   0   0   0   1   0   0
## s10   2   0   2   1   1   0   0   2   1   0   1   1   0   1   0   0   0
## s11   1   0   1   1   1   1   0   1   0   1   0   2   1   0   0   0   1
## s12   1   0   1   1   1   1   0   1   0   1   2   0   0   0   0   0   2
## s13   0   0   0   0   0   1   0   0   0   0   1   0   0   1   0   0   0
## s14   0   0   1   0   0   1   0   1   0   1   0   0   1   0   0   0   0
## s15   1   2   1   1   0   0   0   0   1   0   0   0   0   0   0   0   0
## s16   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1
## s17   0   0   1   0   0   2   0   0   0   0   1   2   0   0   0   1   0

8.Subgroups and communities

將network轉換為無向的方法: + 在節點間建立無向的連結(mode = “collapse”) + 在有向的連結中建立無向的連結,可能以multiplex graph結束(mode = “each”) + 為圖中每個對稱的連結建立無向連結(mode = “mutual”)

例如:要將A->B和B->A轉為無向連結,需用edge.attr.comb來指定如何處理edge的屬性,就像使用simplify()。而“weight”應該相加,其他屬性應該刪除。

net.sym <- as.undirected(net, mode = "collapse",
                         edge.attr.comb = list(weight="sum","ignore"))

8.1 Cliques

找出cliques

cliques(net.sym)
## [[1]]
## + 1/17 vertex, named, from 717423d:
## [1] s03
## 
## [[2]]
## + 1/17 vertex, named, from 717423d:
## [1] s06
## 
## [[3]]
## + 1/17 vertex, named, from 717423d:
## [1] s14
## 
## [[4]]
## + 1/17 vertex, named, from 717423d:
## [1] s09
## 
## [[5]]
## + 1/17 vertex, named, from 717423d:
## [1] s04
## 
## [[6]]
## + 2/17 vertices, named, from 717423d:
## [1] s04 s06
## 
## [[7]]
## + 2/17 vertices, named, from 717423d:
## [1] s03 s04
## 
## [[8]]
## + 1/17 vertex, named, from 717423d:
## [1] s05
## 
## [[9]]
## + 2/17 vertices, named, from 717423d:
## [1] s05 s09
## 
## [[10]]
## + 2/17 vertices, named, from 717423d:
## [1] s03 s05
## 
## [[11]]
## + 1/17 vertex, named, from 717423d:
## [1] s13
## 
## [[12]]
## + 2/17 vertices, named, from 717423d:
## [1] s13 s14
## 
## [[13]]
## + 1/17 vertex, named, from 717423d:
## [1] s10
## 
## [[14]]
## + 2/17 vertices, named, from 717423d:
## [1] s09 s10
## 
## [[15]]
## + 2/17 vertices, named, from 717423d:
## [1] s03 s10
## 
## [[16]]
## + 1/17 vertex, named, from 717423d:
## [1] s16
## 
## [[17]]
## + 2/17 vertices, named, from 717423d:
## [1] s06 s16
## 
## [[18]]
## + 1/17 vertex, named, from 717423d:
## [1] s08
## 
## [[19]]
## + 2/17 vertices, named, from 717423d:
## [1] s08 s09
## 
## [[20]]
## + 2/17 vertices, named, from 717423d:
## [1] s03 s08
## 
## [[21]]
## + 1/17 vertex, named, from 717423d:
## [1] s01
## 
## [[22]]
## + 2/17 vertices, named, from 717423d:
## [1] s01 s05
## 
## [[23]]
## + 3/17 vertices, named, from 717423d:
## [1] s01 s03 s05
## 
## [[24]]
## + 2/17 vertices, named, from 717423d:
## [1] s01 s04
## 
## [[25]]
## + 3/17 vertices, named, from 717423d:
## [1] s01 s03 s04
## 
## [[26]]
## + 2/17 vertices, named, from 717423d:
## [1] s01 s03
## 
## [[27]]
## + 1/17 vertex, named, from 717423d:
## [1] s17
## 
## [[28]]
## + 2/17 vertices, named, from 717423d:
## [1] s16 s17
## 
## [[29]]
## + 3/17 vertices, named, from 717423d:
## [1] s06 s16 s17
## 
## [[30]]
## + 2/17 vertices, named, from 717423d:
## [1] s13 s17
## 
## [[31]]
## + 2/17 vertices, named, from 717423d:
## [1] s04 s17
## 
## [[32]]
## + 3/17 vertices, named, from 717423d:
## [1] s04 s06 s17
## 
## [[33]]
## + 2/17 vertices, named, from 717423d:
## [1] s06 s17
## 
## [[34]]
## + 1/17 vertex, named, from 717423d:
## [1] s12
## 
## [[35]]
## + 2/17 vertices, named, from 717423d:
## [1] s12 s13
## 
## [[36]]
## + 3/17 vertices, named, from 717423d:
## [1] s12 s13 s14
## 
## [[37]]
## + 2/17 vertices, named, from 717423d:
## [1] s04 s12
## 
## [[38]]
## + 3/17 vertices, named, from 717423d:
## [1] s04 s06 s12
## 
## [[39]]
## + 3/17 vertices, named, from 717423d:
## [1] s03 s04 s12
## 
## [[40]]
## + 2/17 vertices, named, from 717423d:
## [1] s12 s14
## 
## [[41]]
## + 2/17 vertices, named, from 717423d:
## [1] s06 s12
## 
## [[42]]
## + 2/17 vertices, named, from 717423d:
## [1] s03 s12
## 
## [[43]]
## + 1/17 vertex, named, from 717423d:
## [1] s11
## 
## [[44]]
## + 2/17 vertices, named, from 717423d:
## [1] s04 s11
## 
## [[45]]
## + 3/17 vertices, named, from 717423d:
## [1] s03 s04 s11
## 
## [[46]]
## + 2/17 vertices, named, from 717423d:
## [1] s11 s14
## 
## [[47]]
## + 2/17 vertices, named, from 717423d:
## [1] s03 s11
## 
## [[48]]
## + 1/17 vertex, named, from 717423d:
## [1] s07
## 
## [[49]]
## + 2/17 vertices, named, from 717423d:
## [1] s07 s08
## 
## [[50]]
## + 3/17 vertices, named, from 717423d:
## [1] s03 s07 s08
## 
## [[51]]
## + 2/17 vertices, named, from 717423d:
## [1] s07 s10
## 
## [[52]]
## + 3/17 vertices, named, from 717423d:
## [1] s03 s07 s10
## 
## [[53]]
## + 2/17 vertices, named, from 717423d:
## [1] s07 s14
## 
## [[54]]
## + 2/17 vertices, named, from 717423d:
## [1] s03 s07
## 
## [[55]]
## + 1/17 vertex, named, from 717423d:
## [1] s15
## 
## [[56]]
## + 2/17 vertices, named, from 717423d:
## [1] s01 s15
## 
## [[57]]
## + 3/17 vertices, named, from 717423d:
## [1] s01 s05 s15
## 
## [[58]]
## + 3/17 vertices, named, from 717423d:
## [1] s01 s04 s15
## 
## [[59]]
## + 2/17 vertices, named, from 717423d:
## [1] s05 s15
## 
## [[60]]
## + 2/17 vertices, named, from 717423d:
## [1] s04 s15
## 
## [[61]]
## + 3/17 vertices, named, from 717423d:
## [1] s04 s06 s15
## 
## [[62]]
## + 2/17 vertices, named, from 717423d:
## [1] s06 s15
## 
## [[63]]
## + 1/17 vertex, named, from 717423d:
## [1] s02
## 
## [[64]]
## + 2/17 vertices, named, from 717423d:
## [1] s01 s02
## 
## [[65]]
## + 3/17 vertices, named, from 717423d:
## [1] s01 s02 s05
## 
## [[66]]
## + 4/17 vertices, named, from 717423d:
## [1] s01 s02 s03 s05
## 
## [[67]]
## + 3/17 vertices, named, from 717423d:
## [1] s01 s02 s03
## 
## [[68]]
## + 2/17 vertices, named, from 717423d:
## [1] s02 s10
## 
## [[69]]
## + 3/17 vertices, named, from 717423d:
## [1] s02 s09 s10
## 
## [[70]]
## + 3/17 vertices, named, from 717423d:
## [1] s02 s03 s10
## 
## [[71]]
## + 2/17 vertices, named, from 717423d:
## [1] s02 s05
## 
## [[72]]
## + 3/17 vertices, named, from 717423d:
## [1] s02 s05 s09
## 
## [[73]]
## + 3/17 vertices, named, from 717423d:
## [1] s02 s03 s05
## 
## [[74]]
## + 2/17 vertices, named, from 717423d:
## [1] s02 s09
## 
## [[75]]
## + 2/17 vertices, named, from 717423d:
## [1] s02 s03
sapply(cliques(net.sym), length) #cliques的大小
##  [1] 1 1 1 1 1 2 2 1 2 2 1 2 1 2 2 1 2 1 2 2 1 2 3 2 3 2 1 2 3 2 2 3 2 1 2 3 2 3
## [39] 3 2 2 2 1 2 3 2 2 1 2 3 2 3 2 2 1 2 3 3 2 2 3 2 1 2 3 4 3 2 3 3 2 3 3 2 2
largest_cliques(net.sym) #有最多node的cliques
## [[1]]
## + 4/17 vertices, named, from 717423d:
## [1] s03 s01 s02 s05
vcol <- rep("grey80", vcount(net.sym))
vcol[unlist(largest_cliques(net.sym))] <- "gold"
plot(as.undirected(net.sym), vertex.label=V(net.sym)$name, vertex.color=vcol)

8.2 Community detection

A number of algorithms aim to detect groups that consist of densely connected nodes with fewer connections across groups. Community detection based on edge betweenness (Newman-Girvan) High-betweenness edges are removed sequentially (recalculating at each step) and the best partitioning of the network is selected.

ceb <- cluster_edge_betweenness(net) 
## Warning in cluster_edge_betweenness(net): At community.c:460 :Membership vector
## will be selected based on the lowest modularity score.
## Warning in cluster_edge_betweenness(net): At community.c:467 :Modularity
## calculation with weighted edge betweenness community detection might not make
## sense -- modularity treats edge weights as similarities while edge betwenness
## treats them as distances
dendPlot(ceb, mode="hclust")

plot(ceb, net) 

class(ceb)
## [1] "communities"

有少communities

length(ceb)
## [1] 5

每個node有多少communities的成員

membership(ceb)
## s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17 
##   1   2   3   4   1   4   3   3   5   5   4   4   4   4   1   4   4

分區的模組化程度

modularity(ceb)
## [1] 0.292476

是否為跨communities的edge

crossing(ceb, net)
## s01|s02 s01|s03 s01|s04 s01|s15 s02|s01 s02|s03 s02|s09 s02|s10 s03|s01 s03|s04 
##    TRUE    TRUE    TRUE   FALSE    TRUE    TRUE    TRUE    TRUE    TRUE    TRUE 
## s03|s05 s03|s08 s03|s10 s03|s11 s03|s12 s04|s03 s04|s06 s04|s11 s04|s12 s04|s17 
##    TRUE   FALSE    TRUE    TRUE    TRUE    TRUE   FALSE   FALSE   FALSE   FALSE 
## s05|s01 s05|s02 s05|s09 s05|s15 s06|s16 s06|s17 s07|s03 s07|s08 s07|s10 s07|s14 
##   FALSE    TRUE    TRUE   FALSE   FALSE   FALSE   FALSE   FALSE    TRUE    TRUE 
## s08|s03 s08|s07 s08|s09 s09|s10 s10|s03 s12|s06 s12|s13 s12|s14 s13|s12 s13|s17 
##   FALSE   FALSE    TRUE   FALSE    TRUE   FALSE   FALSE   FALSE   FALSE   FALSE 
## s14|s11 s14|s13 s15|s01 s15|s04 s15|s06 s16|s06 s16|s17 s17|s04 
##   FALSE   FALSE   FALSE    TRUE    TRUE   FALSE   FALSE   FALSE

分區的高度模組化反映了社區內部的密集連接和社區之間的稀疏連接

基於傳播標籤的社區檢測

Community detection based on based on propagating labels 分配節點標籤,隨機化,然後將每個頂點的標籤替換為在鄰居中最頻繁出現的標籤。重複這些步驟,直到每個頂點都具有最鄰近的標籤。

clp <- cluster_label_prop(net)
plot(clp, net)

### 基於貪婪模塊化優化的社區檢測 Community detection based on greedy optimization of modularity

cfg <- cluster_fast_greedy(as.undirected(net))

plot(cfg, as.undirected(net))

V(net)$community <- cfg$membership

colrs <- adjustcolor( c("gray50", "tomato", "gold", "yellowgreen"), alpha=.6)

plot(net, vertex.color=colrs[V(net)$community])