2016-07-18 32 views
8

我試圖從v3更新一些d3代碼到版本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

您需要對您的數據運行d3.hierarchy,以便爲tree()做好準備。 Stratify可能運行層次結構或在某種程度上類似。因此,將相應的行更改爲:var root = d3.hierarchy(treeData [0]);

+0

由d3.hierarchy()返回的對象不包含「name」和「id」屬性了。 – jackOfAll

6

我有同樣的問題。 Emma's response基本上回答了它,但我仍然無法正常工作。我會詳細說明一下,以防有人發現它有幫助。我創建了一個塊,顯示功能結果here,它基於上面的示例數據,Emma's responsethis塊。

答案是三個部分:

  • 你有你的JSON對象包裹在陣列支架。或者刪除這些括號(如我在要點中所做的那樣),或者將一個[0]放在treeData的末尾(如上面鏈接中的Emma所做的那樣),以便將該Object從該1元素數組中取出。
  • 將您的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是不確定的。應該是什麼? –