Peyman Peyman -4 years ago 189
R Question

how to make concentric circles layout in igraph (R)

I'm trying to create a special graph layout where 2 different types of nodes (based on their attribute) are placed on 2 different circles with different radius (concentric circles layout).

Here's a toy example where a graph with 10 nodes have an attribute (size). The goal is to place the nodes with size less than 5 on an inner circle, and the nodes with size greater than 5 on an outer circle:

g <- make_full_graph(10)
V(g)$size = V(g)


I couldn't find any such layout supported by igraph library. Does anyone know how to achieve this?

Answer Source

There is the layout_in_circle option if you only wanted one circle. You could apply that separately to each of your groups with something like this

layout_in_circles <- function(g, group=1) {
    layout <- lapply(split(V(g), group), function(x) {
        layout_in_circle(induced_subgraph(g,x))
    })
    layout <- Map(`*`, layout, seq_along(layout))
    x <- matrix(0, nrow=vcount(g), ncol=2)
    split(x, group) <- layout
    x
}

Then you could plot with

plot(g, layout=layout_in_circles(g, group=V(g)>5))

It doesn't do anything special to try to make the edges pretty. But I guess the point is you can define whatever function you want to control the layout by returning a matrix of coordinates.

enter image description here

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download