chart = {
var time_so_far = 0;
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width+40, height+40]);
svg.append("g")
.attr("transform", "translate(" + 20 + "," + 20 + ")");
d3.select("#chart").style("width", (width + 20 + 20) + "px");
const circle = svg.append("g")
.selectAll("circle")
.data(nodes)
.join("circle")
.attr("cx", d => d.x)
.attr("cy", d => d.y)
.attr("fill", d => d.color);
circle.transition()
.delay((d, i) => i * 5)
.duration(800)
.attrTween("r", d => {
const i = d3.interpolate(0, d.r);
return t => d.r = i(t);
});
svg.selectAll('.grp')
.data(d3.keys(groups))
.join("text")
.attr("class", "grp")
.attr("text-anchor", "middle")
.attr("x", d => groups[d].x)
.attr("y", d => groups[d].y - 70)
.text(d => groups[d].fullname);
svg.selectAll('.grpcnt')
.data(d3.keys(groups))
.join("text")
.attr("class", "grpcnt")
.attr("text-anchor", "middle")
.attr("x", d => groups[d].x)
.attr("y", d => groups[d].y - 50)
.text(d => groups[d].cnt);
const simulation = d3.forceSimulation(nodes)
.force("x", d => d3.forceX(d.x))
.force("y", d => d3.forceY(d.y))
.force("cluster", forceCluster())
.force("collide", forceCollide())
.alpha(.09)
.alphaDecay(0);
simulation.on("tick", () => {
circle
.attr("cx", d => d.x)
.attr("cy", d => d.y)
circle.attr("fill", d => { if (groups[d.group].color == "match") { return d.color }return groups[d.group].color});
});
const textb = svg.append("text").text("").attr("x", 60).attr("y", 100).attr("fill", "black");
let startdate = new Date(2020, 6, 1)
function timer() {
nodes.forEach(function (o, i) {
o.timeleft -= 1;
if (o.timeleft == 0 && o.istage < o.stages.length - 1) {
o.istage += 1;
o.group = o.stages[o.istage].grp;
o.timeleft = o.stages[o.istage].duration;
groups[o.group].cnt += 1;
}
});
time_so_far += 1;
var currdate = new Date(startdate.getTime() + time_so_far * 86400000);
textb.text(currdate.toDateString().split(' ').slice(1).join(' '));
svg.selectAll('.grpcnt').text(d => groups[d].cnt);
if (currdate < new Date(2021, 0, 9)) {
d3.timeout(timer, 250);
}
}
d3.timeout(timer, 15000);
return svg.node()
}