Estoy tratando de visualizar mi flujo de datos con un diagrama de Sankey en R.
Encontré esta publicación de blog enlazada a un script R que produce un Diagrama de Sankey, desafortunadamente es bastante crudo y algo limitado (vea a continuación el código y los datos de muestra).
¿Alguien sabe de otros scripts, o tal vez incluso de 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 de Sankey .
Publiqué una pregunta algo similar en la lista de r-help , pero después de dos semanas sin ninguna respuesta, estoy probando suerte aquí en stackoverflow.
Gracias Eric
PD. Soy consciente de la trama 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")
Diagrama de Sankey producido con el código anterior,
fuente
Respuestas:
Este gráfico se puede crear a través del
networkD3
paquete. Le permite crear diagramas sankey interactivos. Aquí puede encontrar un ejemplo . También agregué una captura de pantalla para que tengas una idea de cómo se ve.# Load package library(networkD3) # Load energy projection data # Load energy projection data 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)
fuente
htmlwidgets
es la parcela Sankey delnetworkD3
paquete. Actualicé la publicación.He creado un paquete ( riverplot ) que tiene una funcionalidad ligeramente diferente, pero superpuesta, en comparación con la función Sankey, y puede producir gráficos como este:
fuente
Si quieres hacerlo con R, tu mejor oferta parece ser la sugerencia de @Roman: hackear la función SankeyR . Por ejemplo, a continuación se muestra mi solución muy rápida: simplemente orientar las etiquetas verticalmente, desplazarlas ligeramente y disminuir la fuente para las referencias de entrada para que se vea un poco mejor. Esta modificación solo cambia las líneas 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 experto en trigonometría, pero esto es realmente lo que necesitas para cambiar la dirección de las flechas. Eso sería ideal en mi opinión, si pudiera ajustar las flechas sueltas para que estén orientadas horizontalmente en lugar de verticalmente. De lo contrario, la razón por la que mi solución soluciona el problema con la orientación de las etiquetas no hace que el diagrama sea mucho más legible ...
fuente
Además de rCharts , los diagramas de Sankey ahora también se pueden generar en R con googleVis (versión> = 0.5.0). Por ejemplo, esta publicación describe la generación del siguiente diagrama usando googleVis:
fuente
R's aluvialpaquete también hará esto (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") )
fuente
plotly tiene el mismo poder que el
networkD3
paquete ( enlace de ejemplo ).fuente
A juzgar por estas definiciones, esta función, como el gráfico de conjuntos paralelos, carece de capacidad para dividir y combinar flujos (es decir, a través de más de una transición).
Dado que los diagramas de Sankey son gráficos ponderados dirigidos , un paquete como qgraph puede resultar útil.
La
SankeyR
función proporciona etiquetas más claras si clasifica las pérdidas en orden descendente a medida que el texto se coloca más cerca de las puntas de las flechas sin superponerse.fuente
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 muchas franjas horarias (años de datos). Una vez cargado (construye sankeys 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. La URL de demostración está aquí: SankeyTrend Espero que esto ayude en su búsqueda del diagrama de Sankey perfecto.
fuente
Para completar, también está el
ggalluvial
paquete que esggplot2 extension
para diagramas aluviales / Sankey.Aquí hay un ejemplo tomado de la documentación del paquete.
# devtools::install_github("corybrunson/ggalluvial", ref = "optimization") library(ggalluvial) titanic_wide <- data.frame(Titanic) ggplot(data = titanic_wide, aes(axis1 = Class, axis2 = Sex, axis3 = Age, y = Freq)) + scale_x_discrete(limits = c("Class", "Sex", "Age"), expand = c(.1, .05)) + xlab("Demographic") + geom_alluvium(aes(fill = Survived)) + geom_stratum() + geom_text(stat = "stratum", label.strata = TRUE) + theme_minimal() + ggtitle("passengers on the maiden voyage of the Titanic", "stratified by demographics and survival") + theme(legend.position = 'bottom')
ggplot(titanic_wide, aes(y = Freq, axis1 = Survived, axis2 = Sex, axis3 = Class)) + geom_alluvium(aes(fill = Class), width = 0, knot.pos = 0, reverse = FALSE) + guides(fill = FALSE) + geom_stratum(width = 1/8, reverse = FALSE) + geom_text(stat = "stratum", label.strata = TRUE, reverse = FALSE) + scale_x_continuous(expand = c(0, 0), breaks = 1:3, labels = c("Survived", "Sex", "Class")) + scale_y_discrete(expand = c(0, 0)) + coord_flip() + ggtitle("Titanic survival by class and sex")
Creado el 2018-11-13 por el paquete reprex (v0.2.1.9000)
fuente
Simplemente abrió un paquete que utiliza un diagrama aluvial para visualizar las etapas del flujo de trabajo. Dado que la historia se mantiene cuando se usa la forma aluvial, no hay cruces en los bordes.
https://github.com/claytontstanley/shiny.alluvial
fuente