Gráficos Snakey con R
Gráficos Snakey con R
Hace unos días estaba viendo un informe con un tipo de gráficos que me gustó mucho, se trata de un diagrama de flujo aunque en la actualidad son denominados de manera habitual como diagramas de Sankey.
Aunque no fue el creador, se denominan así por el ingeniero y capitán irlandés Matthew Henry Phineas Riall Sankey que lo usó para una representación gráfica del flujo de energía en la máquina de vapor muy acertada.
El caso es que me puse a buscar como hacer este tipo de gráficos en R y encontré una librería llamada networkD3 que , de manera sencilla, permite representar dichos diagramas .
Ejemplo de diagrama de flujo con networkD3
Veamos un ejemplo realista para mostrar lo fácil que es y lo bien que queda este tipo de representación.
Usaré datos de flujo de agua desde las fuentes hasta los ayuntamientos y comunidades de regantes, para crear este gráfico:
El código es el siguiente:
# Ejemplo de diagrama de flujo SANKEY
library(networkD3) # cargamos librería
# Definimos los nodos de la red, que se numeran automáticamente de 0 a ..
nodes = data.frame("name" =
c("Fuente clara", # Node 0
"Bombeo 1", # Node 1
"Ayt. Villalocos", # Node 2
"Ayt. Torrecilla", # Nodo 3
"C.RR 1",# Nodo 4
"C.RR 2", # Nodo 5
"Embalse alto", # Nodo 6
"Ayt. Puerto Plata", # Nodo 7
"Ayt. Jerjes", # Nodo 8
"Fuente Negra" # Nodo 9
))
# Definimos ahora los flujos en la forma
# nodo origen, nodo final, cantidad de flujo
links = as.data.frame(matrix(c(
0, 1, 53, # desde, a, cuanto
0, 3, 5,
0, 4, 10,
1, 3, 5,
1, 8, 3,
1, 5, 7,
1, 4, 5,
1, 6, 32,
6,2,25,
6,7,7,
6,3,2,
9,3,40,
9,1,3),
byrow = TRUE, ncol = 3))
# nombramos las columnas con los nombres estándar de la librería networkD3
names(links) = c("source", "target", "value")
# Llamamos a la funcion de dibujo del diagrama
sankeyNetwork(Links = links, Nodes = nodes,
Source = "source", Target = "target",
Value = "value", NodeID = "name",
fontSize= 10, nodeWidth = 50,nodePadding = 10,
colourScale = JS("d3.scaleOrdinal(d3.schemeCategory10);"
)
)
Colorear flujo
Voy a poner otro bloque de código que viene de ejemplo en la librería.
La salida es muy interesante porque pinta el flujo de diferentes colores:
## Otro ejemplo
URL <- paste0('https://cdn.rawgit.com/christophergandrud/networkD3/',
'master/JSONdata/energy.json')
energy <- jsonlite::fromJSON(URL)
# Plot
sankeyNetwork(Links = energy$links, Nodes = energy$nodes, Source = 'source',
Target = 'target', Value = 'value', NodeID = 'name',
units = 'TWh', fontSize = 12, nodeWidth = 30)
# Colour links
energy$links$energy_type <- sub(' .*', '',
energy$nodes[energy$links$source + 1, 'name'])
sankeyNetwork(Links = energy$links, Nodes = energy$nodes, Source = 'source',
Target = 'target', Value = 'value', NodeID = 'name',
LinkGroup = 'energy_type', NodeGroup = NULL)
Espero que les haya servido, un saludo.
Dame una alegría.
Este es mi wallet BTC : msEYHzMea9boYyNhC8ZcHbRFStGUNujxhm