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
links <- aggregate(links[,3], links[,-3], sum)
links <- links[order(links$from, links$to),]
colnames(links)[4] <- "weight"
rownames(links) <- NULL
links
## 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 s06 hyperlink 1
## 26 s06 s16 hyperlink 21
## 27 s06 s17 mention 21
## 28 s07 s03 mention 1
## 29 s07 s08 mention 22
## 30 s07 s10 hyperlink 21
## 31 s07 s14 mention 4
## 32 s08 s03 hyperlink 2
## 33 s08 s07 mention 21
## 34 s08 s09 mention 23
## 35 s09 s10 mention 21
## 36 s10 s03 hyperlink 2
## 37 s12 s06 mention 2
## 38 s12 s13 hyperlink 22
## 39 s12 s14 mention 22
## 40 s13 s12 hyperlink 21
## 41 s13 s17 mention 1
## 42 s14 s11 mention 1
## 43 s14 s13 mention 21
## 44 s15 s01 hyperlink 22
## 45 s15 s04 hyperlink 1
## 46 s15 s06 hyperlink 4
## 47 s16 s06 hyperlink 23
## 48 s16 s17 mention 21
## 49 s17 s04 hyperlink 4
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
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)
net <- simplify(net, remove.multiple = F, remove.loops = T)
plot(net, edge.arrow.size = 0.4, vertex.label = NA)
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
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
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)])
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)
#根據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")
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)
Network layouts return 每個節點的座標
利用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)
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)
l <- layout_randomly(net.bg)
plot(net.bg, layout = l)
l <- layout_in_circle(net.bg)
plot(net.bg, layout = l)
l <- layout_on_sphere(net.bg)
plot(net.bg, layout = l)
Force-directed layouts:盡可能讓edge不會交叉,當node靠太近時會互相排斥
l <- layout_with_fr(net.bg)
plot(net.bg, layout=l)
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()
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)
l <- layout_with_kk(net.bg)
plot(net.bg, layout = l)
可以設定root(放置中間的節點)
plot(net.bg, layout = layout_with_lgl)
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"
hist(links$weight)
mean(links$weight)
## [1] 12.40816
sd(links$weight)
## [1] 9.905635
#把小於平均數的刪掉
cut.off <- mean(links$weight)
net.sp <- delete_edges(net, E(net)[weight < cut.off])
plot(net.sp)
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")
# 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)
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) )
#設定顏色
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)
plot(net2, vertex.label=NA, vertex.size=7, layout=layout_as_bipartite)
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)
edge_density(net, loops = F)
## [1] 0.1764706
#for a directed network
ecount(net)/(vcount(net)*(vcount(net)-1))
## [1] 0.1764706
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
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
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)
deg <- degree(net, mode = "all")
plot(net, vertex.size = deg*3) # degree越大圓越大
hist(deg, breaks=1:vcount(net)-1, main="Histogram of node degree")
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")
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(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
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(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
平均路徑長度:每個節點間的最短距離平均
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)
單節點使用: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(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
對於幾個節點有共享的提名
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
將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"))
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)
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"
length(ceb)
## [1] 5
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
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])