Domanda Diagrammi di Sankey in R?


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

ho trovato questo post del blog collegandosi a uno script R che produce un diagramma di Sankey, sfortunatamente è piuttosto grezzo e alquanto limitato (vedi sotto per codice di esempio e 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 che le percentuali in base alle dimensioni relative dei componenti del diagramma, come in questi esempi di diagrammi di Sankey.

ho pubblicato una domanda piuttosto simile sulla r-help list, ma dopo due settimane senza alcuna risposta sto tentando la fortuna qui su StackOverflow.

Grazie, Eric

PS. Sono a conoscenza di Trama Parallel Sets, 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")

Diagramma di Sankey prodotto con il codice sopra, Sankey Diagram produced with the code above


75
2018-04-01 21:17


origine


risposte:


Questa trama può essere creata attraverso il networkD3 pacchetto. Ti permette di creare diagrammi di Sankey interattivi. Qui puoi trovare un esempio. Ho anche aggiunto uno screenshot per avere un'idea di come sia.

enter image description here


52
2018-03-18 14:13



Se vuoi farlo con R, la tua migliore offerta sembra essere il suggerimento di @Roman - hackerare il SankeyR funzione. 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 modifica solo la riga 171 e 223 nella SankeyR funzione:

    #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 ciò di cui hai bisogno 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 ...


36
2018-04-04 13:54



Ho creato un pacchetto (riverplot) che ha una funzionalità leggermente diversa ma sovrapponibile rispetto alla funzione Sankey e può produrre grafici come questo:

enter image description here


36
2018-03-03 13:35



Inoltre rCharts, Sankey ora è possibile generare anche diagrammi in R con googleVis (versione> = 0.5.0). Ad esempio, questo inviare descrive la generazione del seguente diagramma usando googleVis: enter image description here


20
2017-11-04 00:40



R  il pacchetto farà 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


12
2018-04-25 12:30



plotly ha lo stesso potere di networkD3 pacchetto (esempio di link).

enter image description here


8
2017-07-28 03:15



A giudicare da queste definizioni questa funzione, come il Plot Parallel Sets, non ha la capacità di dividere e combinare i flussi (cioè attraverso più di una transizione).

Da I diagrammi di Sankey sono grafici ponderati diretti, un pacchetto come QGraph potrebbe essere utile

Il SankeyR la funzione fornisce etichette più chiare se si ordinano le perdite in ordine decrescente man mano che il testo viene posizionato più vicino alle punte delle frecce senza sovrapposizioni.


6
2018-04-03 23:16



dai un'occhiata a //sankeybuilder.com in quanto offre una soluzione pronta all'uso in cui è possibile caricare i dati e le variazioni di riproduzione nel tempo. 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 demo è qui: SankeyTrend Spero che questo aiuti la tua ricerca per il perfetto diagramma di Sankey.


5
2018-03-21 12:26



Basta aprire 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


1
2017-10-03 21:46