(igraph) Grouped layout based on attribute

后端 未结 1 1300
有刺的猬
有刺的猬 2020-12-03 16:18

I\'m using the iGraph package in R to layout a network graph, and I would like to group the vertex coordinates based on attribute values.

Similar to the answered q

相关标签:
1条回答
  • 2020-12-03 16:59

    While this question is rather old, it is a reasonable question and deserves an answer.

    No data was provided so I will generate an arbitrary example.

    library(igraph)
    set.seed(1234)
    G = erdos.renyi.game(20, 0.25)
    V(G)$Group1 = sample(3,20, replace=TRUE)
    plot(G, vertex.color=rainbow(3, alpha=0.4)[V(G)$Group1])
    

    Without doing anything, the Group is ignored.

    Now, we need to create a layout that will plot nodes in the same group close together. We can do this by creating a graph with the same nodes, but with additional links between nodes in the same group. The within-group links will be given a high weight and the original links will be given a small weight. This will cluster nodes in the same group. We then apply the layout to plotting the original graph, without the extra links. They were just to get a good layout.

    G_Grouped = G
    E(G_Grouped)$weight = 1
    
    ## Add edges with high weight between all nodes in the same group
    for(i in unique(V(G)$Group1)) {
        GroupV = which(V(G)$Group1 == i)
        G_Grouped = add_edges(G_Grouped, combn(GroupV, 2), attr=list(weight=5))
    } 
    
    ## Now create a layout based on G_Grouped
    set.seed(567)
    LO = layout_with_fr(G_Grouped)
    
    ## Use the layout to plot the original graph
    plot(G, vertex.color=rainbow(3, alpha=0.4)[V(G)$Group1], layout=LO)
    

    If you want to go beyond this to have multiple levels of grouping, just add additional links with appropriate weights to connect the subgroups too.

    0 讨论(0)
提交回复
热议问题