Gráficos Snakey con R

in #r7 years ago

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:

diagramadeflujo2.jpeg

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)

Rplot11.jpeg
Espero que les haya servido, un saludo.

Dame una alegría.
Este es mi wallet BTC : msEYHzMea9boYyNhC8ZcHbRFStGUNujxhm

Coin Marketplace

STEEM 0.20
TRX 0.16
JST 0.030
BTC 66050.66
ETH 2684.20
USDT 1.00
SBD 2.86