Javascript 无法在D3.js中呈现从源到目标的路径,正在将v3迁移到v4

Javascript 无法在D3.js中呈现从源到目标的路径,正在将v3迁移到v4,javascript,python,html,css,d3.js,Javascript,Python,Html,Css,D3.js,我一直在尝试从D3.js v3迁移到版本4。我已经查看了changelog并更新了所有函数,但是现在对角线函数被删除了,我无法呈现从源节点到目标节点的路径 我正在使用Python脚本通过HTML和d3.js生成的解析树。Python脚本生成了一个HMTL文档,在这里它使用D3.js版本3运行 函数drawTree(){ var margin={顶部:20,右侧:120,底部:20,左侧:120}, 宽度=1060-margin.right-margin.left, 高度=600-margin.

我一直在尝试从D3.js v3迁移到版本4。我已经查看了changelog并更新了所有函数,但是现在对角线函数被删除了,我无法呈现从源节点到目标节点的路径

我正在使用Python脚本通过HTML和d3.js生成的解析树。Python脚本生成了一个HMTL文档,在这里它使用D3.js版本3运行

函数drawTree(){
var margin={顶部:20,右侧:120,底部:20,左侧:120},
宽度=1060-margin.right-margin.left,
高度=600-margin.top-margin.bottom;
var i=0,
持续时间=750,//动画持续时间
root;//以json格式存储树结构
var tree=d3.layout.tree()
.尺寸([高度、宽度]);
var edge_weight=d3.scale.linear()
.domain([01100])
.范围([01100]);
var diagonal=d3.svg.diagonal()
.投影(函数(d){返回[d.y,d.x];});
//将svg添加到html结构中
var svg=d3.选择(“div#viz”).追加(“svg”)
.attr(“宽度”,宽度+边距。右侧+边距。左侧)
.attr(“高度”,高度+边距。顶部+边距。底部)
.附加(“g”)
.attr(“转换”、“平移”(+margin.left+)、“+margin.top+”);
树形变种=
{
“姓名”:“祖父母”,
“尺寸”:100,
“儿童”:[
{ 
“名称”:“父级A”,
“尺寸”:70,
“儿童”:[
{“姓名”:“人子”,
“尺寸”:30,
“儿童”:[
{“姓名”:“A的孙子”,
“大小”:3},
{“姓名”:“A的孙子2”,
“大小”:2},
{“姓名”:“A的孙子3”,
“大小”:5},
{“姓名”:“A的祖父”,
“尺寸”:20,
“儿童”:[
{“姓名”:“一个家族的曾孙”,
“大小”:15},
{“名字”:“一个伟大的祖父”,
“大小”:5}
]
}
],
},
{“姓名”:“A的女儿”,
“尺寸”:40
}
]
},
{“名称”:“父级B”,
“大小”:30}],
};
边权域([0,树数据大小]);
//指定父对象、子对象、高度和深度
根=treeData;
root.x0=高度/2;
root.y0=0;
根。子。forEach(塌陷);
更新(根);
d3.选择(self.frameElement).style(“高度”,“800px”);
/**
*更新节点。
*根据源的结构对节点进行复制和扩展
*展开所有“子节点”并折叠“\u子节点”
*@param{json structure}source
*/
函数更新(源){
//计算新的树布局。
var nodes=tree.nodes(root).reverse(),
链接=树。链接(节点);
//为固定深度进行规格化。
forEach(函数(d){d.y=d.depth*180;});
//更新节点的名称
var node=svg.selectAll(“g.node”)
.data(节点,函数(d){返回d.id | |(d.id=++i)});
//在父节点的上一个位置输入任何新节点。
var nodeEnter=node.enter().append('g')
.attr('类','节点')
.attr(“转换”,函数(d){
返回“translate”(“+source.y0+”,“+source.x0+”);
})
.on('点击',点击);
nodeEnter.append(“圆”)
.attr('类','节点')
.attr('r',1e-6)
.样式(“填充”,功能(d){
返回d.#儿童?“淡蓝色”:“fff”;
}); 
nodeEnter.append(“文本”)
.attr(“x”,函数(d){返回d.children | | d._children?-10:10;})
.attr(“dy”,“.35em”)
.attr(“文本锚定”,函数(d){return d.children | | d.| u children?“end”:“start”})
.text(函数(d){返回d.name;})
.样式(“填充不透明度”,1e-6);
//将节点转换到其新位置。
var nodeUpdate=node.transition()
.持续时间(持续时间)
.attr(“转换”,函数(d){return“translate”(+d.y+),“+d.x+”);});
节点更新。选择(“圆圈”)
.attr(“r”,函数(d){console.log(“>>>>>>>>>”,d);返回边缘重量(d.size/2);})
.style(“填充”,函数(d){
返回d.“儿童”?“浅蓝色”:“fff”};
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”)
.data(链接,函数(d){返回d.target.id;});
//在父对象的上一个位置输入任何新链接。
link.enter()插入(“路径”,“g”)
.attr(“类”、“链接”)
.attr(“笔划宽度”,函数(d){
返回1;
})
.attr(“d”,函数(d){
var o={x:source.x0,y:source.y0};
返回对角线({source:o,target:o});
})
.attr(“笔划”,函数(d){
返回“薰衣草”;});
//过渡链接到他们的新位置。
link.transition()
.持续时间(持续时间)
.attr(“d”,函数(d){
/*计算顶移*/
var source={x:d.source.x-edge_-weight(calculateLinkSourcePosition(d)),y:d.source.y};
var target={x:d.target.x,y:d.target.y};
返回对角线({source:source,target:target});
})
.attr(“笔划宽度”,函数(d){
返回边缘重量(d.目标尺寸);
});
//将退出节点转换到父节点的新位置。
link.exit().transition()
.持续时间(持续时间)
.attr(“d”,函数(d){
var o={x:source.x,y:source.y};
返回对角线({source:o,target:o});
})
.remove();
//将旧位置隐藏起来,以便过渡。
nodes.forEach(函数(d){
d、 x0
link.target.id --> link.id
link.source.children.length --> link.parent.children.length
link.source.size --> link.parent.data.size