Sankey Diagramme in R?

Ich versuche meinen Datenfluss mit einem Sankey-Diagramm in R zu visualisieren.

Ich fand diesen Blogbeitrag mit einem R-Skript verlinkt, das ein Sankey-Diagramm erzeugt, leider ist es ziemlich roh und etwas eingeschränkt (siehe unten für Beispielcode und Daten).

Kennt jemand andere Skripts – oder vielleicht sogar ein Paket -, das mehr entwickelt ist? Mein Endziel ist es, sowohl den Datenfluss als auch die Prozentsätze anhand der relativen Größe von Diagrammkomponenten zu visualisieren, wie in diesen Beispielen von Sankey-Diagrammen .

Ich habe eine ähnliche Frage auf der r-help-Liste gestellt , aber nach zwei Wochen ohne Antwort versuche ich mein Glück hier auf stackoverflow.

Danke, Eric

PS. Ich kenne den Parallelsätze-Plot , aber das ist nicht das, wonach ich suche.

# 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 Diagramm mit dem obigen Code produziert, Sankey-Diagramm mit dem obigen Code erzeugt

Dieses Diagramm kann über das Paket networkD3 erstellt werden. Es ermöglicht Ihnen, interaktive Sankey-Diagramme zu erstellen. Hier finden Sie ein Beispiel . Ich habe auch einen Screenshot hinzugefügt, damit Sie eine Idee haben, wie es aussieht.

Bildbeschreibung hier eingeben

Ich habe ein Paket ( riverplot ) erstellt, das im Vergleich zur Sankey-function eine etwas andere, aber sich überschneidende functionalität hat und Plots wie dieses erzeugen kann:

Bildbeschreibung hier eingeben

Wenn du es mit R machen willst, scheint dein bestes Gebot @Roman suggestion zu sein – hacke die SankeyR- function. Zum Beispiel – unten ist meine sehr schnelle Lösung – orientieren Sie einfach die Beschriftungen vertikal, verschieben Sie sie leicht und verringern Sie die Schrift für die Eingabefragmente, damit sie ein wenig besser aussieht. Diese Änderung ändert nur die Zeilen 171 und 223 in der SankeyR- function:

  #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) 

Bildbeschreibung hier eingeben

Ich bin kein Experte in Trigonometrie, aber das ist wirklich, was Sie brauchen, um die Richtung der Pfeile zu ändern. Das wäre meiner Meinung nach ideal – wenn Sie die Pfeile korrigieren könnten, so dass sie horizontal und nicht vertikal ausgerichtet sind. Ansonsten, warum meine Lösung das Problem mit der Orientierung der Etiketten behebt, macht es das Diagramm nicht viel lesbarer.

Zusätzlich zu rCharts können Sankey- Diagramme jetzt auch in R mit googleVis (Version> = 0.5.0) generiert werden. In diesem Post wird beispielsweise die Erstellung des folgenden Diagramms mit googleVis beschrieben: Bildbeschreibung hier eingeben

Das alluviale Paket von R wird dies auch tun (von ?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") ) 

Bildbeschreibung hier eingeben

plotly hat die gleiche performance wie networkD3 Paket ( Beispiel Link ).

Bildbeschreibung hier eingeben

Nach diesen Definitionen zu urteilen, fehlt es dieser function, wie der Plots der parallelen Mengen, an der Fähigkeit, Flüsse zu teilen und zu kombinieren (dh durch mehr als einen Übergang).

Da Sankey-Diagramme auf gewichtete Graphen ausgerichtet sind , könnte ein Paket wie qgraph nützlich sein.

Die SankeyR function bietet klarere Beschriftungen, wenn Sie die Verluste in absteigender Reihenfolge sortieren, da der Text näher an den Pfeilspitzen platziert wird, ohne sich zu überlappen.

Werfen Sie einen Blick auf //sankeybuilder.com, da es eine sofort einsatzfähige Lösung bietet, mit der Sie Ihre Daten und Wiedergabevariationen im Laufe der Zeit hochladen können. Der Übergang funktioniert gut (ähnlich wie bei der Youtube-Demo in Ihrer Frage). Wenn Sie die SankeyTrend-Demo laden, enthält sie viele Zeitfenster (Datenjahre). Einmal geladen (erstellt automatisch), klicken Sie auf die Wiedergabe-Schaltfläche in der oberen rechten Ecke der Seite für die Wiedergabe der Zeitfenster, Sie können sogar die Zeit anhalten und fortsetzen. Demo-URL ist hier: SankeyTrend Hoffe, dies hilft Ihnen bei der Suche nach dem perfekten Sankey-Diagramm.

Öffnen Sie einfach ein Paket, das ein alluviales Diagramm verwendet, um die Arbeitsschritte zu visualisieren. Da die Geschichte beibehalten wird, wenn die alluviale Form verwendet wird, gibt es keine Übergänge in den Kanten.

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

Bildbeschreibung hier eingeben