Я пытаюсь создать древовидную карту данных бюджета.
Ожидается : В древовидной карте НЕ должно быть пробелов; все прямоугольники, изображающие каждый узел, должны соответствовать как legos внутри SVG.
Actual : Прямоугольники моей древовидной карты плохо выстраиваются в моем SVG; см. изображение ниже:
For now, my dataset is quite shallow and is mostly dummy data that I made up. The structure of CSV-файл is:
These are the relevant steps from code:
Step 1:
After loading in the CSV file, I converted it into hierarchy using d3.stratify()
:
`let dataStratified = d3
.stratify()
.id(function (d) {
return d.Child;
})
.parentId(function (d) {
return d.Parent;
})(results);`
Step 2:
Then I passed to a hierarchical layout, d3.treemap()
:
let myTreemap = (data) =>
d3.treemap().size([width, height]).padding(1).round(true)(
d3
.hierarchy(data)
.sum((d) => d.data["Rs,millions"])
.sort((a, b) => b.data["Rs,millions"] - a.data["Rs,millions"])
);
const root = myTreemap(dataStratified);
Step 3:
Using this Наблюдаемый блокнот в качестве руководства я приступил к созданию листьев карты дерева:
const leaf = g
.selectAll("g.leaf")
// root.leaves() returns all of the leaf nodes
.data(root.leaves())
.enter()
.append("g")
.attr("class", "leaf")
// position each group at the top left corner of the rect
.attr("transform", (d) => `translate(${d.x0},${d.y0})`)
.style("font-size", 10);
Шаг 4 : И добавил его в созданный мной SVG:
// Now we append the rects.
leaf
.append("rect")
.attr("id", (d) => d.data.id)
.attr("fill", (d) => {
while (d.depth > 1) d = d.parent;
return color(d.data.data.Child);
})
.attr("opacity", 0.7)
// the width is the right edge position - the left edge position
.attr("width", (d) => d.x1 - d.x0)
// same for height, but bottom - top
.attr("height", (d) => d.y1 - d.y0)
// make corners rounded
.attr("rx", 3)
.attr("ry", 3);
Остальная часть кода в основном стилизована и размещение метки, поэтому я не думаю, что это имеет отношение к моему вопросу здесь, но его можно просмотреть здесь: Github или CodeSandbox .