7

Byłem w stanie zbudować wykres ukierunkowany na siłę za pomocą układu sił. Większość funkcji działa świetnie, ale moim głównym problemem jest to, że po rozpoczęciu układu odskakuje on na całej stronie (na i poza granicę obszaru roboczego) przed ustaleniem położenia na obszarze roboczym.Jak kontrolować wpis odrzuceń wykresu ukierunkowanego na siłę w D3?

Próbowałem przy użyciu alfa ją kontrolować, ale nie wydaje się działać:

// Create a force layout and bind Nodes and Links 
    var force = d3.layout.force() 
     .charge(-1000) 
     .nodes(nodeSet) 
     .links(linkSet) 
     .size([width/8, height/10]) 
     .linkDistance(function(d) { if (width < height) { return width*1/3; } else { return height*1/3 } }) // Controls edge length 
     .on("tick", tick) 
     .alpha(-5) // <---------------- HERE 
     .start(); 

Czy ktoś wie, jak prawidłowo kontrolować wpisu Układ sił na swoje SVG płótnie?

Nie mam nic przeciwko, żeby wykres przenikał i powoli się uspokajał, ale szaleństwo odbicia całego wykresu wcale nie jest atrakcyjne.

BTW, przykład Force Directed Graph można znaleźć na stronie: http://bl.ocks.org/Guerino1/2879486enter link description here

dzięki za pomoc można zaoferować!

+0

Czy kiedykolwiek znalazłeś odpowiedź na to pytanie? Mam ten sam problem. – Braden

Odpowiedz

2

Myślałem również o tym problemie i to jest rozwiązanie, które wymyśliłem. Użyłem nodejs, aby uruchomić tryb force tick w trybie offline i zapisać dane wynikowych węzłów do pliku json. Użyłem tego jako nowego pliku json dla układu. Nie jestem pewien, czy działa lepiej, szczerze mówiąc. Chciałbym usłyszeć o rozwiązaniach, które znajdziesz.

5

Węzły są inicjalizowane z losową pozycją. Z dokumentacji: "Jeśli nie zainicjujesz pozycji ręcznie, układ sił zainicjuje je losowo, powodując nieco nieprzewidywalne zachowanie." Możesz go zobaczyć w kodzie źródłowym:

// initialize node position based on first neighbor 
function position(dimension, size) { 
    ... 
    return Math.random() * size; 

Znajdą się one wewnątrz płótna, ale mogą zostać wypchnięte na zewnątrz za pomocą siły. Masz wiele rozwiązań:

  1. Węzły mogą być ograniczony wewnątrz płótnie: http://bl.ocks.org/mbostock/1129492
  2. TRY więcej siły naładowania i krótsze linki lub większe tarcie, więc węzły będą miały tendencję do odbijają mniej
  3. można uruchomić symulacja bez animowanie węzły, pokazując tylko wynik końcowy http://bl.ocks.org/mbostock/1667139
  4. można zainicjować położenie węzłów https://github.com/mbostock/d3/wiki/Force-Layout#wiki-nodes (ale jeśli umieścić je wszystkie na środku, odpychanie będzie ogromny i wykres wybuchnie jeszcze):

.

var n = nodes.length; nodes.forEach(function(d, i) { 
    d.x = d.y = width/n * i; }); 
+0

Wszystkie te opcje wydają się bardzo niepewne i nie gwarantują działania, jeśli liczba łączy/relacji zmienia się z jednego renderowania na inny. Będę miał przypadki, w których wizualizacja ma zerowe powiązania i będą inne ekstremum z tysiącami łączy (wszystkie z jednego centralnego/ogniskowego węzła). Jakieś przemyślenia, w jaki sposób zapewnić stałą stabilizację wykresów dla każdego ekstremum i wszystkiego pomiędzy? Dzięki. –

Powiązane problemy