2012-04-01 27 views
71

Sto cercando di visualizzare il mio flusso di dati con un diagramma Sankey in R.Sankey Diagrams in R?

ho trovato this blog post collegamento ad uno script in R che produce un diagramma Sankey, purtroppo è abbastanza crudo e un po 'limitata (vedi sotto per il codice di esempio e di dati).

Qualcuno sa di altri script - o forse anche di un pacchetto - che è più sviluppato? Il mio obiettivo finale è visualizzare sia il flusso di dati sia le percentuali in base alle dimensioni relative dei componenti del diagramma, come in these examples of Sankey Diagrams.

Ho inviato a somewhat similar question on the r-help list, ma dopo due settimane senza alcuna risposta sto tentando la fortuna qui su StackOverflow.

Grazie, Eric

PS. Sono a conoscenza dello Parallel Sets Plot, ma non è quello che sto cercando.

# 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 Schema prodotto con il codice di cui sopra, Sankey Diagram produced with the code above

+2

Le frecce guardano bene a me, sembra che si è lasciato con la messa a punto del testo e sei in? –

+0

@Roman Luštrik, sono d'accordo, questo diagramma non è affatto male, ma le mie abilità R sono ancora limitate, quindi non posso davvero fare molto fine tuning in R, se era questo che intendevi? Ovviamente potrei farlo in Adobe Illustrator, o qualcosa del genere, ma ciò spezzerebbe il principio della ricerca riproducibile, che per me è un elemento centrale in qualsiasi lavoro (accademico). Hai guardato [gli esempi a cui mi sono collegato nel post] (http://www.sankey-diagrams.com/tag/software/)? –

+0

Mi rendo conto che la mia domanda non è una buona domanda, nel senso che non è un problema di programmazione specifico e non direttamente pratico, ma una domanda un po 'aperta ([dalle FAQ] (http://stackoverflow.com/faq)). Per rispondere a questa domanda si dovrebbe avere una supervisione sulle diverse opzioni grafiche in R e su quella base rispondere alla mia domanda con un _no, non ci sono script o pacchetti là fuori che sono più sviluppati_, o si dovrebbe sapere di un metodo più sviluppato per produrre Sankey Diagram in R e puntare ad esso. Forse c'è un posto migliore per pubblicare questa domanda? –

risposta

6

giudicare da these definitions questa funzione, come la serie parallele Plot, manca la capacità di tagliare e unire flussi (cioè attraverso più di un passaggio).

Dal Sankey diagrams are directed weighted graphs, un pacchetto come qgraph potrebbe essere utile.

La funzione SankeyR fornisce etichette più chiare se si ordinano le perdite in ordine decrescente man mano che il testo viene posizionato più vicino alle frecce senza sovrapposizione.

+0

L'ordinamento delle perdite in ordine decrescente interromperà la qualità direzionale del diagramma. Se osservi attentamente il diagramma che ho inviato, vedrai che _time_ è sull'asse x, da cui l'ordine corrente. Sono a conoscenza di [sankey-diagrams.com] (http://www.sankey-diagrams.com/) e degli articoli su di esso, il mio primo pensiero quando ho visto quel sito web era di aprire op R e produrre un bel Sankey Diagramma in [ggplot2] (http://had.co.nz/ggplot2/). –

36

Se vuoi farlo con R, la tua migliore offerta sembra essere il suggerimento di @Roman - modificare la funzione SankeyR. Ad esempio, di seguito è la mia soluzione molto rapida: orienta semplicemente le etichette verticalmente, leggermente le compensi e diminuisci il font per i riferimenti di input per renderlo un po 'migliore. Questa modifica cambia solo la linea 171 e 223 nella funzione 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

Non sono un asso nella trigonometria, ma questo è davvero quello che serve per cambiare la direzione delle frecce. Sarebbe l'ideale, a mio avviso, se potessi regolare perdere frecce in modo che siano orientate orizzontalmente piuttosto che verticalmente. Altrimenti, perché la mia soluzione risolve il problema con l'orientamento delle etichette, non rende il diagramma molto più leggibile ...

+1

è un bel trucco, grazie. L'ho già fatto molto meglio. Hai il mio voto in rialzo e se non succede niente di meglio, sono felice di trasferirti la taglia quando il tempo scadrà. Inoltre, mi piace il tuo nome utente. –

34

Ho creato un pacchetto (riverplot) che ha una funzionalità leggermente diversa, ma sovrapposta rispetto al Sankey funzione, e possono produrre trame come questo:

enter image description here

+0

Questo sembra davvero impressionante! Darei un'occhiata al più presto. –

47

questo grafico possono essere creati attraverso il pacchetto networkD3. Ti permette di creare diagrammi di Sankey interattivi. Qui puoi trovare uno example. Ho anche aggiunto uno screenshot per avere un'idea di come sia.

enter image description here

+2

collegamento di esempio è rotto – Nelson

+1

Infatti. Un'alternativa migliore dall'introduzione di 'htmlwidgets' è la trama sankey dal pacchetto' networkD3'. Ho aggiornato il post. – JT85

+1

È possibile avere valori numerici come didascalia anziché intero? I valori sono presi correttamente, ma la didascalia sembra essere arrotondata. Ad esempio: valore = 0,8 e valore = 0,2 hanno diverse larghezze della linea, ma la didascalia dice '0' per entrambi. –

20

Oltre a rCharts, Sankey diagrammi possono ora essere anche generati in R con googleVis (versione> = 0.5.0). Ad esempio, questo post descrive la generazione del seguente schema utilizzando googleVis: enter image description here

5

un'occhiata a //sankeybuilder.com in quanto offre una soluzione di pronto ad andare dove è possibile caricare i dati e le variazioni nel corso del tempo di riproduzione. La transizione funziona bene (simile alla demo di YouTube nella tua domanda). Se carichi la demo di SankeyTrend include molte fasce orarie (anni di dati). Una volta caricato (crea automaticamente i sankey), fai clic sul pulsante di riproduzione nell'angolo in alto a destra della pagina per la riproduzione delle fasce orarie, puoi persino sospendere e riprendere il tempo. L'URL dimostrativo è qui: SankeyTrend Spero che questo aiuti la tua ricerca del perfetto diagramma di Sankey.

9

Il pacchetto di R fa anche questo (da ?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

1

Appena open source un pacchetto che utilizza un diagramma alluvionale per visualizzare le fasi del flusso di lavoro. Poiché la cronologia viene mantenuta quando viene utilizzata la forma alluvionale, non vi sono incroci nei bordi.

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

enter image description here