Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript d3.layout.tree中的颜色路径_Javascript_D3.js - Fatal编程技术网

Javascript d3.layout.tree中的颜色路径

Javascript d3.layout.tree中的颜色路径,javascript,d3.js,Javascript,D3.js,我想在我的可折叠d3布局中,根据最底层正上方的一个节点为路径着色。显然,只有当子节点正上方的多个节点展开时,才会有不同的颜色 我使用的代码来自d3js示例,只做了一些小的修改: function buildTree(data) { var margin = {top: 20, right: 120, bottom: 20, left: 120}, width = 960 - margin.right - margin.left,

我想在我的可折叠d3布局中,根据最底层正上方的一个节点为路径着色。显然,只有当子节点正上方的多个节点展开时,才会有不同的颜色

我使用的代码来自d3js示例,只做了一些小的修改:

function buildTree(data) {
        var margin = {top: 20, right: 120, bottom: 20, left: 120},
                width = 960 - margin.right - margin.left,
                height = 800 - margin.top - margin.bottom;
        var i = 0,
                duration = 750,
                root;
        var tree = d3.layout.tree()
                .size([height, width]);
        var diagonal = d3.svg.diagonal()
                .projection(function (d) {
                    return [d.y, d.x];
                });
        var svg = d3.select("#node").append("svg")
                .attr("width", width + margin.right + margin.left)
                .attr("height", height + margin.top + margin.bottom)
                .append("g")
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
        root = data;
        root.x0 = height / 2;
        root.y0 = 0;
        function collapse(d) {
            if (d.children) {
                d._children = d.children;
                d._children.forEach(collapse);
                d.children = null;
            }
        }
        root.children.forEach(collapse);
        update(root);
        d3.select(self.frameElement).style("height", "800px");
        function update(source) {
            // Compute the new tree layout.
            var nodes = tree.nodes(root).reverse(),
                    links = tree.links(nodes);
            // Normalize for fixed-depth.
            nodes.forEach(function (d) {
                d.y = d.depth * 180;
            });
            // Update the nodes…
            var node = svg.selectAll("g.node")
                    .data(nodes, function (d) {
                        return d.id || (d.id = ++i);
                    });
            // Enter any new nodes at the parent's previous position.
            var nodeEnter = node.enter().append("g")
                    .attr("class", "node")
                    .attr("transform", function (d) {
                        return "translate(" + source.y0 + "," + source.x0 + ")";
                    })
                    .on("click", click);
            nodeEnter.append("circle")
                    .attr("r", 1e-6)
                    .style("fill", function (d) {
                        return d._children ? "lightsteelblue" : "#fff";
                    });
            nodeEnter.append("text")
                    .attr("x", function (d) {
                        return d.children || d._children ? -10 : 10;
                    })
                    .attr("dy", "1em")
                    .attr("text-anchor", function (d) {
                        return d.children || d._children ? "end" : "start";
                    })
                    .text(function (d) {
                        return d.name;
                    })
                    .style("fill-opacity", 1e-6);
            // Transition nodes to their new position.
            var nodeUpdate = node.transition()
                    .duration(duration)
                    .attr("transform", function (d) {
                        return "translate(" + d.y + "," + d.x + ")";
                    });
            nodeUpdate.select("circle")
                    .attr("r", 4.5)
                    .style("fill", function (d) {
                        return d._children ? "lightsteelblue" : "#fff";
                    });

            nodeUpdate.select("text")
                    .style("fill-opacity", 1);
            // Transition exiting nodes to the parent's new position.
            var nodeExit = node.exit().transition()
                    .duration(duration)
                    .attr("transform", function (d) {
                        return "translate(" + source.y + "," + source.x + ")";
                    })
                    .remove();
            nodeExit.select("circle")
                    .attr("r", 1e-4);
            nodeExit.select("text")
                    .style("fill-opacity", 1e-6);
            // Update the links…
            var link = svg.selectAll("path.link")
                    .data(links, function (d) {
                        return d.target.id;
                    });
            // Enter any new links at the parent's previous position.
            link.enter().insert("path", "g")
                    .attr("class", "link")
                    .attr("d", function (d) {
                        var o = {x: source.x0, y: source.y0};
                        return diagonal({source: o, target: o});
                    });
            // Transition links to their new position.
            link.transition()
                    .duration(duration)
                    .attr("d", diagonal);
            // Transition exiting nodes to the parent's new position.
            link.exit().transition()
                    .duration(duration)
                    .attr("d", function (d) {
                        var o = {x: source.x, y: source.y};
                        return diagonal({source: o, target: o});
                    })
                    .remove();
            // Stash the old positions for transition.
            nodes.forEach(function (d) {
                d.x0 = d.x;
                d.y0 = d.y;
            });
        }
        // Toggle children on click.
        function click(d) {
            if (d.children) {
                d._children = d.children;
                d.children = null;
            } else {
                d.children = d._children;
                d._children = null;
            }
            update(d);
        }
    }
“链接”颜色(这是我想要更改的)来自一些已定义的样式:

    .node {
        cursor: pointer;
    }

    .node circle {
        fill: #fff;
        stroke: steelblue;
        stroke-width: 2px;
    }

    .node text {
        font: 12px sans-serif;
        fill: white;
    }

    .link {
        fill: none;
        stroke: white;
        stroke-width: 1.5px;
    }

我在黑色背景上,因此我希望将颜色保留为红色、绿色、蓝色、白色等(可以在黑色背景下看到的颜色)。

您可以在创建
链接时设置
颜色,在代码中:

link.enter().insert(“路径”,“g”)
.attr(“类”、“链接”)
.attr(“d”,函数(d){
var o={x:source.x0,y:source.y0};
返回对角线({source:o,target:o});
})
.attr(“笔划”,函数(d){返回'blue';})
//^^在此处返回您的颜色。

然后,您可以安全地删除
笔划
的CSS定义。link

您可以通过在代码中设置笔划颜色来动态地为链接着色。节点的深度(如果我理解正确的话,它就是您所追求的)是其数据的一部分,因此您可以直接引用它

var color = d3.scale.category20();
// ...
link.transition()
    .duration(duration)
    .attr("d", diagonal)
    .style("stroke", function(d) { return color(d.source.depth); });

是的,这很有道理。我来试试。你不能直接添加
笔划
,因为它必须通过属性style@GovindMantri.attr和.style都可以,不过我同意应该使用.style来完成