D3.js hierarchy 데이터 구조 및 사용법

hierarchy는 계층 데이터를 시각화하기 위한 라이브러리로 다음과 같이 5가지 그리기를 제공한다.

  • Cluster
  • Tree (준비중…)
  • Treemap (준비중…)
  • Partition (준비중…)
  • Pack

각 드로잉은 각 페이지를 참조하면 되고, 여기에서는 모두에 공통되는 데이터 구조에 대해 설명한다.

데이터 구조

먼저 하나의 노드에 대한 다음 형식으로 데이터를 준비한다.

{
  "name": "A",
  "children": [{ },{ }]
}

자식, 손자 노드를 추가하고 싶은 경우에는 children 배열에 같은 포맷의 객체를 추가해 간다. 마지막 노드의 경우에는 “children"을 생략한다.

예를 들어, 아래 구조의 트리를 그리려고 한다면,

아래와 같은 데이터 구조를 준비해야 한다.

var data =
{
    "name": "A",
    "children": [
      { "name": "B" },
      {
        "name": "C",
        "children": [{ "name": "D" }, { "name": "E" }, { "name": "F" }]
      },
      { "name": "G" },
      {
        "name": "H",
        "children": [{ "name": "I" }, { "name": "J" }]
      },
      { "name": "K" }
    ]
  };

데이터 구조 변환

위에서 준비한 데이터로 그리기 위해서는 데이터 구조를 두번 변환해야 한다.

준비된 계층 데이터 → hierarchy용 데이터 구조 → 그리기 종류별 데이터 구조

그러려면, 두번 모두 함수를 한번만 호출하면 된다. 같은 데이터 구조로 다른 드로잉으로 변환할 수 있는 구조로 되어 있다.

첫째, hierarchy를 위한 데이터 구조로의 변환은 아래 함수를 사용한다.

var root = d3.hierarchy(data);

루트는 준비된 데이터와 동일한 구조의 객체를 작성하고, 다음 변수를 추가한다.

객체 설명
node.data 노드와 연관된 원본 데이터에 대한 참조.
node.depth 선두를 0으로 한 깊이 방향의 위치. 정수.
node.height 말단에서 자 노드까지의 최대 위치. 마지막은 0. 정수.
node.parent 상위 노드에 대한 참조. 앞부분인 경우는 null.
node.children 자식 노드에 대한 참조. 마지막 부분인 경우는 정의 않함.

루트 변수 자체에는 선앞부분인 node에 대응하는 객체가 포함되어 있어 이전과 같은 위에 그림과 같은 구조라면, 아래같이 하면 노드 “B"의 객체에 접근할 수 있다.

root.children[0]

hierarchy 노드의 함수 목록

노드에는 다음과 같은 함수가 준비되어 있다.

함수 설명
node.ancestors() 자신의 노드를 포함하여 부모를 따르는 루트의 배열을 반환한다.
node.descendants() 자신의 노드를 포함한 자식, 손자, 손녀를 추적하는 배열을 반환한다.
node.leaves() 자신의 노드에 관련하는, 말단의 (자식 요소를 가지지 않는) 노드 배열을 반환한다.
node.path(target) 노드로부터 지정된 타겟 노드에의 최단 패스를 노드를 포함한 배열로 반환한다.
node.links() 노드간을 연결하는 링크 배열을 다음 형식으로 반환한다.
[{"source": 상위 노드, "target": 자식 노드}, ...]
node.sum() 자손 노드에 설정된 값의 합계 값을 계산한다.
function(d) { return d.value; }와 같이 인수에 함수를 설정한다
treemap, partition, pack에서 부모의 크기를 결정할 때 사용한다.
node.count() 이 노드 아래의 마지막 노드 수를 계산하여 node.value에 할당한다.
이 노드가 마자막인 경우에는 1을 반환한다.
node.sort(compare) 지정된 비교 함수 compare를 사용하여 형제 간을 정렬한다.
node.each(function) 지정한 노드의 자식, 손자 요소를 차례로 지정된 function으로 처리한다.
node.eachAfter(function) 지정한 노드의 자식, 손자 요소를 차례로 지정된 function으로 처리한다.
마지막이 우선적으로 호출된다. 자식 노드가 있는 노드는 항상 자식 노드 다음에 처리된다.
node.eachBefore(function) 지정한 노드의 자식, 손자 요소를 차례로 지정된 function으로 처리한다.
앞이 우선적으로 호출된다. 상위 노드가 있는 노드는 항상 상위 노드 다음에 처리된다.
node.copy() 지정된 노드로부터 시작되는 서브 트리의 깊은 복사를 반환한다. 복사된 트리의 첫 번째 요소의 부모는 null이다.



최종 수정 : 2024-01-18