chart = {
const svg = d3
.create("svg")
.attr("viewBox", [0, 0, width, height])
.style("max-width", "100%")
.style("height", "auto");
const triangle = svg
.append("path")
.attr(
"d",
`M${margin.left},${margin.top} L${width / 1.8},${margin.top}
L${margin.left},${height / 2} Z`
)
.attr("fill", "#8DC460")
.attr("opacity", 0.25);
svg
.append("rect")
.attr("x", margin.left)
.attr("y", margin.top)
.attr("width", width - margin.left - margin.right)
.attr("height", height - margin.top - margin.bottom)
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1);
svg
.append("g")
.attr("transform", `translate(0,${height - margin.bottom})`)
.call(xAxis);
svg.append("g").attr("transform", `translate(${margin.left},0)`).call(yAxis);
const points = svg
.append("g")
.selectAll("g")
.data(sortedData)
.join("g")
.attr(
"transform",
(d) => `translate(${xScale(d.parameters)},${yScale(d.performance)})`
);
points
.append("circle")
.attr("r", 5)
.attr("fill", (d) => colorScale(d.category));
points
.append("text")
.text((d) => d.name.split("/")[1])
.attr("y", (d) => `${dodges[d.name][1]}px`)
.attr("x", (d) => `${dodges[d.name][0]}px`)
.attr("text-anchor", "middle")
.attr("text-align", "center")
.attr("font-family", "sans-serif")
.attr("font-size", "8px")
.attr("fill", "black");
const legend = svg
.append("g")
.attr(
"transform",
`translate(${width - margin.right - 150}, ${height - margin.bottom - 60})`
);
legend
.append("rect")
.attr("width", 140)
.attr("height", 54)
.attr("fill", "white")
.attr("opacity", 0.8);
legend
.append("rect")
.attr("x", 0)
.attr("y", 28)
.attr("width", 14)
.attr("height", 14)
.attr("fill", "#8DC460")
.attr("opacity", 0.5);
legend
.append("text")
.attr("x", 20)
.attr("y", 36)
.text("Best perf./cost ratio")
.style("font-size", "12px")
.attr("alignment-baseline", "middle");
svg
.append("text")
.attr("x", width / 2)
.attr("y", margin.top / 2)
.attr("text-anchor", "middle")
.attr("font-size", "16px")
.attr("font-weight", "bold")
.text("MTEB Arena Performance (Elo) vs. Parameters");
return svg.node();
}