chart = {
const canvasWidth = 570;
const canvasHeight = 360;
const svg = d3
.create("svg")
.attr("viewBox", `0 0 ${canvasWidth} ${canvasHeight}`)
.style("border", "1px solid black");
const chartWidth = canvasWidth - 30;
const chartHeight = canvasHeight - 40;
const chartStartX = 25;
const chartStartY = 15;
const scaleX = d3
.scaleBand()
.domain(d3.range(data.length))
.range([0, chartWidth])
.padding(0.05);
const scaleY = d3
.scaleLinear()
.domain([0, d3.max(data)])
.range([chartHeight, 0]);
const chartGroup = svg
.append("g")
.attr("transform", `translate(${chartStartX}, ${chartStartY})`)
.attr("fill", "steelblue");
chartGroup
.selectAll("rect")
.data(data)
.join("rect")
.attr("x", (d, i) => scaleX(i))
.attr("width", scaleX.bandwidth())
.attr("y", (d) => scaleY(d))
.attr("height", (d) => scaleY(0) - scaleY(d));
chartGroup
.append("rect")
.attr("x", 0)
.attr("y", 0)
.attr("width", chartWidth)
.attr("height", chartHeight)
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1);
svg
.append("g")
.attr("transform", `translate(${chartStartX}, ${chartStartY + chartHeight})`)
.call(d3.axisBottom(scaleX).tickFormat(i => i + 1));
svg
.append("g")
.attr("transform", `translate(${chartStartX}, ${chartStartY})`)
.call(d3.axisLeft(scaleY));
return svg.node();
}