bee2 = {
const svg = d3.select(DOM.svg(chart_param.width, chart_param.height)),
kf = keyframe_beeswarm;
const rescale = (arr,newMin,newMax) => {
let mx = Math.max.apply(Math,arr);
let mn = Math.min.apply(Math,arr);
return arr.map(v => (newMax-newMin)*(v-mn)/(mx-mn)+newMin);
};
const r = 24;
const N = 30;
const nodes = rescale([...Array(N)].map(() => d3.randomNormal(0.5,0.125)()),0,1).map(v => Object.create({x: v, y:y(d3.randomUniform(1)())}));
const xaxis = svg
.append("g")
.attr("Class","X-axis")
.attr("transform",`translate(0,${chart_param.height - chart_param.margin.bottom - chart_param.margin.top})`)
.call(d3.axisBottom(x));
svg
.append("line")
.attr("x1", x(0))
.attr("x2", x(1))
.attr("y1", y(0.5))
.attr("y2", y(0.5))
.style("stroke", "#bbb")
.style("stroke-dasharray", 4);
const sim = d3
.forceSimulation(nodes)
.force("x", d3.forceX(d => x(d.x)).strength(4))
.force("y", d3.forceY(y(0.5)).strength(0.5))
.force(
"collide",
d3.forceCollide().radius(d => (r+1)*1.05).strength(2)
)
.alphaDecay(0.01)
.alpha(0.05);
const circ = svg.selectAll(".circ")
.data(nodes).enter()
.append("circle")
.classed("circ", true)
.attr("cx", d => x(d.x))
.attr("cy", d => d.y)
.attr("r", d => r)
.attr("stroke", "red")
.attr("stroke-width", "3")
.attr("fill","none");
let sigfig = d3.format(".3");
const node = svg.selectAll(".node")
.data(nodes).enter()
.append("text")
.classed("node",true)
.attr("x", d => x(d.x))
.attr("y", d => d.y)
.attr("text-anchor", "middle")
.attr("stroke","red")
.attr("stroke-width", "1px")
.attr("alignment-baseline", "middle")
.attr("font-family","monospace")
.attr("font-size", `${r/2 - 1}px`)
.text(d => sigfig(d.x));
sim.on("tick", () => {
node
.attr("x", d => d.x)
.attr("y", d => d.y);
circ
.attr("cx", d => d.x)
.attr("cy", d => d.y);
});
return svg.node();
}