2016-07-18 14 views
8

일부 d3 코드를 v3에서 버전 4로 업데이트하려고합니다. JSON 데이터를 사용하여 트리 다이어그램을 만들었습니다. d3.v4 예는 stratify() https://bl.ocks.org/mbostock/9d0899acb5d3b8d839d9d613a9e1fe04을 사용하여 표 형식의 데이터 (예 : flare.csv)를 계층 적 데이터로 변환하는 방법을 보여줍니다. 그러나 내 데이터는 JSON이므로 stratify()가 필요하거나 필요하지 않습니다. 이 코드를 실행d3.v4에서 JSON 데이터를 사용하여 트리 레이아웃을 만드는 방법 - stratify()없이

undefined is not a function (evaluating 'root.eachBefore')

: :이 오류가

var height = 200; 
var width = 500; 

var xNudge = 50; 
var yNudge = 20; 

var tree = d3.tree() 
    .size([height, width]); 

var svg = d3.select("body").append("svg").attr("width","100%").attr("height","100%"); 
var chartGroup = svg.append("g").attr("transform","translate(50,200) rotate(-90)"); 

d3.json("treeData.json", function(treeData) { 


    var root = treeData[0]; 
    tree(root); 
    console.log('hello');//doesn't log to console, i.e. error occurs beforehand 
} 

treeData.json :

[ 
    { 
    "name": "Top Level", 
    "parent": "null", 
    "children": [ 
    { 
     "name": "Level 2: A", 
     "parent": "Top Level", 
     "children": [ 
     { 
      "name": "Son of A", 
      "parent": "Level 2: A" 
     }, 
     { 
      "name": "Daughter of A", 
      "parent": "Level 2: A" 
     } 
     ] 
    }, 
    { 
     "name": "Level 2: B", 
     "parent": "Top Level" 
    } 
    ] 
} 
] 

는 계층화 사용하지 않고 d3.v4 트리 레이아웃을 만들 실제로 가능 즉, 이미 계층적인 데이터를 사용하고 있습니까? 누구든지 예제를 알고 있거나 내 코드에서 문제를 발견 할 수 있습니까? 덕분에

답변

5

tree()를 준비하려면 데이터에 d3.hierarchy를 실행해야합니다. 계층화는 아마도 계층 구조를 실행하거나 어떤 방식으로 유사합니다. 따라서 적절한 행을 다음으로 변경하십시오. var root = d3.hierarchy (treeData [0]);

+0

) (d3.hierarchy에 의해 반환되는 객체가 포함되어 있지 않습니다 "name"및 "id"속성을 더 이상 사용하지 않습니다. – jackOfAll

6

나는 동일한 문제가있었습니다. Emma's response는 본질적으로 대답했지만, 제대로 작동하려면 여전히 문제가있었습니다. 누구든지 도움이 될 수 있도록 좀 더 자세히 설명해 드리겠습니다. 위의 예제 데이터를 기반으로 한 기능적 결과 here을 보여주는 블록을 만들었습니다. Emma's responsethis 블록입니다.

  • 당신은 JSON 객체가 배열 괄호에 싸여있다 :

    대답은 세 부분입니다. 해당 괄호를 제거하거나 (내가 요점에서했던 것처럼) [0]을 treeData의 끝 부분에 둡니다 (위의 링크에서 Emma가 수행 한 것처럼). 그 1 요소 배열에서 Object를 가져옵니다.

  • JSON 개체를 d3.hierarchy으로 전달합니다 (Emma 설명).
  • 마지막으로 API는 노드 이름 지정을 위해 변경된 것으로 보입니다. 노드는 위에서 링크 된 블록에서도 처리됩니다. 편의를 위해

, 여기에 the block I made에서 코드입니다 :

var svg = d3.select("svg"), 
    width = +svg.attr("width"), 
    height = +svg.attr("height"), 
    g = svg.append("g").attr("transform", "translate(60,0)"); 

var tree = d3.cluster() 
    .size([height, width - 160]); 

var stratify = d3.stratify() 
    .parentId(function(d) { return d.id.substring(0, d.id.lastIndexOf(".")); }); 

d3.json("treeData.json", function(error, treeData) { 
    if (error) throw error; 

    var root = d3.hierarchy(treeData); 
    tree(root); 

    var link = g.selectAll(".link") 
     .data(root.descendants().slice(1)) 
    .enter().append("path") 
     .attr("class", "link") 
     .attr("d", function(d) { 
     return "M" + d.y + "," + d.x 
      + "C" + (d.parent.y + 100) + "," + d.x 
      + " " + (d.parent.y + 100) + "," + d.parent.x 
      + " " + d.parent.y + "," + d.parent.x; 
     }); 

    var node = g.selectAll(".node") 
     .data(root.descendants()) 
    .enter().append("g") 
     .attr("class", function(d) { return "node" + (d.children ? " node--internal" : " node--leaf"); }) 
     .attr("transform", function(d) { 
     return "translate(" + d.y + "," + d.x + ")"; 
     }) 

    node.append("circle") 
     .attr("r", 2.5); 

    node.append("text") 
     .attr("dy", 3) 
     .attr("x", function(d) { return d.children ? -8 : 8; }) 
     .style("text-anchor", function(d) { return d.children ? "end" : "start"; }) 
     .text(function(d) { 
     return d.data.name; 
     }); 
}); 

여기 배열에서 제거 treeData.json의 :

{ 
    "name": "Top Level", 
    "parent": "null", 
    "children": [ 
    { 
     "name": "Level 2: A", 
     "parent": "Top Level", 
     "children": [ 
     { 
      "name": "Son of A", 
      "parent": "Level 2: A" 
     }, 
     { 
      "name": "Daughter of A", 
      "parent": "Level 2: A" 
     } 
     ] 
    }, 
    { 
     "name": "Level 2: B", 
     "parent": "Top Level" 
    } 
    ] 
} 
+0

d3.hierarchy()에 의해 반환 된 객체에는 "name"및 "id"속성이 더 이상 포함되지 않습니다. – jackOfAll

+0

함수 콜백의 d는 이것을 시도 할 때 정의되지 않았습니다. d가 무엇입니까? –