Javascript 如何根据节点名称设置节点链接颜色?

Javascript 如何根据节点名称设置节点链接颜色?,javascript,d3.js,Javascript,D3.js,我已经根据节点名设置了d3.js树中节点的颜色。现在,我想根据节点名称设置节点链接颜色 我已尝试使用以下工具,但未成功: link.enter().insert("path", "g") .attr("class", "link") .attr("stroke-width", function(d){ return 1; }) .attr("d", function(d) { var o = {x: source.

我已经根据节点名设置了d3.js树中节点的颜色。现在,我想根据节点名称设置节点链接颜色

我已尝试使用以下工具,但未成功:

link.enter().insert("path", "g")
      .attr("class", "link")
      .attr("stroke-width", function(d){
        return 1;
      })
      .attr("d", function(d) {
        var o = {x: source.x0, y: source.y0};
        return diagonal({source: o, target: o});
      })
      .attr("stroke", function(d){ 
        return linkColor(d.name);
        });
以及开关进一步向下的功能:

function linkColor(node_name) {
    switch (node_name)
    {
      case 'Second A': 
        return 'red';
        break;
      case 'Second B':
        return 'green';
        break;
      case 'Second C': 
        return 'purple';
        break;
      case 'Second D':
        return 'gold';
    }
}
请注意,我可以使用
.attr('style','stroke:red;')设置所有链接的颜色。


请参见绑定到路径的数据(即
链接
)中的,没有名为
名称
的属性。但是,您在
目标
对象中拥有该属性

因此,您必须选择源或目标。例如,使用目标:

.style("stroke", function(d){ 
    return linkColor(d.target.name);
});
另外,请使用
style
,而不是
attr
,因为这些路径已经有了CSS。最后,你应该摆脱糟糕的
开关
块:只需使用D3刻度

以下是您的更新代码:

var treeData=[{
“名称”:“顶级”,
“儿童”:[{
“名称”:“第二个A”,
“儿童”:[{
“名称”:“第三个A”
}, {
“名称”:“第三个B”
}]
}, {
“名称”:“第二个B”,
“儿童”:[{
“名称”:“第三个C”
}, {
“名称”:“第三个D”
}]
}, {
“名称”:“第二个C”,
“儿童”:[{
“名称”:“第三个E”
}, {
“名称”:“第三个F”
}]
}, {
“名称”:“第二个D”,
“儿童”:[{
“名称”:“第三个G”
}, {
“名称”:“第三个H”
}, ]
}, ]
}];
//*************生成树形图*****************
var保证金={
前20名,
右:120,,
底数:20,
左:120
},
宽度=960-margin.right-margin.left,
高度=500-margin.top-margin.bottom;
var i=0,
持续时间=750,
根;
var tree=d3.layout.tree()
.尺寸([高度、宽度]);
var diagonal=d3.svg.diagonal()
.投影(功能(d){
返回[d.y,d.x];
});
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,宽度+边距。右侧+边距。左侧)
.attr(“高度”,高度+边距。顶部+边距。底部)
.附加(“g”)
.attr(“转换”、“平移”(+margin.left+)、“+margin.top+”);
根=树数据[0];
root.x0=高度/2;
root.y0=0;
更新(根);
d3.选择(self.frameElement).style(“高度”,“500px”);
//在第二层之后崩溃
根。子。forEach(塌陷);
更新(根);
//折叠节点及其所有子节点
功能崩溃(d){
如果(d.儿童){
d、 _children=d.children
d、 _儿童。forEach(崩溃)
d、 children=null
}
}
函数更新(源){
//计算新的树布局。
var nodes=tree.nodes(root).reverse(),
链接=树。链接(节点);
//为固定深度进行规格化。
nodes.forEach(函数(d){
d、 y=d.深度*180;
});
//更新节点…
var node=svg.selectAll(“g.node”)
.数据(节点、功能(d){
返回d.id | |(d.id=++i);
});
//在父节点的上一个位置输入任何新节点。
var nodeEnter=node.enter().append(“g”)
.attr(“类”、“节点”)
.attr(“转换”,函数(d){
返回“translate”(“+source.y0+”,“+source.x0+”);
})
。开启(“点击”,点击);
nodeEnter.append(“圆”)
.attr(“r”,1e-6)
.样式(“填充”,功能(d){
返回d.“儿童?”#C0C0C0:“#fff”;
});
nodeEnter.append(“文本”)
.attr(“x”,函数(d){
返回d.children | | d.| U儿童?-13:13;
})
.attr(“dy”,“.35em”)
.attr(“文本锚定”,函数(d){
返回d.children | d.| u children?“结束”:“开始”;
})
.文本(功能(d){
返回d.name;
})
.样式(“填充不透明度”,1e-6);
//将节点转换到其新位置。
var nodeUpdate=node.transition()
.持续时间(持续时间)
.attr(“转换”,函数(d){
返回“translate”(“+d.y+”,“+d.x+”);
});
节点更新。选择(“圆圈”)
.attr(“r”,10)
.样式(“填充”,功能(d){
如果(d.name==“顶层”){
返回d.#儿童?“蓝色”:“fff”;
}
如果(d.name==“第二个A”){
返回d.“儿童”?“红色”:“fff”;
}
如果(d.name==“第二个B”){
返回d.#儿童?“绿色”:“fff”;
}
如果(d.name==“第二个C”){
返回d.#儿童?“紫色”:“fff”;
}
如果(d.name==“第二个d”){
返回d.#儿童?“黄金”:“fff”;
}
})
.样式(“笔划”,功能(d){
如果(d.name==“顶层”){
返回“蓝色”;
}
如果(d.name==“第二个A”){
返回“红色”;
}
如果(d.name==“第二个B”){
返回“绿色”;
}
如果(d.name==“第二个C”){
返回“紫色”;
}
如果(d.name==“第二个d”){
归还“黄金”;
}
});
nodeUpdate.select(“文本”)
.样式(“填充不透明度”,1);
//将退出节点转换到父节点的新位置。
var nodeExit=node.exit().transition()
.持续时间(持续时间)
.attr(“转换”,函数(d){
返回“translate”(“+source.y+”,“+source.x+”);
})
.remove();
nodeExit.select(“圆”)
.attr(“r”,1e-6);
nodeExit.select(“文本”)
.样式(“填充不透明度”,1e-6);
//更新链接…
var link=svg.selectAll(“path.link”)
.数据(链接、功能(d){
返回d.target.id;
});
//在父对象的上一个位置输入任何新链接。
link.enter()插入(“路径”,“g”)
.attr(“类”、“链接”)
.attr(“笔划宽度”,函数(d){
返回1;
})
.attr(“d”,函数(d){
变量o={
x:source.x0,
y:source.y0
};
返回对角线({
资料来源:o,
目标:o
});
})
.样式(“笔划”,功能(d){
返回linkColor(d.target.name);
});
//过渡链接到他们的新位置。
link.transition()
.持续时间(持续时间)
.attr(“d”,对角线);
//将退出节点转换到父节点的新位置。
link.exit().transition()
.持续时间(持续时间)
.attr(“d”,函数(d){
变量o={
x:source.x,
y:来源,y
};