簡體   English   中英

如何將所有后代節點和鏈接設置為與2級祖先相同的顏色?

[英]How to set all descendant nodes and links to same colour as level 2 ancestor?

我有一棵d3.js樹,其后代節點接收其2級祖先的節點顏色。 這是從2級到3級的工作,但在4級及以后停止工作。

在此處輸入圖片說明

相關代碼:

var colourScale = d3.scale.ordinal()
    .domain(["MD","Professional", "Leader", "Advocate", "Clinician", "Educator", "Scholar"])
    .range(["#6695c8", "#cd3838","#d48440", "#a8ba5f", "#63b7c0", "#c97eb2", "#ccc136"]);

 nodeUpdate.select("circle")
    .attr("r", 10)
    .attr("fill-opacity","0.7")
    .attr("stroke-opacity","1")
    .style("fill", function(d) {
      return d.depth === 2 ? colourScale(d.parent.name) : colourScale(d.name);
    })
    .style("stroke", function(d) {
      return d.depth === 2 ? colourScale(d.parent.name) : colourScale(d.name);
    });

// Enter any new links at the parent's previous position.
  link.enter().insert("path", "g")
    .attr("class", "link")
    .attr("stroke-width", function(d) {
      return 1;
    })
    .attr("d", function(d) {
      var o = {
        x: source.x0,
        y: source.y0
      };
      return diagonal({
        source: o,
        target: o
      });
    })
    .attr("opacity","0.3")
    .style("stroke", function(d) {
      return d.target.depth === 2 ? colourScale(d.target.parent.name) : colourScale(d.target.name);
    });

如何將父項的所有后代設置為相同的顏色(節點和鏈接)?

小提琴

使用遞歸函數上移層次結構,直到找到具有正確depth的節點。 例如:

function findParent(datum) {
  if (datum.depth < 2) {
    return datum.name
  } else {
    return findParent(datum.parent)
  }
}

甚至更短的三元:

function findParent(datum) {
    return datum.depth < 2 ? datum.name : findParent(datum.parent);
};

然后,您可以將其傳遞給色標:

.style("fill", function(d) {
    return colourScale(findParent(d));
})

這是更新的代碼:

 var treeData = [{ "name": "MD", "children": [{ "name": "Professional", "children": [{ "name": "Third A", "children": [{ "name": "Fourth A", "children": [{ "name": "Fifth A" }, { "name": "Fifth B" }, { "name": "Fifth C" }, { "name": "Fifth D" }] }, { "name": "Fourth B" }, { "name": "Fourth C" }, { "name": "Fourth D" }] }, { "name": "Third B" }] }, { "name": "Leader", "children": [{ "name": "Third C" }, { "name": "Third D" }] }, { "name": "Advocate", "children": [{ "name": "Third E" }, { "name": "Third F" }] }, { "name": "Clinician", "children": [{ "name": "Third G" }, { "name": "Third H" }, ] }, ] }]; var colourScale = d3.scale.ordinal() .domain(["MD", "Professional", "Leader", "Advocate", "Clinician"]) .range(["#6695c8", "#cd3838", "#d48440", "#a8ba5f", "#63b7c0"]); // ************** Generate the tree diagram ***************** var margin = { top: 20, right: 120, bottom: 20, left: 120 }, width = 1200 - margin.right - margin.left, height = 650 - 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 [dy, dx]; }); var svg = d3.select("body").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 = treeData[0]; root.x0 = height / 2; root.y0 = 0; update(root); d3.select(self.frameElement).style("height", "500px"); // Collapse after the second level root.children.forEach(collapse); update(root); // Collapse the node and all it's children function collapse(d) { if (d.children) { d._children = d.children d._children.forEach(collapse) d.children = null } } 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) { dy = d.depth * 200; }); // 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 ? "#C0C0C0" : "#fff"; }); nodeEnter.append("text") .attr("x", function(d) { return d.children || d._children ? -13 : 13; }) .attr("dy", ".35em") .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(" + dy + "," + dx + ")"; }); nodeUpdate.select("circle") .attr("r", 10) .attr("fill-opacity", "0.7") .attr("stroke-opacity", "1") .style("fill", function(d) { return colourScale(findParent(d)); }) .style("stroke", function(d) { return colourScale(findParent(d)); }); 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-6); 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("stroke-width", function(d) { return 1; }) .attr("d", function(d) { var o = { x: source.x0, y: source.y0 }; return diagonal({ source: o, target: o }); }) .attr("opacity", "0.3") .style("stroke", function(d) { return colourScale(findParentLinks(d)); }); // 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 = dx; d.y0 = dy; }); } function findParent(datum) { if (datum.depth < 2) { return datum.name } else { return findParent(datum.parent) } } function findParentLinks(datum) { if (datum.target.depth < 2) { return datum.target.name } else { return findParent(datum.target.parent) } } // 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: #C0C0C0; stroke-width: 1.5px; } .node text { font: 10px sans-serif; } .link { fill: none; stroke: #C0C0C0; stroke-width: 1.5px; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM