D3树定向

威廉

我正在使用D3 Tree布局,类似于此jsfiddle,唯一的问题是我需要每个节点的方向都从布局的左上方开始,而不是在顶部中心。

var nodeUpdate = node.transition()
  .duration(duration)
  .attr("transform", function(d) {         
    return "translate(" + d.y + "," + d.x + ")";
});

类似于以下内容: 在此处输入图片说明

关于如何做到这一点的任何想法?

先感谢您。

标记

建立在这个例子的基础上

// Compute the new tree layout.
var nodes = tree.nodes(root).reverse(),
    links = tree.links(nodes);

// figure out the placement of the "top-most" node at each depth
var nodeMap = {};
nodes.forEach(function(d) { 
  if (!nodeMap[d.depth] || d.x < nodeMap[d.depth]){
    nodeMap[d.depth] = d.x;
  }
});
// shift all nodes up
nodes.forEach(function(d) { 
  d.y = d.depth * 100;
  d.x -= nodeMap[d.depth];
});

这将产生:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">

    <title>Tree Example</title>

    <style>
	
	.node {
		cursor: pointer;
	}

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

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

	.link {
	  fill: none;
	  stroke: #ccc;
	  stroke-width: 2px;
	}
	
    </style>

  </head>

  <body>

<!-- load the d3.js library -->	
<script src="http://d3js.org/d3.v3.min.js"></script>
	
<script>

var treeData = [
  {
    "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",
        "children": [
          {
            "name": "Son of B",
            "parent": "Level 2: B"
          },
          {
            "name": "Daughter of B",
            "parent": "Level 2: B"
          }
        ]
      }
    ]
  }
];


// ************** Generate the tree diagram	 *****************
var margin = {top: 20, right: 120, bottom: 20, left: 120},
	width = 960 - margin.right - margin.left,
	height = 500 - 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("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);

function update(source) {

  // Compute the new tree layout.
  var nodes = tree.nodes(root).reverse(),
	  links = tree.links(nodes);

  // Normalize for fixed-depth.
  var nodeMap = {};
  nodes.forEach(function(d) { 
    if (!nodeMap[d.depth] || d.x < nodeMap[d.depth]){
      nodeMap[d.depth] = d.x;
    }
  });
  nodes.forEach(function(d) { 
    d.y = d.depth * 100;
    d.x -= nodeMap[d.depth];
  });

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

  nodeUpdate.select("circle")
	  .attr("r", 10)
	  .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-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("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);
}

</script>
	
  </body>
</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带链接的D3树图

来自分类Dev

D3布局树未渲染

来自分类Dev

d3树加入单身儿童

来自分类Dev

json的D3树布局

来自分类Dev

垂直翻转 D3 树图

来自分类Dev

d3.js使用标签强制定向树

来自分类Dev

D3可折叠树的不同节点颜色

来自分类Dev

在d3树布局链接上添加标记

来自分类Dev

D3可折叠树,节点合并问题

来自分类Dev

关于放大D3放射状树

来自分类Dev

为D3树布局嵌套CSV

来自分类Dev

D3树方形节点不在所需位置

来自分类Dev

使用ScalaJS从JSON创建D3树

来自分类Dev

在d3中的树的链接中插入文本

来自分类Dev

D3:过渡树图并保留原始组大小

来自分类Dev

在D3树布局中使用多种链接类型

来自分类Dev

使用d3在树中添加列表或垂直tspan

来自分类Dev

在d3树布局链接上添加标记

来自分类Dev

使用ScalaJS从JSON创建D3树

来自分类Dev

删除某些节点后更新D3树

来自分类Dev

向可折叠的d3树链接添加文本

来自分类Dev

将标题附加到D3树布局会导致错误(D3)

来自分类Dev

更改d3强制布局链接样式以匹配d3树外观

来自分类Dev

D3强制定向布局:边界框

来自分类Dev

d3-搜索树并突出显示d3 v5的节点和路径

来自分类Dev

我可以将图像用作d3树图的背景矩形吗?

来自分类Dev

可缩放D3角度树图指令

来自分类Dev

d3可折叠搜索树-删除每次搜索中的旧笔画

来自分类Dev

D3树布局-具有子节点的子节点之间的距离