I am displaying bar chart. Each bar is combination of a rect and a circle element. Now, I want to group each rect, circle into a group element like this.
<g class="bar_group">
<rect class="bar" ..></rect>
<circle class="rounded_edge" ..></circle>
</g>
<g class="bar_group">
<rect class="bar" ..></rect>
<circle class="rounded_edge" ..></circle>
</g>
How to group them like above ie one group for a rect and circle pair only? right now it is coming as all rects and circles in one group only. ie a group under which all rects and circles.
var data = [
{
type: "s1",
value: 4,
},
{
type: "s2",
value: 2,
},
{
type: "s3",
value: 5,
},
];
var margin = { top: 50, right: 20, bottom: 0, left: 30 };
var width = 300;
var height = 220;
var innerHeight = height - margin.top - 10;
var barWidth = 20;
var barMidpoint = barWidth / 2;
var svg = d3
.select("svg")
.attr("class", "d3svg")
.attr("width", width)
.attr("height", height);
var svgG = svg.append("g").attr("transform", "translate( -6, 0)");
// X AXIS CODE
var xScale = d3.scaleBand().range([margin.left, width]).padding(0.4);
xScale.domain(
data.map(function (d) {
return d.type;
})
);
var xAxis = d3.axisBottom(xScale);
// call x axis
svgG
.append("g")
.attr("transform", `translate(20,${innerHeight})`)
.call(xAxis);
// Y AXIS CODE
var yScale = d3.scaleLinear().range([innerHeight, margin.top]);
yScale.domain([
0,
d3.max(data, function (d) {
return d.value;
}),
]);
var yAxis = d3.axisLeft(yScale).tickFormat(function (d) {
return d;
});
svgG
.append("g")
.attr("class", "y-axis")
.attr("transform", `translate(${margin.left + 25},0)`)
.call(yAxis);
// DISPLAY BARS
svgG
.selectAll(".bar")
.data(data)
.enter()
.append("rect")
.attr("class", "bar")
.attr("x", function (d) {
return xScale(d.type) + 28;
})
.attr("y", function (d) {
return yScale(d.value);
})
.attr("width", barWidth)
.attr("height", function (d) {
return innerHeight - yScale(d.value);
});
svgG
.selectAll(".circle")
.data(data)
.enter()
.append("circle")
.attr("class", "bar")
.attr("cx", function (d) {
return xScale(d.type) + barMidpoint + 28;
})
.attr("cy", function (d) {
return yScale(d.value);
})
.attr("r", barMidpoint);
.bar {
fill: steelblue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg width="600" height="500"></svg>