How to make grouped layout in igraph?

后端 未结 4 1599
旧时难觅i
旧时难觅i 2020-12-01 11:17

In igraph, after applying a modularization algorithm to find graph communites, i would like to draw a network layout which clearly makes visible the distinct co

4条回答
  •  佛祖请我去吃肉
    2020-12-01 11:58

    Inspired on Antoine's suggestion, I created this function:

    edge.weights <- function(community, network, weight.within = 100, weight.between = 1) {
    bridges <- crossing(communities = community, graph = network)
    weights <- ifelse(test = bridges, yes = weight.between, no = weight.within)
    return(weights) 
    }
    

    The function does the same; just put your community object in the community slot, your graph in the network one. I would left the weight.between = 1 and tune the weight.within value.

    Then transfer the weights to the weight slot in the nodes:

    E(graph)$weight <- edge.weights(community, graph)
    

    Finally use a layout algorithm that uses weights like layout_with_fr (the new name of fruchterman.reingold in igraph 1.0.1).

    I use the Zachary's karate club network as example.

    library(igraph)
    library(igraphdata)
    #I load the network
    data(karate)
    #for reproducible purposes
    set.seed(23548723)
    karateLayout <- layout_with_fr(karate)
    par(mar = c(0,0,2,0))
    plot(karate, vertex.size = 10, vertex.color = "steelblue4", edge.width = 1, 
    vertex.label = NA, edge.color = "darkgrey", layout = karateLayout,
    main = "Zachary's karate club network" )
    

    I detect the communities by multi-level optimization of modularity with the cluster_louvain function:

    Communitykarate <- cluster_louvain(karate)
    

    The next it's a personal preference over the defaults:

    prettyColors <- c("turquoise4", "azure4", "olivedrab","deeppink4")
    communityColors <- prettyColors[membership(Communitykarate)]
    

    The graph with the communities highlighted using colors is:

    plot(x = Communitykarate, y = karate, edge.width = 1, vertex.size = 10, 
    vertex.label = NA, mark.groups = NULL, layout = karateLayout, col = communityColors,
    main = "Communities in Zachary's karate club network",
    edge.color = c("darkgrey","tomato2")crossing(Communitykarate, karate) + 1])
    

    Now, the meaning why this question exist.

    E(karate)$weight <- edge.weights(Communitykarate, karate)
    # I use the original layout as a base for the new one
    karateLayoutA <- layout_with_fr(karate, karateLayout)
    # the graph with the nodes grouped
    plot(x = Communitykarate, y = karate, edge.width = 1, vertex.size = 10, 
    mark.groups = NULL, layout = karateLayoutA, vertex.label = NA, col = communityColors, 
    c("darkgrey","tomato2")[crossing(Communitykarate, karate) + 1],
    main = "Communities in Zachary's karate club network (grouped)")
    

    If you try with more weight you will have have:

    E(karate)$weight <- edge.weights(Communitykarate, karate, weight.within = 1000)
    karateLayoutB <- layout_with_fr(karate, karateLayout)
    plot(x = Communitykarate, y = karate, edge.width = 1, vertex.size = 10,
     mark.groups = NULL, layout = karateLayoutB, vertex.label = NA, col = communityColors, 
    c("darkgrey","tomato2")[crossing(Communitykarate, karate) + 1],
    main = "Communities in Zachary's karate club network (grouped)")
    

提交回复
热议问题