Сейчас я пытаюсь отделить мои узлы прямоугольника, потому что они перекрываются, как показано на рисунке ниже:
Я взглянул и узнал, что D3 предлагает nodeSize и separation, но по какой-то причине это не сработало.
Я нашел этот пост в блоге, говорящий о проблеме, но он говорит
Свойство size не существует в узлах, поэтому это будет любое свойство, которое вы хотите контролировать их размер.
но, очевидно, существует метод nodeSize, поэтому я чувствую, что просто использую метод неправильно и/или сообщение в блоге устарело. Я хочу, чтобы мои узлы были размером прямоугольника и равномерно распределяли их, чтобы они не перекрывали друг друга. Кто-нибудь знает, как правильно использовать методы? Документация об этих методах не очень хорошо объясняется и не дает никакой разницы. Я также не мог найти много примеров, когда люди меняли 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 + ")");