在同一图 Igraph 上绘制子图社区的集合

Plot Collection of communities of sub-graphs on same Graph Igraph

我在 R 中有一个非定向网络,在 igraph 中绘制时看起来像:

plot(g2)

从这个主图中,我提取了所有最小顶点数 = 4 的聚类/子图:

modules <- decompose.graph(g2, min.vertices = 4)
out <- modules[order(sapply(modules, ecount), decreasing=T)]

给予:

> head(modules)
[[1]]
IGRAPH UN-- 4 4 -- 
+ attr: name (v/c), value (e/n), sourceID (e/n), targetID (e/n)
+ edges (vertex names):
[1] 333--342 333--324 333--323 342--324

[[2]]
IGRAPH UN-- 4 4 -- 
+ attr: name (v/c), value (e/n), sourceID (e/n), targetID (e/n)
+ edges (vertex names):
[1] 27--25 27--20 25--20 25--21

[[3]]
IGRAPH UN-- 4 3 -- 
+ attr: name (v/c), value (e/n), sourceID (e/n), targetID (e/n)
+ edges (vertex names):
[1] 662--657 662--705 706--657

[[4]]
IGRAPH UN-- 4 3 -- 
+ attr: name (v/c), value (e/n), sourceID (e/n), targetID (e/n)
+ edges (vertex names):
[1] 793--792 793--795 793--794

[[5]]
IGRAPH UN-- 4 3 -- 
+ attr: name (v/c), value (e/n), sourceID (e/n), targetID (e/n)
+ edges (vertex names):
[1] 746--747 746--722 746--721

[[6]]
IGRAPH UN-- 4 3 -- 
+ attr: name (v/c), value (e/n), sourceID (e/n), targetID (e/n)
+ edges (vertex names):
[1] 285--284 285--286 287--284

我可以通过以下方式将它们绘制成一张图:

vertexes <- character()
data_frames <- list()
for(i in 1:length(out)) {
  vertexes[i] <- list(vertex.attributes(out[[i]])$name)
  data_frames[[i]] <- get.data.frame(out[[i]])
}
sub_nodes = unlist(vertexes)
subv <- sub_nodes
g3 <- induced.subgraph(graph=g2,vids=subv)
plot(g3)

我可以计算这个主图的介数并显示结果:

wc <- edge.betweenness.community(g3, weights = NULL
                                 ,directed = FALSE,bridges = TRUE)
plot(wc, g3)

这将每个子集群拆分为一个社区。


我想要的是为每个子集群评估的中间性:

我通过以下方式计算每个子图的介数:

betweenness_sub <- list()
for(i in 1:length(out)) {
  btws <- edge.betweenness.community(out[[i]], weights = NULL
                                                   ,directed = FALSE,bridges = TRUE)
  print(btws)
  betweenness_sub[[i]] <- btws
}

这给出:

> head(betweenness_sub)
[[1]]
IGRAPH clustering edge betweenness, groups: 2, mod: 0.17
+ groups:
  $`1`
  [1] "646" "647" "723"

  $`2`
  [1] "713" "714" "710"


[[2]]
IGRAPH clustering edge betweenness, groups: 1, mod: 0
+ groups:
  $`1`
  [1] "685" "684" "686" "691" "690"


[[3]]
IGRAPH clustering edge betweenness, groups: 1, mod: 0
+ groups:
  $`1`
  [1] "719" "718" "734" "753" "715"


[[4]]
IGRAPH clustering edge betweenness, groups: 1, mod: 0
+ groups:
  $`1`
  [1] "702" "757" "720" "735"


[[5]]
IGRAPH clustering edge betweenness, groups: 1, mod: 0
+ groups:
  $`1`
  [1] "83" "80" "88" "87" "81"


[[6]]
IGRAPH clustering edge betweenness, groups: 1, mod: 0
+ groups:
  $`1`
  [1] "333" "342" "324" "323"

我可以通过以下方式单独绘制它们:

plot(betweenness_sub[[1]], out[[1]])

我现在想做的是绘制每个子集群的社区,但就像在第三个图中一样。

这次突出显示的社区将是上面列表中描述的社区..

有什么方法可以 "regroup" "combine" 或将这些单独的子图社区网格化为完整图吗?


再举一个例子,如果我们取最小顶点数 = 7,并且 运行 上面的代码我们得到:

vertexes <- character()
data_frames <- list()
for(i in 1:length(out)) {
  vertexes[i] <- list(vertex.attributes(out[[i]])$name)
  data_frames[[i]] <- get.data.frame(out[[i]])
}
sub_nodes = unlist(vertexes)
subv <- sub_nodes
g3 <- induced.subgraph(graph=gg,vids=subv)
plot(g3)

wc <- edge.betweenness.community(g3, weights = E(out)$value
                                 ,directed = FALSE,bridges = TRUE)
# g3 <- delete.edges(g3, wc$removed.edges[seq(length=1)])
plot(wc, g3)

然而,如果我们单独考虑最大的集群,我们得到:

plot(betweenness_sub[[1]], out[[1]])

我想要在第二张图片中计算各个集群的社区,其排列方式与第一张图片相同。有什么想法吗?


编辑 3. 用于创建上述图(最小顶点数=7)的数据如下:

