function createBarChartLabeled(width, height, margin, data, dataLabels, xAxisLabel, yAxisLabel) {
const svg = d3.select(DOM.svg(width, height));
const xScale = d3.scaleBand()
.domain(d3.range(data.length))
.range([margin.left, width - margin.right])
.padding(0.1);
const yScale = d3.scaleLinear()
.domain([0, d3.max(data)])
.range([height - margin.bottom, margin.top]);
const yAxis = svg.append('g')
.attr('class', 'y-axis')
.attr('transform', `translate(${margin.left},0)`)
.call(d3.axisLeft(yScale));
if (yAxisLabel) {
yAxis.append("text")
.attr("x", -margin.left)
.attr("y", 10)
.attr("fill", "currentColor")
.attr("text-anchor", "start")
.text(yAxisLabel);
}
yAxis.selectAll('line.y-grid')
.data(yScale.ticks())
.join('line')
.attr('class', 'y-grid')
.attr('x1', 0)
.attr('x2', width - margin.left - margin.right)
.attr('y1', d => yScale(d))
.attr('y2', d => yScale(d))
.style('stroke', 'lightgray');
const xAxis = svg.append('g')
.attr('class', 'x-axis')
.attr('transform', `translate(0,${height - margin.bottom})`)
.call(dataLabels ? d3.axisBottom(xScale).tickFormat((_, i) => dataLabels[i]) : d3.axisBottom(xScale));
if (xAxisLabel) {
xAxis.append("text")
.attr("x", width)
.attr("y", margin.bottom - 4)
.attr("fill", "currentColor")
.attr("text-anchor", "end")
.text(xAxisLabel);
}
svg.selectAll('rect')
.data(data)
.join('rect')
.attr('x', (_, i) => xScale(i))
.attr('y', d => yScale(d))
.attr('width', xScale.bandwidth())
.attr('height', d => yScale(0) - yScale(d))
.style('stroke', 'black')
.attr('fill', 'pink');
return svg.node();
}