D3js 树形图 NaN x 值

D3js Tree Diagram NaN x value

我正在尝试创建一个带有 Javascript 对象的小树状图。我正在使用 D3 并试图说明元素(键、id)的嵌套结构而不是它们的值。

我的JSFiddle

var d1 = {
      "time_completed": 1420199657,
      "xid": "-dqAeAEjGxCDcjqrxHsraER3yWqew4xS",
      "title": "for 8h 46m",
      "time_created": 1420167382,
      "time_updated": 1420200033,
      "details": {
        "body": 0,
        "sound": 12598,
        "tz": "America/Chicago",
        "awakenings": 0,
        "light": 18970,
        "mind": 0,
        "asleep_time": 1420168079,
        "awake_time": 1420199400,
        "awake": 707,
        "rem": 0,
        "duration": 32275,
        "smart_alarm_fire": 1420199640,
        "quality": 100,
        "sunset": 0,
        "sunrise": 0
      },
      "date": 20150102,
      "shared": true,
      "snapshot_image": "/nudge/image/e/1420200033/-dqAeAEjGxCDcjqrxHsraER3yWqew4xS/MSh0lOvjHDY.png",
      "sub_type": 0
    }; 

var tree = d3.layout.tree()
    .size([360, diameter / 2 - 120])
    .separation(function(a, b) { return (a.parent == b.parent ? 1 : 2) / a.depth; });

var diagonal = d3.svg.diagonal.radial()
    .projection(function(d) { return [d.y, d.x / 180 * Math.PI]; });

var svg = d3.select("#sleep-schema").append("svg")
    .attr("width", diameter)
    .attr("height", diameter - 150)
    .append("g")
    .attr("transform", "translate(" + diameter / 2 + "," + diameter / 2 + ")");

var nodes = tree.nodes(d1),
    links = tree.links(nodes);

var link = svg.selectAll(".link")
    .data(links)
    .enter().append("path")
    .attr("class", "link")
    .attr("d", diagonal);

var node = svg.selectAll(".node")
    .data(nodes)
    .enter().append("g")
    .attr("class", "node")
    .attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + d.y + ")"; })

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

    node.append("text")
    .attr("dy", ".31em")
    .attr("text-anchor", function(d) { return d.x < 180 ? "start" : "end"; })
    .attr("transform", function(d) { return d.x < 180 ? "translate(8)" : "rotate(180)translate(-8)"; })
    .text(function(d) { return d.xid; });

}

出于某种原因,调用 d3.layout.tree 在我的 x 坐标上给出了一个 NaN 值

Error: Invalid value for <g> attribute transform="rotate(NaN)translate(0)"

任何人都可以告诉我我的问题是数据的形状还是我对 d3.layout.tree() 的使用?

更新:@Cyril,我已经将我的数据对象从数组转换为 JS 对象,但是 d3.layout.tree() 似乎无法遍历嵌套的 JSON 对象并计算 x,y 值.我倾向于同意你的看法,这是我的数据有问题。我一直在努力关注 this example.

您的 JSON 数据是一个数组。 树布局需要一个对象而不是数组。

您的数据:

d1 = [{
  "time_completed": 1420199657,
  "xid": "-dqAeAEjGxCDcjqrxHsraER3yWqew4xS",
  "title": "for 8h 46m",
  "time_created": 1420167382,
  "time_updated": 1420200033,
  "details": { ...
    "sunset": 0,
    "sunrise": 0
  },
  "date": 20150102,
  "shared": true,
  "snapshot_image": "/nudge/image/e/1420200033/-dqAeAEjGxCDcjqrxHsraER3yWqew4xS/MSh0lOvjHDY.png",
  "sub_type": 0
}];

应该是:

d1 = {
  "time_completed": 1420199657,
  "xid": "-dqAeAEjGxCDcjqrxHsraER3yWqew4xS",
  "title": "for 8h 46m",
  "time_created": 1420167382,
  "time_updated": 1420200033,
  "details": {
    "body": 0,
    "sound": 12598, ...
  },
  "date": 20150102,
  "shared": true,
  "snapshot_image": "/nudge/image/e/1420200033/-dqAeAEjGxCDcjqrxHsraER3yWqew4xS/MSh0lOvjHDY.png",
  "sub_type": 0
};

请参考这个简单的数据结构示例。 http://bl.ocks.org/d3noob/8375092

工作代码here 希望这对您有所帮助!