{
const margin = { top: 30, right: 30, bottom: 200, left: 100 };
const height = 800;
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
const x = d3
.scaleBand()
.range([0, innerWidth])
.domain(dataset.varitySorted)
.padding(0.15);
const y = d3
.scaleBand()
.range([innerHeight, 0])
.domain(dataset.siteSorted)
.padding(0.15);
const colorScaleRelY_ = d3
.scaleLinear()
.range(["white", "#006600"])
.domain([-2, dataset.yieldRelYextent[1]]);
const colorScaleRelY = d3
.scaleSequential(d3.interpolateRdYlGn)
.domain([0, dataset.yieldRelYextent[1]]);
const triangle = (d) => {
let xBase = x(d.variety);
let yBase = y(d.site);
let width = x.bandwidth();
let height = y.bandwidth();
if (d.year === "1931") {
return `M ${xBase} ${yBase}
L ${xBase} ${yBase + height}
L ${xBase + width} ${yBase}
Z`;
} else {
return `M ${xBase} ${yBase + height}
L ${xBase + width} ${yBase}
L ${xBase + width} ${yBase + height}
Z`;
}
};
let svg = d3.create("svg").attr("width", width).attr("height", height);
svg
.append("g")
.attr("id", "legend")
.call(
colorLegend(
colorScaleRelY,
dataset.averages.get("1931"),
"Bushels Per Acre 1931"
)
)
.call(transform(margin.left, margin.top + innerHeight + 120));
svg
.append("g")
.attr("id", "legend")
.call(
colorLegend(
colorScaleRelY,
dataset.averages.get("1932"),
"Bushels Per Acre 1932"
)
)
.call(transform(margin.left, margin.top + innerHeight + 50));
svg
.append("g")
.attr(
"transform",
"translate(" + margin.left + "," + (height - margin.bottom) + ")"
)
.call(d3.axisBottom(x));
svg
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
.call(d3.axisLeft(y));
let rsvg = svg
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
rsvg
.selectAll("path")
.data(dataset.values)
.join("path")
.attr("d", (d) => triangle(d))
.style("fill", (d) => colorScaleRelY(d.yieldRelY));
rsvg
.selectAll("rect")
.data(dataset.valuesAggregated)
.join("rect")
.attr("x", (d) => x(d.variety))
.attr("y", (d) => y(d.site))
.attr("width", x.bandwidth())
.attr("height", y.bandwidth())
.attr("fill", "none")
.attr("stroke", (d) => colorScaleRelY(d.yieldRelY))
.attr("stroke-width", 12);
let overlayLegendG = svg.append("g").attr("id", "overlay-legend-markers");
overlayLegendG.call(transform(margin.left, margin.top));
overlayLegendG
.append("text")
.attr("x", x(dataset.varitySorted[dataset.varitySorted.length - 1]))
.attr("y", y(dataset.siteSorted[dataset.siteSorted.length - 1]) + 2)
.attr("font-family", "sans-serif")
.attr("font-size", 9)
.attr("fill", "#fff")
.text("Average");
overlayLegendG
.append("text")
.attr(
"x",
x(dataset.varitySorted[dataset.varitySorted.length - 1]) +
x.bandwidth() / 2
)
.attr(
"y",
y(dataset.siteSorted[dataset.siteSorted.length - 1]) + y.bandwidth() - 8
)
.attr("font-family", "sans-serif")
.attr("font-size", 9)
.attr("fill", "#fff")
.text("1931")
.attr("transform", (d) => {
var xRotate = x(dataset.varitySorted[dataset.varitySorted.length - 1]);
var yRotate =
y(dataset.siteSorted[dataset.siteSorted.length - 1]) + y.bandwidth();
return "rotate(-45," + xRotate + "," + yRotate + ")";
});
overlayLegendG
.append("text")
.attr(
"x",
x(dataset.varitySorted[dataset.varitySorted.length - 1]) +
x.bandwidth() / 2
)
.attr(
"y",
y(dataset.siteSorted[dataset.siteSorted.length - 1]) + y.bandwidth() + 8
)
.attr("font-family", "sans-serif")
.attr("font-size", 9)
.attr("fill", "#fff")
.text("1932")
.attr("transform", (d) => {
var xRotate = x(dataset.varitySorted[dataset.varitySorted.length - 1]);
var yRotate =
y(dataset.siteSorted[dataset.siteSorted.length - 1]) + y.bandwidth();
return "rotate(-45," + xRotate + "," + yRotate + ")";
});
return svg.node();
}