Diagrammes de Sankey en R?

j'essaie de visualiser mon flux de données avec un diagramme de Sankey en R.

j'ai trouvé ce billet de blog lien vers un script R qui produit un diagramme de Sankey, malheureusement il est assez brut et quelque peu limité (voir ci-dessous pour exemple de code et de données).

personne Ne sait d'autres scripts, ou peut-être même un paquet qui est plus développée? Mon but final est de visualiser le flux de données et les pourcentages par taille relative du diagramme composants, comme dans ces exemples de diagrammes de Sankey .

j'ai posté une question quelque peu similaire sur la liste d'aide r , mais après deux semaines sans réponse je tente ma chance ici sur stackoverflow.

Merci, Eric

PS. Je suis au courant de la trame des ensembles parallèles , mais ce n'est pas ce que je cherche.

# 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",
           "Referralsn",
           "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, Sankey <a href=Diagram produced with the code above" src="/images/content/9968433/1090503ee428cb323f772745af4bcff4.png">

77
demandé sur Community 2012-04-02 01:17:02

9 réponses

ce tracé peut être créé par le paquet networkD3 . Il vous permet de créer des diagrammes sankey interactifs. Ici vous pouvez trouver un exemple . J'ai aussi ajouté une capture d'écran pour que vous ayez une idée de ce à quoi ça ressemble.

enter image description here

53
répondu JT85 2016-08-09 21:10:53

j'ai créé un paquet ( riverplot ) qui a une fonctionnalité légèrement différente, mais se chevauchant par rapport à la fonction Sankey, et peut produire des tracés comme celui-ci:

enter image description here

37
répondu January 2014-03-03 13:35:13

si vous voulez le faire avec R, votre meilleure offre semble être @Roman suggestion - pirater la fonction SankeyR . Par exemple - ci-dessous est ma solution très rapide-simplement Orienter les étiquettes verticaly, légèrement offset eux et diminuer la police pour les referals d'entrée pour le faire paraître un peu mieux. Cette modification ne modifie que les lignes 171 et 223 de 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)

enter image description here

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 des loose de sorte 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...

36
répondu Geek On Acid 2012-04-04 14:03:12

en plus de rCharts , Sankey les diagrammes peuvent maintenant être aussi générés en R avec googleVis (version >= 0.5.0). Par exemple, ce post décrit la génération du diagramme suivant en utilisant googleVis: enter image description here

20
répondu leo9r 2014-11-04 00:40:37

R vont aussi le faire (à 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") )

enter image description here

13
répondu geotheory 2018-02-12 13:35:31

plotly a le même pouvoir que networkD3 package ( exemple de lien ).

enter image description here

8
répondu cuttlefish44 2017-07-28 07:00:25

à en juger par ces définitions cette fonction, comme le diagramme des ensembles parallèles, n'a pas la capacité de diviser et de combiner les flux (c.-à-d. Par plus d'une transition).

depuis les diagrammes de Sankey sont des graphiques pondérés dirigés , un paquet comme qgraph pourrait être utile.

la fonction SankeyR fournit des étiquettes plus claires si vous triez les pertes dans l'ordre décroissant le texte est placé plus près des flèches sans se chevaucher.

6
répondu RobinGower 2012-04-03 23:16:34

regarder //sankeybuilder.com car il offre un prêt à aller où vous pouvez télécharger vos données et la lecture des variations au fil du temps. La transition fonctionne bien (similaire à la démo youtube dans votre question). Si vous chargez la démo de SankeyTrend, elle inclut de nombreuses plages horaires (années de données). Une fois chargé (construit sankeys automatiquement), cliquez sur le bouton play dans le coin supérieur droit de la page pour la lecture des fentes de temps, vous pouvez même les temps de reprise. L'url de démonstration est ici: SankeyTrend espérons que cela aide votre quête pour le diagramme parfait de Sankey.

5
répondu Rob 2016-03-21 12:26:28

vient d'ouvrir un paquet qui utilise un diagramme alluvial pour visualiser les étapes du flux de travail. Puisque l'histoire est conservée lorsque la forme alluviale est utilisée, il n'y a pas de croix dans les bords.

https://github.com/claytontstanley/shiny.alluvial

enter image description here

1
répondu Clayton Stanley 2017-10-03 21:46:40