chart = {
const height = 600;
const svg = d3
.create("svg")
.attr("viewBox", [0, 0, width, height])
.attr("width", width)
.attr("height", height);
const mainGroup = svg.append("g").attr("transform", "translate(0,120)");
const defs = mainGroup.append("defs");
const gradient = defs
.append("linearGradient")
.attr("id", "gradient")
.attr("x1", "0%")
.attr("x2", "100%")
.attr("y1", "0%")
.attr("y2", "0%");
gradient
.append("stop")
.attr("offset", "25%")
.attr("style", "stop-color:blue;stop-opacity:1");
gradient
.append("stop")
.attr("offset", "50%")
.attr("style", "stop-color:white;stop-opacity:1");
gradient
.append("stop")
.attr("offset", "75%")
.attr("style", "stop-color:red;stop-opacity:1");
yearly.forEach((item, index) => {
const year = item[0];
const data = item[1];
const glorified = [];
data.forEach((bin, i) => {
if (i == 0) {
glorified.push({ value: -max, count: 0 });
glorified.push({ value: bin.bin_start, count: 0 });
}
glorified.push({
value: (bin.bin_start + bin.bin_end) / 2,
count: bin.count
});
});
glorified.push({
value: data[data.length - 1].bin_end,
count: 0
});
glorified.push({
value: max,
count: 0
});
const g = mainGroup
.append("g")
.attr("transform", `translate(0,${index * gap})`);
g.append("path")
.attr("fill", "url(#gradient)")
.attr("stroke", "black")
.attr("stroke-opacity", 0.7)
.attr("d", line(glorified));
g.append("text")
.text(year)
.attr("font-size", 11)
.attr("dx", margin.left)
.attr("dy", -4)
.attr("text-anchor", "start");
});
const xAxis = d3
.axisBottom(xHisto)
.tickFormat((d) => (d === 0 ? `${d}°C` : `${d3.format("+.0f")(d)}`));
mainGroup
.append("g")
.attr("transform", `translate(0,${yearly.length * gap - gap})`)
.call(xAxis)
.select(".domain")
.remove();
return svg.node();
}