D3 version 4.9.0 introduced link shapes, which have the same functionality of the old d3.svg.diagonal
in D3 v3.
According to the API:
The link shape generates a smooth cubic Bézier curve from a source point to a target point. The tangents of the curve at the start and end are either vertical, horizontal or radial.
There are three methods:
So, for a collapsible tree like that one you linked, you define the path d
attribute as:
.attr("d", d3.linkHorizontal()
.x(function(d) { return d.y; })
.y(function(d) { return d.x; }));
Demo:
Suppose you have an object with source
and target
, each one with x
and y
properties:
var data = {
source: {
x: 20,
y: 10
},
target: {
x: 280,
y: 100
}
};
First, you create the link generator:
var link = d3.linkHorizontal()
.x(function(d) {
return d.x;
})
.y(function(d) {
return d.y;
});
And then you can draw the path just by passing that data to the link generator:
.attr("d", link(data))
Here is the demo:
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>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…