chart = {
const svg = d3
.create("svg")
.style("background", baseColor)
.style("border", "5px solid #630000")
.attr("viewBox", [0, 0, dimensions.width, dimensions.height]);
const world = svg.append("g").call(baseMap).attr("opacity", 1);
const borders = svg.append("g").call(borderLines).attr("opacity", 1);
const X = d3.map(DataYear, (d) => d.xx);
const Y = d3.map(DataYear, (d) => d.yy);
const T = d3.map(DataYear, (d) => d.year);
const I = d3.range(X.length);
const line = d3
.line()
.x((i) => X[i])
.y((i) => Y[i]);
const timeLine = svg
.append("path")
.attr("stroke", lineColor)
.attr("stroke-width", 2)
.attr("opacity", 0)
.attr("stroke-linecap", "round")
.attr("d", line(I));
const dot = svg
.selectAll("circle")
.data(DataYear)
.join("circle")
.attr("r", 4)
.attr("fill", lineColor)
.attr("transform", (d) => `translate(${d.xx}, ${d.yy})`)
.attr("opacity", 0);
const Yearlabel = svg
.selectAll("text")
.data(DataYear)
.join("text")
.attr("opacity", 0)
.attr("text-anchor", "middle")
.attr("text-indent", 10)
.attr("alignment-baseline", "middle")
.attr("stroke", baseColor)
.attr("fill", lineColor)
.attr("paint-order", "stroke")
.attr("stroke-width", 2)
.text((d) => d.year);
d3.forceSimulation(data)
.force(
"x",
d3.forceX((d) => yearScale(d.year))
)
.force("y", d3.forceY(dimensions.height / 2).strength(0.001))
.force(
"collide",
d3
.forceCollide()
.radius((d) => (d3.max([d.width, d.height]) / 2) * 1.8)
.strength(0.6)
)
.stop()
.tick(500);
d3.select("#start").on("click", function () {
world.transition().duration(2000).attr("opacity", 0);
borders.transition().duration(2000).attr("opacity", 0);
timeLine.transition().duration(2000).attr("opacity", 1);
dot
.transition()
.delay(1000)
.transition()
.delay((d, i) => i * 200)
.duration(1000)
.attr("opacity", 1);
Yearlabel.transition()
.delay(1000)
.transition()
.delay((d, i) => i * 200)
.duration(1000)
.attr("opacity", 1);
d3.select("#spread").on("click", function () {
paintings
.transition()
.duration(2000)
.delay((d, i) => i * 5)
.ease(d3.easeSinOut)
.attr("y", (d) => d.y - d.height / 2)
.attr("x", (d) => d.x - d.width / 2);
});
d3.select("#finish").on("click", function () {
paintings
.transition()
.duration(2000)
.delay((d, i) => i * 5)
.ease(d3.easeBackIn.overshoot(3))
.attr("y", (d) => dimensions.height / 2 - d.width / 2)
.attr("x", (d) => d.x - d.width / 2);
timeLine.transition().duration(2000).attr("opacity", 0);
dot.transition().duration(2000).attr("opacity", 0);
Yearlabel.transition().duration(2000).attr("opacity", 0);
});
return svg.node();
}