在 igraph 中提取简化图

Extracting simplified graph in igraph

我有一个看起来像这样的网络

library(igraph)
library(igraphdata)

data("kite")
plot(kite)

我运行一个社区检测,结果是这样的

community <- cluster_fast_greedy(kite)
plot(community,kite)

现在我想提取一个基于社区的网络。边权重应该是社区之间的关系数(社区之间的联系有多强),顶点属性应该是社区中的节点数(称为 numnodes)。

d <- data.frame(E=c(1, 2, 3),
                A=c(2, 3, 1))
g2 <- graph_from_data_frame(d, directed = F)
E(g2)$weight <- c(5, 1, 1)
V(g2)$numnodes <- c(4,3,3)

plot.igraph(g2,vertex.label=V(g2)$name, edge.color="black",edge.width=E(g2)$weight,vertex.size=V(g2)$numnodes)

图形应如下所示 一个节点比其他节点大,一条边与其他边相比有很大的权重。

据我所知,igraph 没有计算连接顶点组的边的方法。因此,要计算连接社区的边,您需要遍历每对社区。要计算每个社区的成员,可以使用 sizes 方法。

library(igraph)
library(igraphdata)

data("kite")
plot(kite)

community <- cluster_fast_greedy(kite)
plot(community,kite)

cedges <- NULL

for(i in seq(1,max(community$membership) - 1)){
    for(j in seq(i + 1, max(community$membership))){
        imembers <- which(community$membership == i)
        jmembers <- which(community$membership == j)
        weight <- sum(
            mapply(function(v1) mapply(
                function(v2) are.connected(kite, v1, v2),
                jmembers),
            imembers)
        )
        cedges <- rbind(cedges, c(i, j, weight))
    }
}

cedges <- as.data.frame(cedges)
names(cedges)[3] <- 'weight'
cgraph <- graph_from_data_frame(cedges, directed = FALSE)

V(cgraph)$numnodes <- sizes(community)

plot.igraph(cgraph,
    vertex.label = V(cgraph)$name,
    edge.color = "black",
    edge.width = E(cgraph)$weight,
    vertex.size = V(cgraph)$numnodes)