> get.data.frame(g3)
   from   to  value sourceID targetID
1    74   80 0.2829   255609   262854
2    74   61 0.2880   255609   179585
3    80 1085 0.2997   262854  3055482
4   476  502 0.2714  1442372  1475074
5   476  524 0.2963  1442372  1532560
6   476  479 0.2214  1442372  1448436
7   476  497 0.2714  1442372  1466635
8   476  498 0.2714  1442372  1467171
9   476  500 0.2714  1442372  1468099
10  502  479 0.2714  1475074  1448436
11  502  497 0.1215  1475074  1466635
12  502  498 0.1215  1475074  1467171
13  502  500 0.1215  1475074  1468099
14  524  479 0.2963  1532560  1448436
15 1045 1046 0.1842  2970629  2971615
16 1046 1085 0.2963  2971615  3055482
17 1046 1154 0.2714  2971615  3087803
18 1047 1120 0.2886  2972434  3076314
19 1085 1154 0.2577  3055482  3087803
20 1085 1187 0.2850  3055482  3101131
21 1085 1209 0.2850  3055482  3110186
22 1097 1159 0.2922  3062163  3090708
23 1097 1087 0.2256  3062163  3058341
24 1097 1158 0.2922  3062163  3090707
25 1097 1160 0.2922  3062163  3090709
26 1097 1177 0.2577  3062163  3099199
27 1098 1159 0.2922  3062164  3090708
28 1098 1087 0.2256  3062164  3058341
29 1098 1158 0.2922  3062164  3090707
30 1098 1160 0.2922  3062164  3090709
31 1098 1177 0.2577  3062164  3099199
32 1118 1119 0.1587  3076246  3076248
33 1118 1090 0.2256  3076246  3058962
34 1119 1120 0.1736  3076248  3076314
35 1119 1144 0.2035  3076248  3085240
36 1119 1145 0.2035  3076248  3085241
37 1154 1243 0.2577  3087803  3130848
38 1154 1187 0.2305  3087803  3101131
39 1154 1209 0.2305  3087803  3110186
40 1154 1244 0.2577  3087803  3131379
41 1159 1087 0.2922  3090708  3058341
42 1243 1187 0.1488  3130848  3101131
43 1243 1209 0.1488  3130848  3110186
44 1243 1244 0.1215  3130848  3131379
45 1243 1281 0.2997  3130848  3255811
> g <- graph.data.frame(get.data.frame(g3), directed=FALSE)
> gg
IGRAPH UN-- 33 45 -- 
+ attr: name (v/c), value (e/n), sourceID (e/n), targetID (e/n)
+ edges (vertex names):
 [1] 74  --80   74  --61   80  --1085 476 --502  476 --524  476 --479  476 --497  476 --498  476 --500  502 --479  502 --497  502 --498 
[13] 502 --500  524 --479  1045--1046 1046--1085 1046--1154 1047--1120 1085--1154 1085--1187 1085--1209 1097--1159 1097--1087 1097--1158
[25] 1097--1160 1097--1177 1098--1159 1098--1087 1098--1158 1098--1160 1098--1177 1118--1119 1118--1090 1119--1120 1119--1144 1119--1145
[37] 1154--1243 1154--1187 1154--1209 1154--1244 1159--1087 1243--1187 1243--1209 1243--1244 1243--1281

编辑 2:

可以使用 plotly 包绘制多个集群:

par(mfrow=c(2,3))
par(mar = rep(2, 2))
for(i in 1:length(out)) {
  plot(betweenness_sub[[i]], out[[i]])
}

但我想知道如何使用 igraph 具体执行此操作,以保持图中所述的圆形结构。

下面是我的算法,不是很优雅,但似乎可行。基本思路是从你的 betweenness_sub 中获取组信息并将它们连接成一个大列表,例如 subs,然后使用 plot(g3, mark.groups = subs) 将整个图与来自的组信息一起绘制subs,即betweenness-sub。请注意,在我的代码中,graph 是您发布的图表 data.frame

g2 <- graph.data.frame(graph, directed=FALSE)

modules <- decompose.graph(g2, min.vertices = 7)
out <- modules[order(sapply(modules, ecount), decreasing=T)]

vertexes <- character()
data_frames <- list()
for(i in 1:length(out)) {
    vertexes[i] <- list(vertex.attributes(out[[i]])$name)
    data_frames[[i]] <- get.data.frame(out[[i]])
}
sub_nodes = unlist(vertexes)
subv <- sub_nodes
g3 <- induced.subgraph(graph=g2,vids=subv)
plot(g3)

wc <- edge.betweenness.community(g3, weights = NULL
                                 ,directed = FALSE,bridges = TRUE)
plot(wc, g3)

betweenness_sub <- list()
for(i in 1:length(out)) {
    btws <- edge.betweenness.community(out[[i]], weights = NULL
                                       ,directed = FALSE,bridges = TRUE)
    print(btws)
    betweenness_sub[[i]] <- btws
}

subs <- list()
k <- 1
for (sub in betweenness_sub) {
    for (i in 1:length(sub)) {
        subs[[k]] <- sub[[i]]
        k = k + 1
    }
}

plot(g3, mark.groups = subs)