cantonChart = {
const svg = d3.select(DOM.svg(width, height * 3.5));
const radiusScale = d3.scaleLinear([0, 70], [0, 10]);
const angleStep = (i) => {
return ((i * 0.05) / Math.sqrt(i)) * 30;
};
const cantons = Array.from(new Set(cantonsDf.map((d) => d.canton)));
const colNumber = 5;
const centers = Object.fromEntries(
cantons.map((c, i) => {
const row = Math.floor(i / colNumber);
const col = i % colNumber;
return [c, [row, col]];
})
);
const colScale = d3.scaleLinear([0, colNumber], [100, 1200]);
const rowScale = d3.scaleLinear([0, 5], [200, 1200]);
for (let canton of cantons) {
const g = svg
.append("g")
.attr(
"transform",
`translate(${colScale(centers[canton][1])}, ${rowScale(
centers[canton][0]
)})`
);
g.selectAll("circle")
.data(
cantonsDf.filter((d) => d.canton === canton),
(x) => x.id
)
.enter()
.append("circle")
.attr("cx", (d, i) => Math.cos(angleStep(i)) * radiusScale(i))
.attr("cy", (d, i) => Math.sin(angleStep(i)) * radiusScale(i))
.attr("fill", (x) => (x.ja > x.nein ? "green" : "red"))
.attr("fill-opacity", 0.5)
.attr("r", 2);
g.selectAll("text")
.data(overview, (x) => x.id)
.enter()
.append("text")
.text(canton)
.attr("x", -50)
.attr("font-family", "sans-serif")
.attr("y", -100);
}
return svg.node();
}