{
const div = d3.create("div");
const plotDiv = div.append("div");
const domain0 = d3.extent(Plot.valueof(data, "date"), (d) =>
d3.utcYear.offset(d, 2000 - d.getUTCFullYear())
);
const plot = (xDomain) =>
Plot.plot({
x: {
transform: (d) => d3.utcYear.offset(d, 2000 - d.getUTCFullYear()),
line: true,
domain: xDomain,
clamp: true
},
y: { nice: true, grid: true, label: "↑ ice extent" },
marks: [
Plot.dot(data, {
x: "date",
y: "extent",
title: ({ date }) => date.getUTCFullYear(),
fill: ({ date }) => date.getUTCFullYear(),
r: 0.75
})
]
});
function insertPlot(xDomain) {
const chart = plot(xDomain);
plotDiv.html("").append(() => chart);
return chart.scale("x");
}
const xScale = insertPlot();
const l = d3.scaleUtc();
function scaledDomain({ k, x }) {
l.domain(xScale.domain).range(xScale.range);
return [
l.invert((xScale.range[0] - x) / k),
l.invert((xScale.range[1] - x) / k)
];
}
const zoom = d3
.zoom()
.on("zoom", ({ transform }) => insertPlot(scaledDomain(transform)));
div.call(zoom);
return div.node();
}