web-dev-qa-db-fra.com

Diagrammes de Sankey dans R?

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

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

Est-ce que quelqu'un connaît d'autres scripts - ou peut-être même un package - qui sont plus développés? Mon objectif final est de visualiser à la fois le flux de données et les pourcentages par la taille relative des composants du diagramme, comme dans ces exemples de diagrammes de Sankey .

J'ai posté ne question quelque peu similaire sur la liste r-help , mais après deux semaines sans aucune réponse, je tente ma chance ici sur stackoverflow.

Merci Eric

PS. Je connais le Parallel Sets Plot , mais ce n'est pas ce que je recherche.

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

Diagramme de Sankey produit avec le code ci-dessus, Sankey Diagram produced with the code above

86
Eric Fail

Ce tracé peut être créé via le networkD3 paquet. Il vous permet de créer des diagrammes sankey interactifs. Ici vous pouvez trouver un exemple . J'ai également ajouté une capture d'écran pour que vous ayez une idée de son apparence.

# Load package
library(networkD3)

# Load energy projection data
# Load energy projection data
URL <- paste0(
        "https://cdn.rawgit.com/christophergandrud/networkD3/",
        "master/JSONdata/energy.json")
Energy <- jsonlite::fromJSON(URL)
# Plot
sankeyNetwork(Links = Energy$links, Nodes = Energy$nodes, Source = "source",
             Target = "target", Value = "value", NodeID = "name",
             units = "TWh", fontSize = 12, nodeWidth = 30)

enter image description here

61
JT85

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

enter image description here

41
January

Si vous voulez le faire avec R, votre meilleure offre semble être la suggestion @Roman - piratez la fonction SankeyR . Par exemple - ci-dessous est ma solution très rapide - il suffit d'orienter les étiquettes verticalement, de les décaler légèrement et de diminuer la police pour les références d'entrée pour la rendre un peu meilleure. Cette modification ne modifie que les lignes 171 et 223 dans 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 perdues afin 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 ...

39
Geek On Acid

En plus de rCharts , Les diagrammes de Sankey peuvent maintenant être également générés dans R avec ( googleVis (version> = 0.5.0). Par exemple, ce post décrit la génération du diagramme suivant à l'aide de googleVis: enter image description here

22
leo9r

R's alluvial package fera également cela (à 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

15
geotheory

complot a la même puissance que networkD3 package ( exemple de lien ).

enter image description here

10
cuttlefish44

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

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

La fonction SankeyR fournit des étiquettes plus claires si vous triez les pertes par ordre décroissant lorsque le texte est placé plus près des têtes de flèche sans se chevaucher.

6
RobinGower

jetez un oeil à // sankeybuilder.com car il offre une solution prête à l'emploi où vous pouvez télécharger vos données et les variations de lecture au fil du temps. La transition fonctionne bien (similaire à la démo YouTube dans votre question). Si vous chargez la démo SankeyTrend, elle comprend de nombreux créneaux horaires (années de données). Une fois chargé (construit automatiquement les sankeys), cliquez sur le bouton de lecture dans le coin supérieur droit de la page pour la lecture des plages horaires, vous pouvez même faire une pause et reprendre le temps. L'URL de démonstration est ici: SankeyTrend J'espère que cela vous aidera dans votre quête du diagramme Sankey parfait.

5
Rob

Pour être complet, il y a aussi le paquet ggalluvial qui est un ggplot2 extension pour les diagrammes alluviaux/Sankey.

Voici un exemple tiré de la documentation du package

# devtools::install_github("corybrunson/ggalluvial", ref = "optimization")
library(ggalluvial)

titanic_wide <- data.frame(Titanic)
ggplot(data = titanic_wide,
       aes(axis1 = Class, axis2 = Sex, axis3 = Age,
           y = Freq)) +
  scale_x_discrete(limits = c("Class", "Sex", "Age"), expand = c(.1, .05)) +
  xlab("Demographic") +
  geom_alluvium(aes(fill = Survived)) +
  geom_stratum() + geom_text(stat = "stratum", label.strata = TRUE) +
  theme_minimal() +
  ggtitle("passengers on the maiden voyage of the Titanic",
          "stratified by demographics and survival") +
  theme(legend.position = 'bottom')

ggplot(titanic_wide,
       aes(y = Freq,
           axis1 = Survived, axis2 = Sex, axis3 = Class)) +
  geom_alluvium(aes(fill = Class),
                width = 0, knot.pos = 0, reverse = FALSE) +
  guides(fill = FALSE) +
  geom_stratum(width = 1/8, reverse = FALSE) +
  geom_text(stat = "stratum", label.strata = TRUE, reverse = FALSE) +
  scale_x_continuous(expand = c(0, 0), 
                     breaks = 1:3, labels = c("Survived", "Sex", "Class")) +
  scale_y_discrete(expand = c(0, 0)) +
  coord_flip() +
  ggtitle("Titanic survival by class and sex")

Créé le 2018-11-13 par le package reprex (v0.2.1.9000)

4
Tung

Ouvrez simplement un package qui utilise un diagramme alluvial pour visualiser les étapes du flux de travail. Étant donné que l'historique est conservé lorsque la forme alluviale est utilisée, il n'y a pas de croisements sur les bords.

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

enter image description here

1
Clayton Stanley