Javascript 每排第n排儿童数
我正在研究D3.js的树布局。这是一个简单的树布局,但每个节点都有8到9个孩子 所以,若我将每行设置为3个子节点,那个么我需要将子节点分成几行,若节点有7个子节点,那个么节点下会有3行,3,1个子节点,就像图中一样 我试过了,但它只是改变了两列的x,y位置,也就是当子节点有孙子节点时,节点彼此重叠 我现在正在深入研究……如果有任何一个解决方案比最受欢迎Javascript 每排第n排儿童数,javascript,d3.js,data-visualization,nvd3.js,Javascript,D3.js,Data Visualization,Nvd3.js,我正在研究D3.js的树布局。这是一个简单的树布局,但每个节点都有8到9个孩子 所以,若我将每行设置为3个子节点,那个么我需要将子节点分成几行,若节点有7个子节点,那个么节点下会有3行,3,1个子节点,就像图中一样 我试过了,但它只是改变了两列的x,y位置,也就是当子节点有孙子节点时,节点彼此重叠 我现在正在深入研究……如果有任何一个解决方案比最受欢迎 我已经解决了这个问题,但我忘了发布答案 如果要按行拆分,请在树之后管理自己的布局 var tree = d3.layout.tree()
我已经解决了这个问题,但我忘了发布答案 如果要按行拆分,请在树之后管理自己的布局
var tree = d3.layout.tree()
.separation(function(a, b) {
return a.parent === b.parent ? 1 : 0.8;
})
.nodeSize([200,200]);
var _nodesData = tree.nodes(rootObject);
// _nodesData.forEach(function(d) { d.y = d.depth * 220;});
_nodesData.forEach(function (d) {
d.y = d.depth * 220;
if (d.children) {
d.children.forEach(function (d, i) {
d.x = d.parent.x - (d.parent.children.length-1)*200/30
+ (d.parent.children.indexOf(d))*200/10 - i % 10 * 100 ;
});
}
});
这里200是每个孩子之间的空间,10是每行孩子的数量
很明显,这会使你们的下一个级别的子覆盖问题,因为你们可以在每一个级别上保存最后一个最大Y和最大X,并像下一个代码一样用于下一个级别的起点
var tree1 = d3.layout.tree()
.separation(function(a, b) {
return a.parent === b.parent ? 1.5 : 1.5;
})
.nodeSize([150,200]);
var _nodesData1 = tree1.nodes(_newRecordData[_x]);
_nodesData1.forEach(function (d) {
var _midpoint = d.x;
var _newRowPoint = d.x - ( 170 * 3.5)
var _countInRow = 7;
var _k = 0;
var previousTextLong = false;
var previousDirection = 1;
// if the node has too many children, go in and fix their positions to two columns.
if (d.children && d.children.length > 8) {
var _previousX = _newRowPoint;
var _previousY = d.children[0].y;
d.children.forEach(function (d, i) {
d.x = _previousX;
var s = 0;
if(previousTextLong){
s = 20*previousDirection;
}
d.y = _previousY + s;
if(d.name && d.name.length > 25){
previousTextLong = true;
previousDirection = previousDirection * -1;
}else{
previousTextLong = false;
}
_k++;
if(_k == 8){
_k = 0;
_previousX = _newRowPoint;
_previousY = _previousY + 200;
}else{
_previousX = _previousX + 170;
}
});
}
});
我认为这会给职位带来更多的定制。。。我在一个图中使用多个树布局,并在节点位置确定后对其进行管理 听起来你需要一个自定义的布局。树布局将是一个很好的开始。我已经使用了树布局,并且能够在下一行中移动子节点,但是如果在x轴中存在与父节点平行的节点,则会走得太远。我尝试了深度*I%3的x位置。您编写了哪些代码?你试过什么?请不要问基本上是要求人们为你写一个解决方案的“问题”。如果现有的D3.js布局不能满足您的需要,您需要理解D3.js并编写JavaScript代码来更改它。完成此操作并陷入困境后,您可以问一个包含代码的问题。我通过自己的_nodesData.forEachfunction d{d.y=d.depth*220;//如果节点有太多子节点,请进入并将其位置固定到两列。//如果d.children!=null | d.children.length>10{如果d.children{d.children.forEachfunction d,i{d.x=d.parent.x-d.parent.children.length-1*200/30+d.parent.children.indexOfd*200/10-i%10*100;};};