Gráficos de redes interactivos en R con visNetwork

Librería

visNetwork

Datos de muestra

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))

La función 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.

Grupos y leyenda

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)

Forma y tamaño de los nodos

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)

Aristas

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)

Resaltar y seleccionar nodos

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)

Disposición

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")
MASTER - STATISTICS DOT COM

Master Statistics

Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad

Ir al sitio
R PACKAGES IO

R Packages

Explora y descubre miles de paquetes, funciones y datasets de R

Ir al sitio

También te puede interesar