我想尝试执行可折叠树的代码,就像这里所提到的那样。但是在v4中似乎对角线方法不适用(我可能是错的)。
关于:
var diagonal = d3.svg.diagonal()
我遇到了这个错误:
TypeError: 无法读取未定义的属性“diagonal”
在v4中相当于什么?查看d3.js API文档没有给我任何线索。
我想尝试执行可折叠树的代码,就像这里所提到的那样。但是在v4中似乎对角线方法不适用(我可能是错的)。
关于:
var diagonal = d3.svg.diagonal()
我遇到了这个错误:
TypeError: 无法读取未定义的属性“diagonal”
在v4中相当于什么?查看d3.js API文档没有给我任何线索。
D3 4.9.0引入link shapes,其功能与D3 v3中的d3.svg.diagonal
相同。根据API,链接形状从源点到目标点生成平滑的三次贝塞尔曲线。曲线在起点和终点处的切线可以是垂直的、水平的或径向的。有三种方法:
因此,对于像您链接的可折叠树形图,可以将路径d
属性定义为:
.attr("d", d3.linkHorizontal()
.x(function(d) { return d.y; })
.y(function(d) { return d.x; }));
演示:
假设您有一个对象,其中包含 source
和 target
,每个对象都有 x
和 y
属性:
var data = {
source: {
x: 20,
y: 10
},
target: {
x: 280,
y: 100
}
};
首先,您需要创建链接生成器:
var link = d3.linkHorizontal()
.x(function(d) {
return d.x;
})
.y(function(d) {
return d.y;
});
然后,您只需将该数据传递给链接生成器即可绘制路径:
.attr("d", link(data))
这是演示:
var svg = d3.select("svg");
var data = {
source: {
x: 20,
y: 10
},
target: {
x: 280,
y: 100
}
};
var link = d3.linkHorizontal()
.x(function(d) {
return d.x;
})
.y(function(d) {
return d.y;
});
svg.append("path")
.attr("d", link(data))
.style("fill", "none")
.style("stroke", "darkslateblue")
.style("stroke-width", "4px");
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg></svg>
请查看 GitHub 问题链接。
虽然该问题仍未解决,但似乎 Bostock 先生不着急在版本4中重新实现它。为什么?因为你自己也可以轻松地实现:
function link(d) {
return "M" + d.source.y + "," + d.source.x
+ "C" + (d.source.y + d.target.y) / 2 + "," + d.source.x
+ " " + (d.source.y + d.target.y) / 2 + "," + d.target.x
+ " " + d.target.y + "," + d.target.x;
}
我一开始遇到这个问题时很难解决,但几个小时后,我意识到它实际上非常简单(就像其他人提到的那样)。 请更换:
var diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.y, d.x]; });
...用这个:
var diagonal = function link(d) {
return "M" + d.source.y + "," + d.source.x
+ "C" + (d.source.y + d.target.y) / 2 + "," + d.source.x
+ " " + (d.source.y + d.target.y) / 2 + "," + d.target.x
+ " " + d.target.y + "," + d.target.x;
};
那应该是唯一的变化。希望这可以帮助其他人。这应该适用于像Patrick Brockman的可折叠/可搜索树这样的可视化。
对于那些有垂直树的人,下面的函数将产生弯曲的对角线,如this example所示。
这个函数是通过以下两种方式修改Mark的答案而得到的:(1)交换x和y的调用,(2)在两行中间的计算坐标。如果没有坐标变化,曲线会被倒置,例如this post。
var diagonal = function link(d) {
return "M" + d.source.x + "," + d.source.y
+ "C" + d.source.x + "," + (d.source.y + d.target.y) / 2
+ " " + d.target.x + "," + (d.source.y + d.target.y) / 2
+ " " + d.target.x + "," + d.target.y;
};
" "
替换"C"
。我和你遇到了同样的问题,但是!D3的V6版本有一个新的树形结构可用(基于Mike Bostock的工作): https://bl.ocks.org/d3noob/9de0768412ac2ce5dbec430bb1370efe
我把下面的代码复制在这里,以防万一链接因为某些未知原因而消失:
.node circle { fill: #fff; stroke: steelblue; stroke-width: 3px; } .node text { font: 12px sans-serif; } .link { fill: none; stroke: #ccc; stroke-width: 2px; }您还会找到一些其他示例 在那里
d3.linkHorizontal()
这部分? - erp