2017-09-22 3 views
1

le paquet sankeyNetwork de networkD3 est assez astucieux la plupart du temps pour positionner les noeuds, mais il y a des occasions où je veux placer le noeud horizontalement. Il y a aussi d'autres occasions où je veux déplacer verticalement le point de départ d'une arête. Prenez la capture d'écran ci-dessous par exemple:comment personnaliser le noeud et la position de bord dans sankeyNetwork en utilisant R

enter image description here

Pour le nœud, je veux déplacer le B3 sur la 2e colonne de droite à la 4ème colonne de gauche. De même, je veux déplacer le B4 de la 2ème colonne de la droite à la 5ème colonne de la gauche.

Pour le bord, je veux déplacer le point de départ du premier bord (B1-> B11) à l'extrémité inférieure de B1. Je suppose que j'ai besoin d'apporter quelques modifications au code source et de mettre manuellement dans les positions spécifiques. J'ai vu cet article pour js How to tune horizontal node position in d3 sankeyjs, mais je ne suis pas sûr de savoir quoi faire en R, à part je n'ai trouvé aucun post parlant de changer les positions de bord.

Voici les données réplicables et code:

load(url("https://github.com/bossaround/question/raw/master/sankeyexample.RData")) 
     # nn is the node, ee is the edge, now create the link (ll)  
     ll <- inner_join(ee, nn, by = c("N1"="name")) %>% 
     rename(source_ID = ID) %>% 
     inner_join(nn, by = c("N2"="name")) %>% 
     rename(target_ID = ID) 

     # Create Sankey Plot 
     sankeyNetwork(
     Links = ll, 
     Nodes = nn, 
     Source = "source_ID", 
     Target = "target_ID", 
     Value = "Value", 
     NodeID = "newname", 
     fontSize = 12, 
     nodeWidth = 40, 
     nodePadding = 20, 
     NodeGroup = "newname" 

    ) 

Merci à l'avance!

+0

de 'd3-sankey' principale le but de l'existence est d'optimiser de façon algorithmique la position du nœud, en minimisant la longueur du lien comme objectif principal, de sorte que le réglage manuel de la position du nœud horizontal n'est pas quelque chose qui est fondamentalement supporté ou facilité. –

Répondre

0
  1. Vous pouvez régler manuellement la position verticale des noeuds, donc si vous faites glisser le nœud B11 en haut à droite vers le bas, la ligne de liaison à partir du noeud B1 en haut à gauche se règle automatiquement sur le fond de cette B1 nœud.

  2. Pour ce qui est décrit dans the answer to How to tune horizontal node position in d3 sankey.js?, tout ce que vous avez à faire est d'ajouter le paramètre sinksRight = FALSE à votre appel sankeyNetwork(), bien que je ne pense pas que ce que vous voulez réalise effectivement.

  3. Il est actuellement impossible de régler manuellement la position horizontale des nœuds. les ajuster individuellement dans le code serait très fastidieux, mais vous pouvez ajouter JS supplémentaires pour exécuter après charge d'ajuster individuellement le positionnement des nœuds spécifiques avec un code JS alambiqué comme d3.selectAll(".node").filter(function(d) { return d.name == "B3" }).attr("transform", function(d) { return "translate(" + (d.x - 300) + "," + d.y + ")"; })