Javascript 编辑D3 SVG';s链接在a中的位置;径向的;图表
我遇到了一个我没有成功解决的问题,在本例中,我想从矩形的中间开始移动链接,将它们放在最末端,这样PUB-2和PUB-3就不会相互交叉。如果可能,可以展开第一层,并默认关闭另一层 有什么想法吗?这是源代码(d3网站)和工作代码笔(),在其中,我使用第126行上的代码bellow+链接间距将原始圆圈更改为矩形:Javascript 编辑D3 SVG';s链接在a中的位置;径向的;图表,javascript,d3.js,Javascript,D3.js,我遇到了一个我没有成功解决的问题,在本例中,我想从矩形的中间开始移动链接,将它们放在最末端,这样PUB-2和PUB-3就不会相互交叉。如果可能,可以展开第一层,并默认关闭另一层 有什么想法吗?这是源代码(d3网站)和工作代码笔(),在其中,我使用第126行上的代码bellow+链接间距将原始圆圈更改为矩形: nodeEnter.append("rect") .attr("width", 75) .attr("height", 20) .attr("x",
nodeEnter.append("rect")
.attr("width", 75)
.attr("height", 20)
.attr("x", -10)
.attr("y", -10)
.style("fill", function(d) { return d._children ? "lightsteelblue" : "red"; });
以下是修复链接的方法: 首先,更改矩形的位置,使其位于标准链接节点图中圆的中心位置。我没有在
update
函数中硬编码值,而是在对象中配置了矩形尺寸:
var rect = {l: 60, w: 20};
编辑矩形属性以使用rect
中的值,并通过将x
和y
值分别偏移矩形长度的一半和宽度的一半,将矩形居中放置在节点上
nodeEnter.append("rect")
.attr("width", rect.l) // long dimension
.attr("height", rect.w) // short dimension
.attr("x", -rect.l/2) // offset by half the long dimension
.attr("y", -rect.w/2) // offset by half the short dimension
.style("fill", function(d) {
return d._children ? "lightsteelblue" : "red";
});
要修复链接,我们需要将它们的开始和结束位置更改为相同的偏移量。由于退出和进入链接都使用源节点的位置,因此我们需要担心的唯一链接是更新选择:
link.transition()
.duration(duration)
.attr("d", diagonal);
对角线
采用以下形式的对象
{ source: { x: 123, y: 456 }, target: { x: 234, y: 567 } }
在更新选择的情况下,数据项已经在此配置中,因此调用对角线(d)
可以正常工作。因为我们要修改坐标以包含矩形的偏移量,所以我们必须中断对角线调用。请注意,投影将切换x
和y
坐标,因此我们必须更改y
值:
link.transition()
.duration(duration)
.attr("d", function(d){
return diagonal({
source: {x: d.source.x, y: d.source.y + rect.l/2}, // add half the rectangle length
target: {x: d.target.x, y: d.target.y - rect.l/2} // minus half the rectangle length
})
});
我还通过删除您添加的偏移量并将文本锚定设置为“中间”来自由地将文本居中于矩形中
结果如下:
var酒吧=
{
“名称”:“AUT-1”,
“儿童”:[
{
“姓名”:“PUB-1”、“儿童”:[
{“姓名”:“AUT-11”,“儿童”:[
{“名称”:“AFF-111”},
{“名称”:“AFF-112”}
]},
{“姓名”:“AUT-12”,“儿童”:[
{“名称”:“AFF-121”}
]},
{“姓名”:“AUT-13”,“儿童”:[
{“姓名”:“AFF-131”},
{“名称”:“AFF-132”}
]},
{“姓名”:“AUT-14”,“儿童”:[
{“名称”:“AFF-141”}
]}
]
},
{
“姓名”:“第二酒吧”、“儿童”:[
{“名称”:“AUT-21”},
{“名称”:“AUT-22”},
{“名称”:“AUT-23”},
{“名称”:“AUT-24”},
{“名称”:“AUT-25”},
{“名称”:“AUT-26”},
{“名称”:“AUT-27”},
{“姓名”:“AUT-28”,“儿童”:[
{“姓名”:“AFF-281”},
{“姓名”:“AFF-282”},
{“姓名”:“AFF-283”},
{“姓名”:“AFF-284”},
{“姓名”:“AFF-285”},
{“姓名”:“AFF-286”}
]}
]
},
{“名称”:“PUB-3”},
{
“姓名”:“第四酒吧”,“儿童”:[
{“名称”:“AUT-41”},
{“名称”:“AUT-42”},
{“姓名”:“AUT-43”,“儿童”:[
{“姓名”:“AFF-431”},
{“姓名”:“AFF-432”},
{“姓名”:“AFF-433”},
{“姓名”:“AFF-434”,“儿童”:[
{“名称”:“ADD-4341”},
{“名称”:“ADD-4342”},
]}
]},
{“名称”:“AUT-44”}
]
},
{
“姓名”:“第五酒吧”、“儿童”:[
{“姓名”:“AUT-51”,“儿童”:[
{“姓名”:“AFF-511”},
{“名称”:“AFF-512”},
{“姓名”:“AFF-513”},
{“姓名”:“AFF-514”},
{“姓名”:“AFF-515”},
{“名称”:“AFF-516”}
]},
{“名称”:“AUT-52”},
{“名称”:“AUT-53”},
{“名称”:“AUT-54”},
{“姓名”:“AUT-55”,“儿童”:[
{“姓名”:“AFF-551”},
{“姓名”:“AFF-552”},
{“姓名”:“AFF-553”},
{“名称”:“AFF-554”}
]},
{“名称”:“AUT-56”},
{“名称”:“AUT-57”},
{“名称”:“AUT-58”},
{“名称”:“AUT-59”},
{“名称”:“AUT-591”},
{“名称”:“AUT-592”},
{“名称”:“AUT-593”},
{“名称”:“AUT-594”},
{“名称”:“AUT-595”},
{“名称”:“AUT-596”}
]
},
{
“姓名”:“第六酒吧”,“儿童”:[
{“姓名”:“AUT-61”,“儿童”:[
{“名称”:“AFF-611”},
{“名称”:“AFF-612”},
{“姓名”:“AFF-613”},
{“姓名”:“AFF-614”,“儿童”:[
{“名称”:“ADD-6141”},
{“名称”:“ADD-6142”},
]}
]},
{“名称”:“AUT-62”},
{“名称”:“AUT-63”},
{“名称”:“AUT-64”},
{“名称”:“AUT-65”},
{“名称”:“AUT-66”},
{“名称”:“AUT-67”},
{“名称”:“AUT-68”},
{“名称”:“AUT-69”}
]
}
]
};
var直径=800;
var margin={顶部:20,右侧:120,底部:20,左侧:120},
宽度=直径,
高度=直径;
var i=0,
持续时间=350,
根;
var tree=d3.layout.tree()
.尺寸([360,直径/2-80])
.separation(函数(a,b){return(a.parent==b.parent?1:1)/a.depth;});
var diagonal=d3.svg.diagonal.radial()
.投影(功能(d)
if (nodes[0].x > 180) {
nodes[0].x = nodes[0].x - 90
}
else {
nodes[0].x = nodes[0].x + 90
}