Существует также другой подобный подход, показанный в следующем jsfiddle.
![введите здесь описание изображения](https://i.stack.imgur.com/uhz4a.png)
Я начал с этой скрипки (из другого ТАКОЙ вопрос, который вы упомянули)), где все узлы уже были преобразованы в круги:
![введите здесь описание изображения](https://i.stack.imgur.com/e2EkF.png)
Затем я изменил существующий и добавил новый код, который включает фильтрацию при создании кругов:
// add the circles for "node4" and "node7"
node
.filter(function(d){ return (d.name == "node4") || (d.name == "node7"); })
.append("circle")
.attr("cx", sankey.nodeWidth()/2)
.attr("cy", function (d) {
return d.dy/2;
})
.attr("r", function (d) {
return Math.sqrt(d.dy);
})
.style("fill", function (d) {
return d.color = color(d.name.replace(/ .*/, ""));
})
.style("fill-opacity", ".9")
.style("shape-rendering", "crispEdges")
.style("stroke", function (d) {
return d3.rgb(d.color).darker(2);
})
.append("title")
.text(function (d) {
return d.name + "\n" + format(d.value);
});
// add the rectangles for the rest of the nodes
node
.filter(function(d){ return !((d.name == "node4") || (d.name == "node7")); })
.append("rect")
.attr("y", function (d) {
return d.dy/2 - Math.sqrt(d.dy)/2;
})
.attr("height", function (d) {
return Math.sqrt(d.dy);
})
.attr("width", sankey.nodeWidth())
.style("fill", function (d) {
return d.color = color(d.name.replace(/ .*/, ""));
})
.style("fill-opacity", ".9")
.style("shape-rendering", "crispEdges")
.style("stroke", function (d) {
return d3.rgb(d.color).darker(2);
})
.append("title")
.text(function (d) {
return d.name + "\n" + format(d.value);
});
Аналогичный код пришлось модифицировать для точного позиционирования текста рядом с прямоугольниками.
Я считаю, что окончательный результат выглядит естественным, даже несмотря на то, что он потерял некоторые качества оригинального Sankey (например, более широкие связи).
person
VividD
schedule
19.12.2014