2015-01-12 1 views
0

d3.js 강제 지시문에서 d3.start()를 호출하면 특정 위치의 노드와 에지가있는 그래프가 생성됩니다. 그러나 같은 데이터로 다시 시작을 호출하면 노드의 위치가 이전과 다릅니다. 노드가 매번 동일한 위치에 배치되도록하는 방법이 있습니까?D3 Force Directed Graph는 매번 같은 위치에 노드를 생성합니다.

나는 절대적으로 첫 번째 노드 위치를 설정하고 그 다음에는 어쨌든 그 첫 번째 노드 위치에 상대적으로 위치 할 때마다? 감사합니다.

d3-force 그래프를 작성하기위한 내 코드는 상용구입니다.

그리고 내 내부 JSON 데이터의 내 컬렉션을 다음과 내가

setTimeout(function(){ 
    var n = node.size(); 
    node.forEach(function(d, i) { 
     d.x = d.y = width/n * i; 
    }); 
    console.log(node); 
    setTimeout(function(){ 
     force.start(); 
     for (var i = 0; i < n; ++i) force.tick(); 
     force.stop(); 
    },300); 
},100); 
노드 내가 노드 용으로 사용할 원 객체의 배열입니다 ...

는 또한 보이지 않는다 호출 노드와 링크 객체를 생성 노드가 처음으로 시작을 호출 할 때 대각선을 따라 초기화됩니다. 이견있는 사람? 감사!

답변

0

d3 문서에 따르면 대각선을 따라 노드를 정렬하면 대부분의 경우 반복 횟수가 가장 적은 노드의 위치가 강제로 조정됩니다.

나는이 방법을 사용하고 동일한 데이터 세트를 사용할 때마다 일관된 위치를 얻습니다.

반복 횟수는 그래프 크기와 복잡성에 따라 다릅니다. 초기 위치의 선택은 좋은 솔루션에서 그래프가 얼마나 빨리 수렴되는지에 큰 영향을 줄 수 있습니다. 예를 들어, 다음 노드는 대각선을 따라 배열되어

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

에서 : https://github.com/mbostock/d3/wiki/Force-Layout

이것은 당신의 노드의 위치를 ​​설정하면 중복 있음을 의미합니다. 위의 코드와 비슷한 작업을 수행 한 후 .start()을 호출하여 강제로 모든 직위를 정렬하도록 지시하십시오.

+0

안녕하세요, 나는이 코드를 내 코드에 추가하고 매번 다양한 결과를 산출합니다. 노드가 대각선을 따라 초기화되지 않는 것 같습니다. 그래서 여전히 혼란 스럽습니다. 위에서 추가 한 새로운 코드를 첨부했습니다. 감사! – user3014093

+0

이봐, 당신은 강제 행동을 초기화하고 노드와 링크를 먹이는 코드를 보여줄 수 있습니까? 나는 그 문제가 거기에 있을지도 모른다고 생각한다. –

+0

@ user3014093 내 대답을 승인 해 주셔서 감사합니다. 그러나 가능한 경우 무엇이 잘못되었는지보고 싶습니다. –

관련 문제