{
const p = Plot.plot({
y: { nice: true },
marks: [
Plot.barY(
alphabet,
{
x: "letter",
y: "frequency",
fill: "grey",
sort: {x: "y", reverse: true},
inset: -0.5,
}
),
Plot.ruleY([0])
]
});
const rects = p.querySelectorAll('rect');
const onMouseOver = (e) => {
rects.forEach((_r) => {
_r.setAttribute('fill', 'lightgray')
});
e.target.setAttribute('fill', 'red');
};
const onMouseOut = () => {
// On remet la couleur initiale, le gris normal
rects.forEach((_r) => {
_r.setAttribute('fill', 'grey')
})
};
// Un tableau contenant les lettres dans l'ordre où elle apparaissent
const orderedLetters = alphabet.sort((a, b) => b.frequency - a.frequency).map(d => d.letter);
// Pour chaque rectangle, on ajoute son comportement
// au survol de la souris (mouseover),
// lorsque la souris arrête de survoler l'élément
// (mouseout) et lors d'un clic (click)
rects.forEach((r) => {
// On dit que le curseur, sur ces étiquettes est sous la forme 'pointer'
// (main avec l'index, montrant qu'il s'agit généralement d'un élément clicable)
r.style.cursor = 'pointer';
// Comportement mouseover / mouseout
r.addEventListener('mouseover', onMouseOver);
r.addEventListener('mouseout', onMouseOut);
// Comportement lors du clic
r.addEventListener("click", () => {
// On utilise la position du rectangle sur l'axe
// pour trouver la lettre correspondante
const letter = orderedLetters[r.__data__];
// On ouvre la page wikipedia qui correspond,
// dans un nouvel onglet
window.open(
`https://fr.wikipedia.org/wiki/${letter}_(lettre)`
);
});
});
// Ajoutons également un comportement pour le survol des étiquettes de l'axe Y
// On sélectionne d'abords toutes les étiquettes
const labels = p.querySelectorAll('g[aria-label="y-axis tick label"] > text');
// On passe par chaque étiquette
labels.forEach((textElement) => {
// Lors de l'entré du curseur, on grossi le label
textElement.addEventListener("mouseenter", () => {
textElement.style.fontWeight = "bold";
textElement.style.fontSize = 15;
});
// Lors de la sortie du curseur, on rétabli la taille du label
textElement.addEventListener("mouseleave", () => {
textElement.style.fontWeight = "normal";
textElement.style.fontSize = 10;
});
});
// Enfin, on retourne le graphique créé par 'Plot.plot'
return p;
}