|
import * as Plot from "npm:@observablehq/plot"; |
|
|
|
export function languageChart( |
|
languageData, |
|
{ width, height, scoreKey, scoreName } = {} |
|
) { |
|
|
|
const formatScore = (score) => |
|
score > 0 ? score.toFixed(2) : "No benchmark available!"; |
|
const formatTitle = (d) => |
|
d.language_name + |
|
"\n" + |
|
parseInt(d.speakers / 1_000_00) / 10 + |
|
"M speakers\n" + |
|
scoreName + |
|
": " + |
|
formatScore(d[scoreKey]); |
|
|
|
return Plot.plot({ |
|
width: width, |
|
height: height, |
|
marginBottom: 100, |
|
x: { label: "Number of speakers", axis: null }, |
|
y: { label: `${scoreName} (average across models)` }, |
|
|
|
marks: [ |
|
Plot.rectY( |
|
languageData, |
|
Plot.stackX({ |
|
x: "speakers", |
|
order: scoreKey, |
|
reverse: true, |
|
y2: scoreKey, |
|
title: formatTitle, |
|
tip: true, |
|
fill: (d) => (d[scoreKey] > 0 ? "black" : "pink"), |
|
}) |
|
), |
|
Plot.rectY( |
|
languageData, |
|
Plot.pointerX( |
|
Plot.stackX({ |
|
x: "speakers", |
|
order: scoreKey, |
|
reverse: true, |
|
y2: scoreKey, |
|
fill: "grey", |
|
}) |
|
) |
|
), |
|
Plot.text( |
|
languageData, |
|
Plot.stackX({ |
|
x: "speakers", |
|
y2: scoreKey, |
|
order: scoreKey, |
|
reverse: true, |
|
text: "language_name", |
|
frameAnchor: "bottom", |
|
textAnchor: "end", |
|
dy: 10, |
|
rotate: 270, |
|
opacity: (d) => (d.speakers > 50_000_000 ? 1 : 0), |
|
}) |
|
), |
|
], |
|
}); |
|
} |
|
|