2017-09-22 2 views
1

anpassen das sankeyNetwork von networkD3-Paket ist ziemlich clever die meiste Zeit bei der Positionierung der Knoten, aber es gibt Gelegenheiten, die ich den Knoten an einer anderen Stelle horizontal platzieren möchte. Es gibt auch andere Gelegenheit, dass ich den Startpunkt einer Kante vertikal verschieben möchte. Nehmen Sie die folgende Screenshot zum Beispiel:wie node & edge position in sankeyNetwork mit R

enter image description here

Für den Knoten, ich die B3 in der 2. Spalte von rechts in die 4. Spalte von links verschieben möge. Ähnlich möchte ich die B4 von der 2. Spalte von rechts nach der 5. Spalte von links bewegen.

Für die Kante möchte ich den Anfangspunkt der allerersten Kante (B1-> B11) zum unteren Ende von B1 verschieben.

Meine Vermutung ist, dass ich einige Änderungen am Quellcode vornehmen und die spezifischen Positionen manuell eingeben muss. Ich sah diesen Beitrag für js How to tune horizontal node position in d3 sankeyjs, aber ich bin mir nicht sicher, was ich in R tun soll, neben habe ich keinen Beitrag über die Änderung der Kantenpositionen zu sprechen.

Hier ist die replizierbar Daten und 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" 

    ) 

Danke im Voraus!

+0

'd3-sankey' des justieren Haupt Der Zweck der Existenz besteht darin, die Knotenposition algorithmisch zu optimieren, wobei die Verbindungslänge als primäres Ziel minimiert wird, so dass eine manuelle Optimierung der horizontalen Knotenposition nicht grundlegend unterstützt oder erleichtert wird. –

Antwort

0
  1. Sie können manuell die vertikale Position von Knoten anpassen, wenn Sie also die oben rechts B11 Knoten nach unten ziehen, die Verbindungslinie von der oberen linken Ecke B1 Knoten wird an der Unterseite des B1 automatisch einstellen Knoten.

  2. Um das zu erreichen, was in the answer to How to tune horizontal node position in d3 sankey.js? beschrieben ist, alles, was Sie tun müssen, ist die sinksRight = FALSE Parameter zu Ihrem sankeyNetwork() Anruf hinzufügen, obwohl ich glaube nicht, dass das erreicht, was Sie eigentlich wollen.

  3. Eine manuelle Anpassung der horizontalen Position von Knoten ist derzeit nicht möglich. sie einzeln in Code einstellen würde sehr mühsam sein, aber Sie könnten zusätzliche JS hinzufügen auszuführen, nachdem sie einzeln geladen, um die Positionierung von bestimmten Knoten mit etwas gewundenen JS Code wie d3.selectAll(".node").filter(function(d) { return d.name == "B3" }).attr("transform", function(d) { return "translate(" + (d.x - 300) + "," + d.y + ")"; })