2014-10-29 8 views
5

Ich habe eine d3 Force-Layout-Grafik viz funktioniert ziemlich schön, aber es wird oft früh 'stecken'. Zum Beispiel wackeln Knoten in Richtung einer guten Platzierung, und wenn sie "stoßen" (injizieren ein bisschen Zufälligkeit zu ihrer Platzierung und start() wieder, sie endlich dort ankommen. Das Problem wird auch schlimmer, wenn ich friction verringern, weil die Benutzer denken, dass es ist auch frenetisch.modifizieren d3 die Kraft-Layout "annealling" Zeitplan

ich sehe Erwähnung von ‚annealling‘ (ala simuliert annealling) in der force.js source code, und der exponierte alpha Parameter ist ein wichtiger Bestandteil. ich frage mich, ob jemand hat herausgefunden, wie die allgemeine annealling Zeitplan verwalten direkt (ohne! Patchen force.js!)?

+0

Nicht sicher, ob ich Ihre Frage verstehe. Wenn Sie etwas ändern, das nicht verfügbar ist, müssen Sie den Quellcode ändern. –

+0

Wenn ein Diagramm zu groß oder haarig ist, um es in einer Aufnahme schön zu gestalten, könnte ich versuchen, die Knoten im Laufe der Zeit hinzuzufügen und das Layout bei jedem Hinzufügen neu zu starten. Es ist sogar noch besser, wenn es eine Logik wie eine Zeit- oder Typkomponente für die Knoten gibt. – Andrew

+0

@Lars, sorry ich war unklar. 'alpha' scheint der einzige exponierte Parameter zu sein, aber ich kann nur so viel damit machen. Ich frage mich, ob es eine Möglichkeit gibt, allgemeinere Abkühlungszeiten auf d3-ic-Basis zu erreichen, oder brauche ich einen lokalen Patch? @Andrew, ich möchte, dass dies ein Graph-Tool ist, das vom Benutzer über ein festes Diagramm geändert wird. – rikb

Antwort

0

Der Kern der Antwort ist @ meetamits Kommentar (um den Zerfall von Alpha zu beschleunigen). Sie können Hören Sie auch auf, das Layout aufzurufen, wenn es unter einem Schwellenwert liegt, und Sie können auch mit dem "Jitter" umgehen, indem Sie Übergänge zu Ihren Knoten-/Link-Bewegungen hinzufügen.

animationStep = 200; 
force.on('tick', function() { 
    node.transition().ease('linear').duration(animationStep) 
     .attr('transform', function(d) { 
      //your node transitions here 
     }); 
    var alpha = force.alpha(); 
    force.stop(); 
    setTimeout(function() { 
     if (!alpha > 0.001) { 
     force.alpha(alpha * 0.9); 
     } 
    }, animationStep); 
    }; 
    force.on('tick', tick); 
+0

Ich denke, das OP suchte nach einem Weg zu _decelerate_ in der Tat, aber, auf jeden Fall, ist der einfachste Weg, Alpha zu verwalten, um 'force.alpha (force.alpha () /0.99*myDecay) 'am Ende des' tick' Callbacks. Dies kehrt den durch das Layout angewendeten Verfall (der 0,99 ist) um und ersetzt ihn durch Ihre eigene Rate des geometrischen Verfalls. –

+0

Ah - danke, ich habe das falsch gelesen. –