PCK1992
PCK1992

Reputation: 213

Extracting simplified graph in igraph

I have a network that looks like this

library(igraph)
library(igraphdata)

data("kite")
plot(kite)

The graph I am working with

I run a community detection and the result looks like this

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

The result of the community detection mapped on the network

Now I want to extract a network based on the communities. The edge weight should be the number of ties between communities (how strong are communities connected to each other), the vertex attribute should be the number of nodes in the community (called 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)

The graph should look like this Final product One node is larger than the others, one edge has a lot of weight in comparison to the others.

Upvotes: 2

Views: 699

Answers (1)

deeenes
deeenes

Reputation: 4576

As far as I know, igraph doesn't have method to count edges connecting groups of vertices. Therefore to count the edges connecting communities you need to iterate over each pairs of communities. To count the members for each community, you can use the sizes method.

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)

Upvotes: 1

Related Questions