chart = {
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height]);
svg.append("g")
.selectAll("rect")
.data(data)
.join("rect")
.attr("x", xScale(0))
.attr("y", (d, i) => yScale(i))
.attr("height", yScale.bandwidth())
.attr("width", width - margin.left - margin.right)
.attr("fill", "rgba(0,0,0,0.1)");
svg.append("g")
.selectAll("rect")
.data(data)
.join("rect")
.attr("x", xScale(0))
.attr("y", (d, i) => yScale(i))
.attr("height", yScale.bandwidth())
.attr("width", (d,i) => crosstabWidth + barScale(d))
.attr("fill", "rgba(0,0,0,0.2)");
data.map((datum, index) => svg.append("g")
.selectAll("rect")
.data(innerRectData)
.join("rect")
.attr("x", (d,i) => innerXScale(i))
.attr("y", (d, i) => yScale(index) + 10)
.attr("height", yScale.bandwidth() - 20)
.attr("width", innerRectWidth)
.attr("fill", (d,i) => getColor(d)));
// Adding text to inner rectangles
data.map((datum, index) => svg.append("g")
.selectAll("text")
.data(innerRectData)
.join('text')
.attr("x", (d,i) => innerXScale(i) + innerRectWidth)
.attr("y", yScale(index) + yScale.bandwidth() - innerPadding * 2)
.attr("dx", "-2.6rem")
.attr("dy", "0.7rem")
.text((d) => `${d}%`)
.style("font-weight", '600')
.attr("fill-opacity", "0.9")
.style('fill', 'white'));
// Bottom labels for categories
svg.append("g")
.selectAll("text")
.data(labelsY)
.join('text')
.attr("x", (d,i) => innerXScale(i) + yScale.bandwidth() / 2)
.attr("y", height - margin.top + 10)
.text((d) => d.label)
.attr("font-weight", '600')
.style("color", 'rgba(0,0,0,0.38)')
.attr("text-anchor", "middle")
.attr("fill-opacity", "0.6")
.style("font-size", '14px');
// Right side labels
svg.append("g")
.selectAll("text")
.data(rightLabelOptions)
.join('text')
.attr("x", (d,i) => width-margin.right)
.attr("y", (d,i) => yScale(i) + yScale.bandwidth())
.attr("dx", "-0.8rem")
.attr("dy", "-2rem")
.text((d) => d.perc)
.attr("font-weight", '600')
.attr("fill-opacity", "0.85")
.style("color", 'rgba(0,0,0,0.38)')
.attr("text-anchor", "end")
.append('tspan')
.text(d => d.label)
.attr("x", (d,i) => width-margin.right)
.attr("y", (d,i) => yScale(i) + yScale.bandwidth())
.attr("dx", "-0.8rem")
.attr("dy", "-0.8rem")
.attr("text-anchor", "end")
.attr("fill-opacity", "0.6")
// Top title
svg.append("text")
.attr("x", margin.left)
.attr("y", margin.top)
.attr("dy", ".35em")
.attr("text-anchor", "start")
.attr("font-weight", '600')
.style("color", 'rgba(0,0,0,0.38)')
.style("font-size", '20px')
.text(chartTitle);
return svg.node();
}