J'essaie de visualiser mon flux de données avec un diagramme de Sankey en R.
J'ai trouvé ce billet de blog un lien vers un script R qui produit un diagramme de Sankey, malheureusement il est assez brut et quelque peu limité (voir ci-dessous pour un exemple de code et de données).
Est-ce que quelqu'un connaît d'autres scripts - ou peut-être même un package - qui sont plus développés? Mon objectif final est de visualiser à la fois le flux de données et les pourcentages par la taille relative des composants du diagramme, comme dans ces exemples de diagrammes de Sankey .
J'ai posté ne question quelque peu similaire sur la liste r-help , mais après deux semaines sans aucune réponse, je tente ma chance ici sur stackoverflow.
Merci Eric
PS. Je connais le Parallel Sets Plot , mais ce n'est pas ce que je recherche.
# 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")
Diagramme de Sankey produit avec le code ci-dessus,
Ce tracé peut être créé via le networkD3
paquet. Il vous permet de créer des diagrammes sankey interactifs. Ici vous pouvez trouver un exemple . J'ai également ajouté une capture d'écran pour que vous ayez une idée de son apparence.
# 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)
J'ai créé un package ( riverplot ) qui a une fonctionnalité légèrement différente, mais qui se chevauche par rapport à la fonction Sankey, et peut produire des tracés comme celui-ci:
Si vous voulez le faire avec R, votre meilleure offre semble être la suggestion @Roman - piratez la fonction SankeyR . Par exemple - ci-dessous est ma solution très rapide - il suffit d'orienter les étiquettes verticalement, de les décaler légèrement et de diminuer la police pour les références d'entrée pour la rendre un peu meilleure. Cette modification ne modifie que les lignes 171 et 223 dans la fonction 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)
Je ne suis pas un as en trigonométrie, mais c'est vraiment ce dont vous avez besoin pour changer la direction des flèches. Ce serait idéal à mon avis - si vous pouviez ajuster les flèches perdues afin qu'elles soient orientées horizontalement plutôt que verticalement. Sinon, pourquoi ma solution résout le problème avec l'orientation des étiquettes, cela ne rend pas le diagramme beaucoup plus lisible ...
En plus de rCharts , Les diagrammes de Sankey peuvent maintenant être également générés dans R avec ( googleVis (version> = 0.5.0). Par exemple, ce post décrit la génération du diagramme suivant à l'aide de googleVis:
R's alluvial package fera également cela (à partir de ?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") )
complot a la même puissance que networkD3
package ( exemple de lien ).
A en juger par ces définitions cette fonction, comme le tracé des ensembles parallèles, n'a pas la capacité de diviser et de combiner les flux (c'est-à-dire à travers plus d'une transition).
Puisque les diagrammes de Sankey sont des graphiques pondérés dirigés , un package comme qgraph pourrait être utile.
La fonction SankeyR
fournit des étiquettes plus claires si vous triez les pertes par ordre décroissant lorsque le texte est placé plus près des têtes de flèche sans se chevaucher.
jetez un oeil à // sankeybuilder.com car il offre une solution prête à l'emploi où vous pouvez télécharger vos données et les variations de lecture au fil du temps. La transition fonctionne bien (similaire à la démo YouTube dans votre question). Si vous chargez la démo SankeyTrend, elle comprend de nombreux créneaux horaires (années de données). Une fois chargé (construit automatiquement les sankeys), cliquez sur le bouton de lecture dans le coin supérieur droit de la page pour la lecture des plages horaires, vous pouvez même faire une pause et reprendre le temps. L'URL de démonstration est ici: SankeyTrend J'espère que cela vous aidera dans votre quête du diagramme Sankey parfait.
Pour être complet, il y a aussi le paquet ggalluvial
qui est un ggplot2 extension
pour les diagrammes alluviaux/Sankey.
Voici un exemple tiré de la documentation du package
# 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")
Créé le 2018-11-13 par le package reprex (v0.2.1.9000)
Ouvrez simplement un package qui utilise un diagramme alluvial pour visualiser les étapes du flux de travail. Étant donné que l'historique est conservé lorsque la forme alluviale est utilisée, il n'y a pas de croisements sur les bords.