我想重现本文第6页中的那种"社区摘要"图:http://arxiv.org/pdf/0803.0476v2.pdf
首先在图上使用社区算法,例如:
wc <- walktrap.community(subgraph)
mc <- multilevel.community(subgraph)
然后根据社区对顶点进行分组。社区节点的大小是成员大小的函数,而边缘宽度是从社区a的任何成员到社区B的总边缘的函数。
请注意我不只是想像这样将社区编码为彩色或凸包:
V(inSubGraph)$color <- commObj$membership+1
plot.igraph( inSubGraph, vertex.color = V(inSubGraph)$color)
或带有凸包:
plot(commObj, inSubGraph)
将contract.vertices
函数与社区检测方法提供的成员向量一起使用,然后使用simplify
。特别是:
-
为每个顶点指定一个值为1的数字顶点属性,如下所示:
V(g)$size = 1
-
为每条边指定一个值为1的数字边属性,如下所示:
E(g)$count = 1
-
将社区收缩为顶点,如下所示:
comm.graph <- contract.vertices(g, wc$membership, vertex.attr.comb=list(size="sum", "ignore"))
;基本上,这指定了应该对正在收缩的顶点的size
属性求和,并且应该忽略每一个其他顶点属性。(详见R中的?attribute.combination
)。此调用收缩顶点,但保留原始边,因此现在顶点之间的边数与社区之间的原始图中的边数一样多。 -
按如下方式折叠多条边:
comm.graph <- simplify(comm.graph, remove.loops=FALSE, edge.attr.comb=list(count="sum", "ignore"))
。
现在有一个名为comm.graph
的图,其中顶点表示原始图的社区,size
顶点属性对应于原始图中每个社区中的顶点数,count
边属性对应于初始图中社区之间的边数。