javascript - 在 d3v4 中使用 d3.tree() 构建树时遇到问题

标签 javascript d3.js

我对 d3 库还很陌生,我一直在尝试使用 tree() 函数构建一棵树。

当我尝试创建树时,我收到错误:

var tree = d3.tree()
    .size([2 * Math.PI, 500])
    .separation(function(a, b) { return (a.parent == b.parent ? 1 : 2) / a.depth; });

var root = tree(buildTree(jsonObj));

这似乎是给我错误的地方,从 chrome 的控制台显示:

Uncaught TypeError: Cannot read property 'z' of undefined
at firstWalk (d3.v4.js:10665)
at TreeNode.node_eachAfter [as eachAfter] (d3.v4.js:9876)
at tree (d3.v4.js:10625)
at HTMLInputElement.<anonymous> (better_radial_tree.html:86)

buildTree 所做的只是返回具有 .children[] 的根节点,该根节点具有其他子节点,依此类推。奇怪的是,我使用 d3.layout.tree 构建一个没有任何问题,但这似乎在 d3.v4 中不起作用。我尝试构建树的对象遵循以下布局:

具有 .name.type.children[Node] 的节点对象。

The structure in the Chrome console

有什么想法为什么这不起作用吗?除了 children 之外,我还需要添加到对象中吗?任何帮助将不胜感激。

我使用 Mike Bostock 的 Radial Tidy Tree block ( https://bl.ocks.org/mbostock/4063550 ) 作为此基础。其余代码如下:

            var link = g.selectAll(".link")
            .data(root.links())
            .enter().append("path")
              .attr("class", "link")
              .attr("d", d3.linkRadial()
                  .angle(function(d) { return d.x; })
                  .radius(function(d) { return d.y; }));

        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(" + radialPoint(d.x, d.y) + ")"; });

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

            node.append("text")
              .attr("dy", "0.31em")
              .attr("x", function(d) { return d.x < Math.PI === !d.children ? 6 : -6; })
              .attr("text-anchor", function(d) { return d.x < Math.PI === !d.children ? "start" : "end"; })
              .attr("transform", function(d) { return "rotate(" + (d.x < Math.PI ? d.x - Math.PI / 2 : d.x + Math.PI / 2) * 180 / Math.PI + ")"; })
              .text(function(d) { return "test"; });

        function radialPoint(x, y) {
            return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
        }

最佳答案

在将数据传递到树之前必须计算分层布局。

var root = tree(d3.hierarchy(buildTree(jsonObj)));

感谢马克 ( https://stackoverflow.com/users/16363/mark )

关于javascript - 在 d3v4 中使用 d3.tree() 构建树时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52003634/

相关文章:

javascript - 在firefox中无法打开base64 pdf链接

javascript - mapbox/leaflet js map 上的粗白线

javascript - 让 Tipsy 使用 D3 和手动触发器

d3.js - 将 D3.js 元素附加到 Polymer 元素的 Shadow DOM

javascript - 使用 ReactJS 的 D3Plus 可视化

javascript - 鱼眼效果 D3js 图像幻灯片适用于矩形/对象但不适用于图像文件,错误 : <image> attribute x: Expected length, "NaN"

javascript - 如何在 javascript/vuejs 中的 map 中使用 if 语句

javascript - 如何禁止 javascript 仅从 iPad 设备运行?

JavaScript Object.create——继承嵌套属性

javascript - 获取 jQuery 表单 - 通过 id 获取文本值