networkd3 - Diagramas Sankey en R?
sankey diagram (9)
Estoy tratando de visualizar mi flujo de datos con un diagrama de Sankey en R.
Encontré esta publicación de blog vinculada a un guión R que produce un Diagrama de Sankey, desafortunadamente es bastante crudo y algo limitado (ver a continuación el código de muestra y los datos).
¿Alguien sabe de otros guiones, o tal vez incluso un paquete, que esté más desarrollado? Mi objetivo final es visualizar tanto el flujo de datos como los porcentajes por tamaño relativo de los componentes del diagrama, como en estos ejemplos de Diagramas Sankey .
Publiqué una pregunta algo similar en la lista de ayuda , pero después de dos semanas sin ninguna respuesta estoy probando suerte aquí en stackoverflow.
Gracias, Eric
PD. Estoy al tanto de la Parcela de Conjuntos Paralelos , pero eso no es lo que estoy buscando.
# thanks to, https://tonybreyal.wordpress.com/2011/11/24/source_https-sourcing-an-r-script-from-github/
sourc.https <- function(url, ...) {
# install and load the RCurl package
if (match(''RCurl'', nomatch=0, installed.packages()[,1])==0) {
install.packages(c("RCurl"), dependencies = TRUE)
require(RCurl)
} else require(RCurl)
# parse and evaluate each .R script
sapply(c(url, ...), function(u) {
eval(parse(text = getURL(u, followlocation = TRUE,
cainfo = system.file("CurlSSL", "cacert.pem",
package = "RCurl"))), envir = .GlobalEnv)
} )
}
# from https://gist.github.com/1423501
sourc.https("https://raw.github.com/gist/1423501/55b3c6f11e4918cb6264492528b1ad01c429e581/Sankey.R")
# My example (there is another example inside Sankey.R):
inputs = c(6, 144)
losses = c(6,47,14,7, 7, 35, 34)
unit = "n ="
labels = c("Transfers",
"Referrals/n",
"Unable to Engage",
"Consultation only",
"Did not complete the intake",
"Did not engage in Treatment",
"Discontinued Mid-Treatment",
"Completed Treatment",
"Active in /nTreatment")
SankeyR(inputs,losses,unit,labels)
# Clean up my mess
rm("inputs", "labels", "losses", "SankeyR", "sourc.https", "unit")
Sankey Diagram producido con el código anterior,
A juzgar por estas definiciones, esta función, como la Parcela de conjuntos paralelos, carece de la capacidad de dividir y combinar flujos (es decir, a través de más de una transición).
Como los diagramas de Sankey son gráficos ponderados dirigidos , un paquete como qgraph podría ser útil.
La función SankeyR
proporciona etiquetas más claras si ordena las pérdidas en orden descendente a medida que el texto se coloca más cerca de las puntas de las flechas sin superponerse.
El paquete alluvial de R también lo hará (desde ?alluvial
).
# install.packages(c("alluvial"), dependencies = TRUE)
require(alluvial)
# Titanic data
tit <- as.data.frame(Titanic)
# 4d
alluvial( tit[,1:4], freq=tit$Freq, border=NA,
hide = tit$Freq < quantile(tit$Freq, .50),
col=ifelse( tit$Class == "3rd" & tit$Sex == "Male", "red", "gray") )
Esta trama se puede crear a través del paquete networkD3
. Le permite crear diagramas de sankey interactivos. Aquí puedes encontrar un example . También agregué una captura de pantalla para que tengas una idea de cómo se ve.
He creado un paquete ( riverplot ) que tiene una funcionalidad ligeramente diferente, pero superpuesta en comparación con la función Sankey, y puede producir trazados como este:
Si quieres hacerlo con R, tu mejor oferta parece ser la sugerencia de @Roman: piratear la función SankeyR . Por ejemplo, a continuación, mi solución más rápida es: simplemente oriente las etiquetas verticalmente, desdórnelas levemente y disminuya la fuente para los comentarios de entrada para que se vea un poco mejor. Esta modificación solo cambia la línea 171 y 223 en la función SankeyR :
#line171 - change oversized font size of input label
fontsize = max(0.5,frInputs[j]*1.5)#1.5 instead of 2.5
#line223 - srt changes from 35 to 90 to orient labels vertically,
#and offset adjusts them to get better alignment with arrows
text(txtX, txtY, fullLabel, cex=fontsize, pos=4, srt=90, offset=0.1)
No soy un as en la trigonometría, pero esto es realmente lo que necesitas para cambiar la dirección de las flechas. Eso sería ideal, desde mi punto de vista, si pudiera ajustar, pierde las flechas para que estén orientadas horizontalmente en lugar de verticalmente. De lo contrario, por qué mi solución corrige el problema con la orientación de las etiquetas, no hace que el diagrama sea mucho más legible ...
Simplemente abre un paquete que utiliza un diagrama aluvial para visualizar las etapas del flujo de trabajo. Como se conserva la historia cuando se usa la forma aluvial, no hay cruces en los bordes.
eche un vistazo a //sankeybuilder.com, ya que ofrece una solución lista para usar donde puede cargar sus datos y variaciones de reproducción a lo largo del tiempo. La transición funciona bien (similar a la demostración de youtube en su pregunta). Si carga la demostración de SankeyTrend, incluye muchos espacios de tiempo (Años de datos). Una vez cargado (construye los archivos de seguridad automáticamente), haga clic en el botón de reproducción en la esquina superior derecha de la página para reproducir los intervalos de tiempo, incluso puede pausar y reanudar el tiempo. Demo url está aquí: SankeyTrend Espero que esto ayude a tu búsqueda del diagrama de Sankey perfecto.