function stackedBarHouse(
data,
{
height = 100,
barHeight = 20,
halfBarHeight = barHeight / 2,
f = d3.format(".1f"),
margin = { top: 20, right: 10, bottom: 20, left: 10 },
w = width - margin.left - margin.right,
h = height * 0.5
} = {}
) {
const total = d3.sum(data, (d) => d.value);
console.info("total", total);
function groupDataFunc(data) {
const percent = d3.scaleLinear().domain([0, total]).range([0, 100]);
let cumulative = 0;
const _data = data
.map((d) => {
cumulative += d.value;
return {
value: d.value,
name: d.name,
cumulative: cumulative - d.value,
label: d.label,
color: d.color,
percent: percent(d.value)
};
})
.filter((d) => d.value > 0);
return _data;
}
console.log("this is data", data);
const groupData = groupDataFunc(data);
console.info("groupData", groupData);
const svg = DOM.svg(width, height);
const sel = d3.select(svg);
const xScale = d3.scaleLinear().domain([0, total]).range([0, w]);
const join = sel
.selectAll("g")
.data(groupData)
.join("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
join
.append("rect")
.attr("class", "rect-stacked")
.attr("x", (d) => xScale(d.cumulative))
.attr("y", h / 2 - halfBarHeight)
.attr("height", barHeight)
.attr("width", (d) => xScale(d.value))
.style("fill", (d) => d.color)
.attr("selected", "false")
.style("stroke", "black")
.style("stroke-width", 0);
join
.append("path")
.attr(
"d",
d3.line()([
[width / 2 - 10, h / 2 - halfBarHeight - 10],
[width / 2 - 10, h / 2 + halfBarHeight + 10]
])
)
.attr("stroke", "white")
.attr("stroke-width", 3);
join
.append("text")
.text(data[6].name + "s")
.attr("x", w)
.attr("y", 50)
.attr("text-anchor", "end");
join
.append("text")
.text(data[6].value)
.attr("x", w)
.attr("y", 10)
.attr("text-anchor", "end");
join
.append("text")
.text(data[0].value)
.attr("x", 0)
.attr("y", 10)
.attr("text-anchor", "start");
var numberSeats =
data[0].value +
data[1].value +
data[2].value +
data[3].value +
data[4].value +
data[5].value +
data[6].value;
var checkMark1 = createCheckmarkGroup(sel, 87, 50, 0.5, "Democrats");
checkMark1.select(".checkmark").style("fill", "#0571b0");
checkMark1.select(".label").style("fill", "#0571b0");
return svg;
}