tutorial plotting networks network color r igraph

plotting - social networks in r



¿Cómo dividir un igraph en subgraphs conectados? (1)

Puedes calcular los componentes conectados de tu gráfico usando:

clusters(g) # $membership # [1] 1 1 1 1 1 1 2 2 3 1 # # $csize # [1] 7 2 1 # # $no # [1] 3

O puede crear un gráfico separado para cada componente de su gráfico usando:

dg <- decompose.graph(g) # returns a list of three graphs plot(dg[[1]]) # plot e.g. the 1st one

Tengo un igraph con varios componentes desconectados. Por ejemplo:

library(igraph) g <- simplify( graph.compose( graph.ring(10), graph.star(5, mode = "undirected") ) ) + edge("7", "8")

En este ejemplo, el nodo 9 es su propio gráfico, al igual que los nodos 7 y 8, y el resto forma un tercer gráfico.

Me gustaría tratar esto por separado, así que quiero convertir el igraph único en una lista de 3 igraphs (divididos por conectividad).

Hacké un código para lograrlo, pero es ineficiente y bastante horrible.

split_graph_into_connected_subgraphs <- function(g) { adjacency_list <- get.adjlist(g) connected_nodes <- lapply( adjacency_list, function(adjacent_nodes) { new_nodes <- out <- adjacent_nodes # Keep finding nodes that are adjacent to ones we already know about, # until we find no more repeat { doubly_adjacent_nodes <- Reduce(union, adjacency_list[new_nodes]) new_nodes <- setdiff(doubly_adjacent_nodes, out) if(length(new_nodes) == 0) { break } out <- union(out, new_nodes) } sort(out) } ) # Single value nodes should contain themselves, not be empty connected_nodes <- ifelse( vapply(adjacency_list, length, integer(1)) == 0, seq_along(connected_nodes), connected_nodes ) # We don''t care about repeats, just the unique graphs connected_nodes <- unique(connected_nodes) # Get the subgraph from each lapply( connected_nodes, function(nodes) induced.subgraph(g, nodes) ) } list_of_subgraphs <- split_graph_into_connected_subgraphs(g) lapply(list_of_subgraphs, plot)

¿Hay una forma más limpia de dividir el gráfico?