2012-04-01 17 views
71

Ich versuche, meinen Datenfluss mit einem Sankey Diagramm in R.Sankey-Diagramme in R?

I this blog post zu einer R-Skript Verlinkung zu visualisieren, die ein Sankey Diagramm erzeugt, es ist leider ziemlich roh und etwas eingeschränkt (siehe unten für Beispielcode und Daten).

Kennt jemand andere Skripte - oder vielleicht sogar ein Paket - das ist mehr entwickelt? Mein Endziel ist es, sowohl den Datenfluss als auch die Prozentsätze nach der relativen Größe der Diagrammkomponenten zu visualisieren, wie in these examples of Sankey Diagrams.

Ich postete a somewhat similar question on the r-help list, aber nach zwei Wochen ohne irgendwelche Antworten versuche ich mein Glück hier auf stackoverflow.

Danke, Eric

PS. Ich bin mir der Parallel Sets Plot bewusst, 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 erzeugt, Sankey Diagram produced with the code above

+2

Die Pfeile schauen mir gut, sieht aus wie Sie den Text mit Feinabstimmung sind links und Sie sind in? –

+0

@Roman Luštrik, ich stimme zu, dieses Diagramm ist überhaupt nicht schlecht, aber meine R-Fähigkeiten sind immer noch begrenzt, also kann ich nicht so viel Feineinstellung in R machen, wenn das das war, was du meintest? Ich könnte es natürlich in Adobe Illustrator oder so ähnlich machen, aber das würde das Prinzip der reproduzierbaren Forschung brechen, das für mich ein zentrales Element in jeder (akademischen) Arbeit ist. Haben Sie [die Beispiele, mit denen ich in der Post verlinkt habe] (http://www.sankey-diagrams.com/tag/software/) angeschaut? –

+0

Mir ist klar, dass meine Frage keine gute Frage in dem Sinne ist, dass es kein spezifisches Programmierproblem und nicht direkt praktikabel ist, sondern eine etwas offene Frage ([aus dem FAQ]) (http://stackoverflow.com/faq)). Um diese Frage zu beantworten, müsste man entweder die verschiedenen graphischen Optionen in R überwachen und auf dieser Basis meine Frage mit einem _no beantworten, es gibt keine Scripts oder Pakete, die entwickelter sind, oder man müsste von a wissen weiterentwickelte Methode zur Herstellung von Sankey-Diagrammen in R und weisen darauf hin. Vielleicht gibt es einen besseren Ort, um diese Frage zu stellen? –

Antwort

6

durch these definitions Beurteilung diese Funktion, wie der parallelen Sätze Plot, fehlt die Fähigkeit, zu spalten und zu kombinieren Ströme (das heißt durch mehr als einen Übergang).

Seit Sankey diagrams are directed weighted graphs könnte ein Paket wie qgraph nützlich sein.

Die Funktion SankeyR 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.

+0

Das Sortieren der Verluste in absteigender Reihenfolge würde die Richtungsqualität des Diagramms beeinträchtigen. Wenn Sie sich das Diagramm, das ich übergeben habe, genau ansehen, sehen Sie, dass _time_ auf der X-Achse steht, daher die aktuelle Reihenfolge. Ich kenne [sankey-diagrams.com] (http://www.sankey-diagrams.com/) und die Artikel darüber, mein erster Gedanke, als ich diese Website sah, war op R zu öffnen und einen netten Sankey zu produzieren Diagramm in [ggplot2] (http://had.co.nz/ggplot2/). –

36

Wenn Sie es mit R machen wollen, scheint Ihr bestes Gebot @Roman Vorschlag zu sein - hacken Sie die SankeyR Funktion. 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 Modifikation ändert sich nur Linie 171 und 223 in der SankeyR Funktion:

#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

Ich bin kein Ass in Trigonometrie, aber das ist wirklich das, was Sie für die Änderung der Richtung der Pfeile müssen. 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 Etiketten Ausrichtung behebt, macht es das Diagramm nicht viel lesbarer ...

+1

das ist ein netter Hack, danke. Ich habe es schon viel besser gemacht. Sie haben meine Stimme und wenn nichts Besseres kommt, bin ich glücklich, Ihnen die Prämie zu überweisen, wenn die Zeit abgelaufen ist. Außerdem mag ich deinen Benutzernamen. –

34

Ich habe ein Paket erstellt (riverplot), die eine etwas andere, aber überlappende Funktionalität im Vergleich zu den Sankey hat Funktion und kann Plots wie diese produzieren:

enter image description here

+0

Das sieht wirklich beeindruckend aus! Ich werde es so schnell wie möglich ansehen. –

47

dieses Grundstück kann durch das networkD3 Paket erstellt werden. Es ermöglicht Ihnen, interaktive Sankey-Diagramme zu erstellen. Hier finden Sie eine example. Ich habe auch einen Screenshot hinzugefügt, damit Sie eine Idee haben, wie es aussieht.

enter image description here

+2

Beispiel Link ist gebrochen – Nelson

+1

In der Tat. Eine bessere Alternative seit der Einführung von 'htmlwidgets' ist das sankey-Plot aus dem' networkD3'-Paket. Ich habe den Beitrag aktualisiert. – JT85

+1

Ist es möglich, numerische Werte als Überschrift anstelle von Ganzzahl zu haben? Die Werte sind korrekt, aber die Beschriftung scheint abgerundet zu sein. ZB: Wert = 0.8 und Wert = 0.2 haben unterschiedliche Linienbreiten, aber die Beschriftung sagt "0" für beide. –

20

Neben rCharts, jetzt Sankey Diagramme auch in R mit googleVis (Version> = 0.5.0) erzeugt werden kann. Zum Beispiel beschreibt das post die Erzeugung des folgenden Diagramm googleVis mit: enter image description here

5

haben einen Blick auf //sankeybuilder.com wie es eine fertige Lösung bietet gehen, wo Sie Ihre Daten und Wiedergabe Variationen im Laufe der Zeit hochladen. 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 das hilft Ihnen bei der Suche nach dem perfekten Sankey-Diagramm.

9

Rs Paket wird dies auch tun (von).

# 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

1

Gerade Open Source ein Paket, das ein alluvialen Diagramm verwendet Workflowstufen sichtbar zu machen. 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

enter image description here