Un diagrama de Sankey muestra flujos entre nodos, donde el ancho de cada enlace es proporcional al tamaño del flujo. En este tutorial vamos a utilizar un data frame con las visitas de una web, que van desde el origen del tráfico hasta las páginas de la web y desde las páginas hasta el resultado final.
plotly necesita los nodos y los índices del origen y el destino de cada enlace. Crea un data frame con los nombres de los nodos y usa match para obtener la posición de cada origen y destino. Ten en cuenta que tienes que restar uno, ya que los índices de plotly empiezan en cero.
links <- data.frame(
source = c("Búsqueda orgánica", "Búsqueda orgánica", "Redes sociales", "Redes sociales",
"Email", "Email", "Blog", "Blog", "Página de producto", "Página de producto"),
target = c("Blog", "Página de producto", "Blog", "Página de producto",
"Blog", "Página de producto", "Página de producto", "Salida", "Compra", "Salida"),
value = c(500, 300, 250, 100, 80, 170, 350, 480, 320, 600)
)
nodes <- data.frame(name = unique(c(links$source, links$target)))
links$source_id <- match(links$source, nodes$name) - 1
links$target_id <- match(links$target, nodes$name) - 1
Establece type = "sankey" dentro de plot_ly y pasa las etiquetas de los nodos a node y los índices y los valores de los enlaces a link, ambos como listas. Puedes arrastrar los nodos para reorganizarlos y pasar el ratón por encima de los enlaces para ver el tamaño de cada flujo.
# install.packages("plotly")
library(plotly)
plot_ly(type = "sankey",
node = list(label = nodes$name),
link = list(source = links$source_id,
target = links$target_id,
value = links$value))
Los colores de los nodos se establecen con el elemento color de la lista node. Pasa un vector con tantos colores como nodos, en el mismo orden que en el data frame de los nodos.
cols <- c("#1B998B", "#ED217C", "#F4A259", "#2D3047", "#5B8E7D", "#BC4B51", "#3BB273")
plot_ly(type = "sankey",
node = list(label = nodes$name,
color = cols),
link = list(source = links$source_id,
target = links$target_id,
value = links$value))
Por defecto, los enlaces son grises. Una opción habitual es colorear cada enlace con el color de su nodo de origen añadiendo algo de transparencia. Para ello, selecciona los colores con los índices de los orígenes (sumando uno, ya que los índices de R empiezan en uno), obtén sus valores RGB con col2rgb y crea colores rgba, donde el último valor es la transparencia.
rgb_cols <- col2rgb(cols[links$source_id + 1])
link_cols <- sprintf("rgba(%d, %d, %d, 0.4)",
rgb_cols[1, ], rgb_cols[2, ], rgb_cols[3, ])
plot_ly(type = "sankey",
node = list(label = nodes$name,
color = cols),
link = list(source = links$source_id,
target = links$target_id,
value = links$value,
color = link_cols))
La lista node también permite personalizar la separación entre los nodos con pad, su ancho con thickness y su borde con line, que recibe una lista con el color (color) y el ancho (width) del borde.
plot_ly(type = "sankey",
node = list(label = nodes$name,
color = cols,
pad = 30,
thickness = 12,
line = list(color = "white", width = 2)),
link = list(source = links$source_id,
target = links$target_id,
value = links$value,
color = link_cols))
El texto que se muestra al pasar el ratón por encima de los enlaces se puede personalizar con hovertemplate, usando %{source.label}, %{target.label} y %{value}. Además, puedes añadir un sufijo a los valores con valuesuffix y cambiar el título y la fuente con layout.
plot_ly(type = "sankey",
valuesuffix = " visitas",
node = list(label = nodes$name,
color = cols),
link = list(source = links$source_id,
target = links$target_id,
value = links$value,
color = link_cols,
hovertemplate = "De %{source.label} a %{target.label}<br>%{value}<extra></extra>")) |>
layout(title = "Tráfico de la web", font = list(size = 12))
Establece orientation = "v" para crear un diagrama de Sankey vertical, en el que los flujos van de arriba a abajo. Esta orientación es útil cuando hay muchas etapas o cuando los nombres de los nodos son largos.
plot_ly(type = "sankey",
orientation = "v",
node = list(label = nodes$name,
color = cols),
link = list(source = links$source_id,
target = links$target_id,
value = links$value,
color = link_cols))
Si prefieres gráficos estáticos puedes crear un diagrama de Sankey en ggplot2 o un gráfico aluvial. Consulta la guía de gráficos interactivos con plotly para aprender más sobre el paquete.
Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad
Ir al sitio
También te puede interesar