D3 노트 10: 파워 가이드
7367 단어 D3 노트
1. 파워 가이드 그림
먼저 파워 가이드 맵 (Force - Directed Graph) 의 정 의 를 알 아 보 겠 습 니 다.우선 그림 을 그 리 는 알고리즘 입 니 다.2 차원 또는 3 차원 공간 에 노드 를 설정 합 니 다.노드 간 에 선 으로 연결 하 는 것 을 연결선 이 라 고 한다.각 연결선 의 길 이 는 거의 같 고 가능 한 한 교차 하지 않 는 다.노드 와 연결선 은 모두 힘 의 작용 을 가 했다.힘 의 크기 는 노드 와 연결선 의 상대 적 위치 에 따라 계산 된다.힘 의 작용 에 따라 노드 와 연결선 의 운동 궤적 을 계산 하고 그들의 에 너 지 를 계속 낮 추 며 최종 적 으로 에너지 가 매우 낮은 안정 상태 에 이 르 렀 다.
기능 적 으로 파워 가이드 그림 은 노드 간 의 다 대 다 관 계 를 나 타 낼 수 있다.
2. 데이터 와 레이아웃
파워 가이드 그림 의 원생 데 이 터 는 노드 (nodes) 와 연결선 (edges) 의 두 배열 로 구성 된다.nodes 는 노드 의 필요 한 정 보 를 대표 하고 edges 는 노드 간 의 연결 여 부 를 나타 낸다.다음 실례 데 이 터 를 보십시오.
var nodes = [{ name: " " }, { name: " " }, { name: " " }, { name: " " }];
var edges = [{ source: 0, target: 1 }, { source: 0, target: 2 }, { source: 0, target: 3 }];
주의: * * edges 에는 각 노드 간 의 연결 관계 의 대상 이 포함 되 어 있 습 니 다. *source 는 연결선 의 기원 을 나타 내 고 target 은 연결선 의 끝 을 나타 내 며 그들의 값 은 * nodes 에서 대응 하 는 노드 대상 의 아래 표 시 를 나타 낸다.
그러나 이런 데 이 터 는 그림 을 그 리 는 데 사용 할 수 없다. 왜냐하면 현재 의 데 이 터 는 노드 와 연 결 된 좌표 가 없 기 때문에 우 리 는 위 치 를 정할 수 있다.그래서 우 리 는 자 연 스 럽 게 레이아웃 함수 가 생각 났 다.제 작 력 가이드 맵 의 레이아웃 함 수 는:
d3.layout.force()
입 니 다.힘 가이드 그림 에 대해 우 리 는 보통 이렇게 배치 합 니 다.var force = d3.layout.force() //
.nodes(nodes) //
.links(edges) //
.size([ width, height ]) //
.linkDistance(150) //
.charge([-400]); //
ok, 이제 nodes 와 edges 가 각각 어떻게 변 했 는 지 살 펴 보 자.
이것 은 nodes 레이아웃 후의 변화 입 니 다. edges 레이아웃 후의 변 화 를 다시 보 겠 습 니 다.
자세히 보면 레이아웃 후의 노드 대상 과 연결선 대상 이 각 대상 에 다음 과 같은 속성 을 추가 한 것 을 발견 할 수 있 습 니 다.
레이아웃 후의 nodes 와 edges 데이터 가 있 으 면 파워 가이드 그림 을 그 릴 수 있 습 니 다.그 리 는 힘 가이드 그림 은 각각 세 가지 도형 요 소 를 그 려 야 한다.
다음은 예제 코드 입 니 다.
//
var svg_edges = svg.selectAll('line').data(edges).enter().append('line');
var color = d3.scale.category20();
//
var svg_nodes = svg.selectAll('circle').data(nodes).enter().append('circle')
.attr('r', 10) // 10
.style('fill', function ( d, i ) { //
return color(i);
})
.call(force.drag); //
var svg_texts = svg.selectAll('text').data(nodes).enter().append('text')
.attr('dx', 12) // text circle
.attr('dy', 8)
.text(function(d) {
return d.name;
});
호출
call( force.drag )
후 노드 가 끌 릴 수 있 습 니 다.force.drag()
은 하나의 함수 로 이 를 call()
의 매개 변수 로 하여 현재 선택 한 요 소 를 force.drag()
함수 에 전달 하 는 것 과 같다.4. 노드 드래그 가능
바로 노드 가 드래그 할 수 있 기 때문에 파워 가이드 그림 은 항상 끊임없이 운동 하기 때문에 반드시 노드 와 연결선 의 위 치 를 계속 업데이트 해 야 한다.파워 가이드 맵 레이아웃 force 에 감청 이벤트 tick 가 있 습 니 다.매 순간 진행 할 때마다 감청 함 수 를 호출 한 다 는 뜻 이다.다음은 예제 코드 입 니 다.
force.on("tick", function(){ //
//
svg_edges.attr("x1",function(d){ return d.source.x; })
.attr("y1",function(d){ return d.source.y; })
.attr("x2",function(d){ return d.target.x; })
.attr("y2",function(d){ return d.target.y; });
//
svg_nodes.attr("cx",function(d){ return d.x; })
.attr("cy",function(d){ return d.y; });
//
svg_texts.attr("x", function(d){ return d.x; })
.attr("y", function(d){ return d.y; });
});
이런 힘 안내 도 는 기본적으로 완 성 된 셈 이다.