chart_canvas = {
const context = DOM.context2d(width, height);
const canvas = context.canvas;
let simulation = d3
.forceSimulation(dataset)
.force(
"x",
d3
.forceX()
.x((d) => {
return xScale(d.xValues);
})
.strength(0.2)
)
.force("y", d3.forceY(height / 2).strength(0.1))
.force(
"collide",
d3
.forceCollide()
.radius((d) => rScale(d.count) * 1.08)
.strength(0.1)
.iterations(4)
)
.on("tick", render);
function render() {
context.clearRect(0, 0, width, height);
dataset.forEach((d) => {
const halfBlueArcSpan = Math.PI * d.demoncratPercentage;
const halfRedArcSpan = Math.PI * (1 - d.demoncratPercentage);
context.beginPath();
context.arc(
d.x,
d.y,
rScale(d.count),
Math.PI + halfBlueArcSpan,
Math.PI - halfBlueArcSpan,
true
);
context.fillStyle = "#99C0E5";
context.fill();
context.beginPath();
context.arc(
d.x,
d.y,
rScale(d.count),
0 - halfRedArcSpan,
0 + halfRedArcSpan
);
context.fillStyle = "#FDA5A8";
context.fill();
context.beginPath();
context.font = `${Math.max(rScale(d.count) / 2, 8)}px serif`;
context.textAlign = "center";
context.fillStyle = "black";
context.fillText(d.name, d.x, d.y);
context.font = `${Math.max(rScale(d.count) / 4, 8)}px serif`;
context.fillText(
`${format(d.count * d.demoncratPercentage)} - ${format(
d.count * (1 - d.demoncratPercentage)
)}`,
d.x,
d.y + 15
);
});
}
d3.select(canvas).call(drag(simulation));
return canvas;
}