2013-05-15 8 views
14

Używam układu sił do reprezentowania skierowanej, nieważonej sieci. Moja inspiracja pochodzi z poniższym przykładzie: http://bl.ocks.org/mbostock/1153292Czy układ wymuszania d3.js zezwala na dynamiczny linkDistance?

enter image description here

Moim problemem jest to, że w moim przypadku nie wiele więcej linków między węzłami i mam wrażenie, że dając stałą linkDistance, która jest zawsze taka sama, to bardzo duże ograniczenie dla mojego układu.

Czy jest możliwe ustawienie dynamicznego linkDistance, tak, że link zwiększa się, jeśli jest użyteczne, aby zredukować przejście łączące wewnątrz wykresu?

Odpowiedz

14

Z the documentation:

force.linkDistance ([odległość])

Jeżeli odległość ta jest określona, ​​ustawia odstępowi między połączonych węzłów do określonej wartości. Jeśli odległość nie jest określona, ​​zwraca bieżący dystans łącza układu, który domyślnie wynosi 20. Jeśli odległość jest stałą, wszystkie łącza mają tę samą odległość. W przeciwnym razie, jeśli odległość jest funkcją, funkcja jest oceniana dla każdego linku (w kolejności), przekazując łącze i jego indeks, z tym kontekstem jako układem sił; wartość zwracana przez funkcję jest następnie używana do ustawienia odległości każdego łącza. Funkcja jest oceniana przy każdym uruchomieniu układu. Zazwyczaj odległość jest określona w pikselach; jednak jednostki są arbitralne w stosunku do rozmiaru układu.

Należy pamiętać, że odległość łącza jest nadal dostosowywana w trakcie działania układu. Możesz także znaleźć przydatne ustawienie linkStrength().

+0

To znaczy, że parametr linkDistance zmienia się podczas działania algorytmu. Nie wiedziałem tego. Czy łącznikStrength równy 1 oznacza, że ​​odległość między węzłami się nie zmieni? –

+0

Nie, układ sił zawsze dostosuje odległość (przynajmniej potencjalnie), aby spełnić pozostałe ograniczenia. –

+1

Więc jakie jest znaczenie linkStrenght? Nie mogę zrozumieć, co to jest "sztywność", także gdy zauważyłem, że niższy linkStrenght bardzo mi pomaga. –

6

Zaledwie dwa kroki:

Krok 1: Dodaj parametr w głównej json następująco:

{źródło: "Microsoft", cel: "Amazon", wpisz: "licencji", wartość: 60} , {źródło: "Microsoft", target: "HTC", wpisz: "licencjonowanie", wartość: 60}, {źródło: "Samsung", cel: "Apple", wpisz: "suit", wartość: 60} ,

Krok 2: Zaktualizuj metodę linkdistance, aby zaakceptować metodę.

.linkDistance(function(d) { return d.value; })