El paquete visNetwork permite crear gráficos de redes interactivos en R basados en la librería de JavaScript vis.js. Puedes hacer zoom, arrastrar los nodos y seleccionarlos para ver sus conexiones.
visNetwork necesita dos data frames: uno con los nodos, que debe contener una columna llamada id, y otro con las aristas, con las columnas from y to, que contienen los ids de los nodos conectados. Otras columnas, como label o group, se utilizarán para personalizar el gráfico.
En este tutorial vamos a utilizar una pequeña red con las relaciones entre los empleados de una empresa, que pertenecen a tres departamentos.
nodes <- data.frame(id = 1:12,
label = c("Ana", "Ben", "Carla", "David", "Eva", "Frank",
"Grace", "Hugo", "Iris", "Jack", "Kate", "Leo"),
group = rep(c("Marketing", "Ventas", "IT"), each = 4))
edges <- data.frame(from = c(1, 1, 1, 2, 3, 5, 5, 6, 7, 9, 9, 10, 11, 4, 8, 12),
to = c(2, 3, 4, 3, 4, 6, 7, 8, 8, 10, 11, 12, 12, 5, 9, 1))
visNetwork
Pasa los nodos y las aristas a la función visNetwork para crear la red. Como el data frame de los nodos contiene una columna group los nodos se colorearán por grupo automáticamente. Arrastra los nodos o usa la rueda del ratón para hacer zoom.
# install.packages("visNetwork")
library(visNetwork)
visNetwork(nodes, edges)
Ten en cuenta que la posición de los nodos se calcula con una simulación física, por lo que cambiará cada vez que crees el gráfico. Usa visLayout(randomSeed = ...) para obtener siempre la misma disposición.
El estilo de cada grupo se puede personalizar con la función visGroups, pasando el nombre del grupo a groupname y las opciones, como el color (color) o la forma (shape). Usa visLegend para añadir una leyenda con los grupos.
visNetwork(nodes, edges) |>
visGroups(groupname = "Marketing", color = "#E07A5F") |>
visGroups(groupname = "Ventas", color = "#3D405B") |>
visGroups(groupname = "IT", color = "#81B29A") |>
visLegend() |>
visLayout(randomSeed = 4)
La función visNodes establece el estilo de todos los nodos, como la forma con shape ("dot", "square", "triangle", "star", "box" o "ellipse", entre otras) y el tamaño con size. Si añades una columna llamada value a los nodos su tamaño dependerá de ella. En este ejemplo el tamaño depende del número de conexiones de cada nodo.
nodes$value <- as.numeric(table(factor(c(edges$from, edges$to),
levels = nodes$id)))
visNetwork(nodes, edges) |>
visNodes(shape = "dot") |>
visLayout(randomSeed = 4)
Las aristas se personalizan con la función visEdges. Usa arrows = "to" para crear una red dirigida, color para establecer el color de las aristas y el que toman al seleccionar un nodo y smooth = FALSE para dibujar líneas rectas. También puedes añadir una columna width a las aristas para establecer su grosor.
visNetwork(nodes, edges) |>
visNodes(shape = "dot") |>
visEdges(arrows = "to", color = list(color = "gray", highlight = "#E07A5F"),
smooth = FALSE) |>
visLayout(randomSeed = 4)
La función visOptions añade interactividad a la red. highlightNearest = TRUE resalta los nodos conectados al nodo seleccionado, nodesIdSelection = TRUE añade un menú desplegable para seleccionar un nodo y selectedBy añade otro menú para seleccionar todos los nodos de un grupo.
visNetwork(nodes, edges) |>
visNodes(shape = "dot") |>
visOptions(highlightNearest = TRUE,
nodesIdSelection = TRUE,
selectedBy = "group") |>
visLayout(randomSeed = 4)
Si tienes instalado el paquete igraph puedes usar sus disposiciones con la función visIgraphLayout, que además hace más rápidas las redes grandes, ya que las posiciones se calculan antes de dibujar el gráfico. En este ejemplo colocamos los nodos en un círculo con "layout_in_circle". Otras opciones son "layout_nicely", "layout_with_fr" o "layout_as_tree".
visNetwork(nodes, edges) |>
visNodes(shape = "dot") |>
visIgraphLayout(layout = "layout_in_circle")
Por último, puedes guardar la red como un archivo HTML con visSave. Si prefieres gráficos de redes estáticos hechos con ggplot2 consulta el paquete ggraph. También puedes crear gráficos interactivos con plotly.
red <- visNetwork(nodes, edges)
visSave(red, file = "red.html")
Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad
Ir al sitio
También te puede interesar