2017-05-18 2 views
-4

enter image description hered3.js 가족 차트

^이 출생/사망/이름 데이터를 적용하려면 차트를 향상 시작하는 목표입니다 -하지만 그것을 가지고 더 유연성을 가지고가. 또한 데이터 소스를 정리합니다.

enter image description here

은 내가 d3.js 가족 차트를 개발하기 위해 노력하고 있습니다. 이 차트의 데이터 구조를 향상시키고 라벨에 공간/디자인을 추가하는 방법에 관심이 있습니다. 부품에 동적 길이를 부여하여 필요한 공간을 확보하는 방법이 있다면 관심이 있습니다.

나는이 jsfiddle http://jsfiddle.net/857edt69/30/

// Create the node rectangles. 
    nodes.append("circle") 
    .attr("class", "node") 
    .attr("r", function(d, i) { 
     return smallRadius; 
    }) 
    .style("fill", function(d, i) { 

     var userName = d.userName; 
     if (userName) { 
     userName.toLowerCase() 
     } 

     var id = d.id + "-" + userName; //small circles 
     return "url(#" + id + ")"; 
    }) 
    .attr("id", function(d) { 
     return d.id; 
    }) 
    .attr("display", function(d) { 
     if (d.hidden) { 
     return "none" 
     } else { 
     return "" 
     }; 
    }) 
    .attr("cx", function(d) { 
     return d.x - (smallRadius/2) + 10; 
    }) 
    .attr("cy", function(d) { 
     return d.y - (smallRadius/2) + 10; 
    }); 


    // Create the node text label. 
    nodes.append("text") 
    .text(function(d) { 
     //return d.name; 
     return d.userName; 
    }) 
    .attr("x", function(d) { 
     return d.x - (smallRadius/2) + 10; 
    }) 
    .attr("y", function(d) { 
     return d.y - (smallRadius/2) - 20; 
    }); 
+0

더 오래된 간단한 해결책 이 모두 당신이 그래프와 같은 및 graphlib과 호환 데이터 모델을 가지고 가정,하지만 당신은 쉽게 다시 graphlib에 데이터 구조를 변환 할 수 있습니다 - http://stackoverflow.com/questions/31245751/d3-js-family-tree-in-d3-js –

답변

2

에게 "스기야마"계층 그래프 레이아웃으로 알려져 있습니다 하나는 족보의 유형에 사용하는 것이 정규 알고리즘을했습니다. (강제 레이아웃과 비슷한 것을 얻을 수도 있지만 제약 조건을 올바르게 설정하는 것은 매우 지루합니다)

스기야마는 너비와 오프셋을 측정하기 위해 트리를 가로 질러 트리를 다시 정렬하고 최소 라인을 배치해야합니다 크로스 오버. 그것은 가장 초보자 친화적 인 알고리즘 아니지만, 내가 찾은 가장 쉬운 도입은 개인적 스기야마 계산을위한 높은 광택 dagre lib에 좋은 성공 했어 here

이며, dagre-d3의 D3의 적응. (here's an example for cytoscape data structures)

+0

분기 길이를 수정하기 시작한 코드를 수정할 수있는 방법이 있습니까? –

+0

코드를 "레이아웃"또는 "사전 레이아웃"으로 분해 한 다음 "그리기"단계로 나눠야합니다. 레이아웃 부분에서 루트에서 시작하여 각각의 심층 레이어에 몇 개의 자식 또는 "노드"가 있는지 결정한 다음 다음 레이어로 내려 가서 손자를 아래로 내려다 볼 수 있습니다. 컴팩트 트리를 그리는 경우 각 레이어는 노드를 균일하게 중앙에 배치해야합니다. 그러나 넓은 나무가 필요하면 오프셋을 계산하기 위해 그래프를 두 번 통과해야합니다. "드로잉"단계에 이르면 각 노드의 폭, 높이, x, y를 그릴 때이를 기록하고이를 다시 사용할 수 있습니다. – BenG

+0

기본 버전으로 시작할 수 있습니까? 자리 표시 자 원 또는 텍스트 만 그립니다. 이 레이아웃 상태가 무엇인지 보여주기 위해 간단한 트리부터 시작해 보겠습니다. 텍스트 폭을 식별하고 레이블에 대해 여기 또는 저쪽에 약간의 너비가있는 줄만 보았습니다 –