d3.js实现桑基图,代码实现
时间: 2023-06-04 17:02:09 浏览: 395
sankey-diagram-device-attribution:D3.js 转换流程的桑基图
很高兴为您提供答案。
实现桑基图,需要使用 d3.js 中的 d3.sankey() 函数。该函数可以将数据转换成桑基图的节点和边,然后使用 d3.js 绘图库绘制。
以下是一个简单的实现代码示例:
```
// 定义数据
var data = {
nodes: [
{name: "A"},
{name: "B"},
{name: "C"},
{name: "D"}
],
links: [
{source: 0, target: 1, value: 10},
{source: 1, target: 2, value: 5},
{source: 1, target: 3, value: 5},
{source: 2, target: 3, value: 2}
]
};
// 定义 SVG 容器
var svg = d3.select("body").append("svg")
.attr("width", 400)
.attr("height", 300);
// 定义桑基图布局
var sankey = d3.sankey()
.size([400, 300])
.nodeWidth(20)
.nodePadding(10)
.nodes(data.nodes)
.links(data.links)
.layout(32);
// 绘制桑基图
var path = sankey.link();
svg.selectAll(".link")
.data(data.links)
.enter().append("path")
.attr("class", "link")
.attr("d", path)
.style("stroke-width", function(d) { return Math.max(1, d.dy); })
.sort(function(a, b) { return b.dy - a.dy; });
svg.selectAll(".node")
.data(data.nodes)
.enter().append("rect")
.attr("class", "node")
.attr("x", function(d) { return d.x; })
.attr("y", function(d) { return d.y; })
.attr("height", function(d) { return d.dy; })
.attr("width", sankey.nodeWidth());
svg.selectAll(".node text")
.data(data.nodes)
.enter().append("text")
.attr("x", function(d) { return d.x + sankey.nodeWidth() / 2; })
.attr("y", function(d) { return d.y + d.dy / 2; })
.attr("dy", ".35em")
.text(function(d) { return d.name; });
```
以上代码用数据模拟了一个简单的桑基图。请根据您的实际需求修改数据和配置参数。
阅读全文