【发布时间】:2013-07-09 21:32:35
【问题描述】:
现在我正在尝试分离我的矩形节点,因为它们重叠如下图所示:
我看了看,发现 D3 提供了 nodeSize 和 separation 方法,但由于某种原因它不起作用。
我发现这个 blog post 在谈论这个问题,但他说
节点中不存在 size 属性,因此它将是您想要控制它们大小的任何属性。
但显然有一个 nodeSize 方法,所以我觉得我只是错误地使用了该方法和/或博客文章已过时。我想将我的节点塑造成矩形的大小并将它们均匀地隔开,这样它们就不会相互重叠。有谁知道如何正确使用这些方法?关于这些方法的文档没有很好地解释,也没有产生任何区别。我也找不到很多人们改变树的节点大小或需要分隔矩形对象的例子(有一些关于圆形的例子,但我觉得这太不同了......)
这里是相关代码。我会尝试准备一个 JSFiddle。
var margin = {top: 20, right: 120, bottom: 20, left: 120},
height = 960 - margin.right - margin.left,
width = 800 - margin.top - margin.bottom,
rectW = 70;
rectH = 30;
//bbox = NaN,
maxTextLength = 0;
var i = 0,
duration = 750,
root;
//paths from each node drawn initially here
//changed to d.x, d.y
var diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.x+rectW/2, d.y+rectH/2];
//.projection(function(d) { return [d.x+bbox.getBBox().width/2, d.y+bbox.getBBox().height/2];
});
var tree = d3.layout.tree()
.nodeSize([30,70])
.separation(function(a, b) { return (a.parent == b.parent ? 1 : 2); })
.size([width, height]);
var svg = d3.select("body")
.append("svg")
.attr("height","100%").attr("width","100%")
.call(d3.behavior.zoom().on("zoom", redraw))
.append("g")
.attr("transform", "translate(" + margin.top + "," + margin.left + ")");
【问题讨论】:
-
看起来您的
nodeSize规范将高度作为宽度,将宽度作为高度。 -
@LarsKotthoff 我做了相反的事情,但问题是当我改变它时似乎没有区别。当我输入大小时,我希望节点能够正确地间隔开,但也许我误解了它的工作原理?
-
这也是我对文档的理解。你有没有玩弄这些价值观,看看它们是否有什么不同?
-
@LarsKotthoff 是的,我什至将它们设置为荒谬的数量,例如 (1000, 500) 并且没有任何改变......
-
@invincibleDudess 我认为有几种方法可以解决它,但总会有一个问题取决于你的树有多大,因为视口只会这么大。我的示例允许您拖动树并放大或缩小以处理此问题。你也可以consider repositioning where your tree is located so every time you click on a node, it centers the tree。希望有帮助!
标签: javascript tree d3.js