2014-10-09 7 views
8

unten ist ein normales Beispiel der tick-Funktion:Was ist der `e` Parameter, der an die d3.js Force Tick Callback Funktion übergeben wird?

function tick(e) { 
    nodes 
     .each(cluster(10 * e.alpha * e.alpha)); 
} 

wer kann mir die Definition von "e" sagen? Welche Eigenschaften hat es? Ich kann keine Beschreibung von "e" finden, und was ist die Bedeutung von e.alpha. Ja, ich habe Google verwendet, aber ohne Ergebnisse.


Vielen Dank für die Hilfe, die Sie unten gegeben haben.

Ich Kopieren einige Code, der es ist nur der Fall, dass Sie erraten

var force = d3.layout.force() 
     .nodes(nodes) 
     .size([width, height]) 
     .charge(-70) 
     .gravity(0.1) 
     .on("tick", tick) 
     .start(); 

so verwenden. Ich bin neu zu d3, ein Skim of force.layout API gab mir keine Ahnung. Danke für deine wertvolle Zeit!

+1

Suche nach 'e.alpha' in [diesem Beitrag] (http://flowingdata.com/2012/08/02/how-to-make-an-interactive-network- Visualisierung /). – FernOfTheAndes

+0

Bitte geben Sie mehr Kontext darüber, wo Sie diese Funktion gefunden haben. Das Präsentieren einer Funktion allein sagt nichts über die Art des Parameters aus, der an sie übergeben wird. Ich habe eine vernünftige Schätzung in meiner Antwort gemacht, aber die Frage, wie sie ist, sollte geschlossen werden, weil sie nicht genügend Informationen enthält, um das Problem zu diagnostizieren. – AmeliaBR

Antwort

14

Ohne den vollen Rahmen Ihrer „normalen“ Funktion, das ist ein bisschen eine Vermutung, aber hier geht:

tick wird in vielen Zusammenhängen innerhalb d3 verwendet. Die Einfügung von alpha legt nahe, dass dies eine force layout tick function ist, die von dem Force-Layout-Objekt bei einem Tick-Ereignis aufgerufen wird, in welchem ​​Fall e das Tick-Ereignisobjekt wäre.

Es gibt nicht viel Dokumentation über das Tick-Ereignis, da die meisten Beispiele es nicht verwenden. Wenn Sie die source code überprüfen, werden Sie

// A rudimentary force layout using Gauss-Seidel. 
d3.layout.force = function() {      //line 11 
    var force = {}, 
     event = d3.dispatch("start", "tick", "end"); 
    /* ... */ 
    force.tick = function() {      //line 58 
     // simulated annealing, basically 
     if ((alpha *= .99) < .005) { 
      event.end({type: "end", alpha: alpha = 0}); 
      return true; 
     } 
     /* code to implement default force layout adjustments */ 
     event.tick({type: "tick", alpha: alpha}); //line 128 
    }; 
    /* ... */ 
    return d3.rebind(force, event, "on");   //line 305 
}; 

Mit anderen Worten sehen, ist die Zecke Ereignis eine von drei Arten von benutzerdefinierten Ereignisses innerhalb der d3-Quellcode erstellt unter Verwendung des d3.dispatch Prozess. Das Ereignis tick wird insbesondere am Ende der internen Tick-Funktion ausgelöst und enthält nur eine benutzerdefinierte Eigenschaft: den aktuellen Parameter alpha im Force-Layout. Damit diese Ereignisse tatsächlich irgendwohin gehen, ist die Methode on des Ereignisverteilerobjekts rebound im Force-Layout-Objekt aktiviert, sodass der Benutzer Listenerfunktionen für die benutzerdefinierten Ereignisse registrieren kann.

Wenn alles, was viel zu viel d3 Einbauten für Sie, nur auf diese Details konzentrieren:

  • e ist ein benutzerdefiniertes Ereignis Objekt in den Tick-Funktion übergeben jedes Mal, sie genannt wird
  • e.alpha ist der aktuelle Alpha-Wert des Force-Layouts, der standardmäßig bei 0,1 beginnt und bei jedem Tick reduziert wird (entsprechend dem Parameter friction), bis er unter 0,005 fällt und das Layout einfriert:

    Intern verwendet das Layout einen Kühlparameter alpha, der die Layout-Temperatur steuert: Wenn die physikalische Simulation auf ein stabiles Layout konvergiert, sinkt die Temperatur und die Knoten bewegen sich langsamer. Schließlich fällt alpha unter einen Schwellenwert und die Simulation stoppt vollständig, wodurch die CPU frei wird und ein Batterieverbrauch vermieden wird. (From the API wiki for force.start)

+0

Entschuldigung, aber ich muss Ihnen mit mehr als einem upvote danken. Gegenwärtig ist dies afaik, die einzige öffentliche Dokumentation dessen, was an eine parametrisierte "on" ("tick" -Funktion übergeben wird und was die "alpha" -Komponente bedeutet (anders als der d3-Quellcode). "E.alpha" wird in mehreren Beispielen (zB Google "d3 multiple force layouts") ohne Erklärung verwendet. Also ich wünschte, ich könnte mehr als eine Stimme zu dieser Antwort geben. (Nicht, dass Sie SO rep benötigen.) Leider diese Antwort kommt in Google-Suchen nicht so einfach vor. Aber es ist nicht schwer, in einer SO-Suche zu finden. – Mars

+1

Danke @Mars. Und du hast mich dazu gebracht, etwas zu tun, was ich im Oktober hätte tun sollen: Ich [aktualisierte das d3-API-Wiki] (https://github.com/mbstock/d3/wiki/Force-Layout#on) um diese Informationen einzubinden, damit sie in Zukunft leichter zu finden sind! – AmeliaBR

+0

Cool. (Ich finde deine Antwort hier immer noch sehr hilfreich Ich verstehe die ganze Dispatch-Sache noch nicht, es ist nützlich, eine Erklärung zu sehen, die explizit auf eine Definition von "tick" verweist, die ein a braucht Parameter.) – Mars