2017-04-08 2 views
1

J'ai un réseau qui ressemble à ceciExtraction graphique simplifiée igraph

library(igraph) 
library(igraphdata) 

data("kite") 
plot(kite) 

The graph I am working with

Je lance une détection de la communauté et le résultat se présente comme suit

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

The result of the community detection mapped on the network

Maintenant, je veux extraire un réseau basé sur les communautés. Le poids de bord doit être le nombre de liens entre les communautés (la force sont des communautés connectées les unes aux autres), l'attribut sommet doit être le nombre de noeuds dans la communauté (appelés 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) 

Le graphique devrait ressembler à ceci Final product Un nœud est plus grand que les autres, un bord a beaucoup de poids par rapport aux autres.

Répondre

1

Pour autant que je sache, igraph ne possède pas la méthode pour compter les bords de connexion des groupes de sommets. Par conséquent, pour compter les limites reliant les communautés, vous devez parcourir chaque paire de communautés. Pour compter les membres de chaque communauté, vous pouvez utiliser la méthode 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)