Самый простой способ сделать это - использовать массив данных для добавления групп ...
var group = svgContainer.selectAll(null)
.data(circleArray)
.enter()
.append("g")
//etc...
... и затем для каждой группы использовать значение элемента данных для создания другой массив с количеством кружков, которое вы хотите для каждой строки:
var circles = group.selectAll(null)
.data(function(d) {
return d3.range(d)
})
.enter()
.append("circle")
//etc...
В этом случае мы получаем данные каждой группы ...
.data(function(d) {
return d3.range(d)
})
... и передать его в d3.range()
, который создает следующие массивы:
Эти значения используются при выборе кругов.Конечно, сами значения не имеют значения, только длина каждого массива.
Вот демонстрационная версия (полная магических чисел, измените их соответственно):
// Circle Attributes
var nodeRadius = 20;
var circleArray = [1, 4, 2];
// SVG Viewport
var svgContainer = d3.select("body")
.append("svg")
.attr("width", 300)
.attr("height", 300);
var group = svgContainer.selectAll(null)
.data(circleArray)
.enter()
.append("g")
.attr("transform", function(d, i) {
return "translate(" + (300 / 2 - ((d / 2) * 50)) + "," + (50 + 50 * i) + ")";
});
var circles = group.selectAll(null)
.data(function(d) {
return d3.range(d)
})
.enter()
.append("circle")
.attr("cx", function(d) {
return d * 50;
})
.attr("r", nodeRadius)
.style("fill", "red");
<body></body>
<script src="https://d3js.org/d3.v5.min.js"></script>
PS: не относится к вашей проблеме, но .data("circleArray")
неверно.это должно быть .data(circleArray)
.