informatique:javascript:chartjs
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| informatique:javascript:chartjs [15/05/2026 14:04] – créée cyrille | informatique:javascript:chartjs [15/05/2026 14:12] (Version actuelle) – cyrille | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Chart.js ====== | ====== Chart.js ====== | ||
| + | |||
| + | Simple yet flexible JavaScript charting for designers & developers. | ||
| * https:// | * https:// | ||
| * https:// | * https:// | ||
| + | |||
| + | ===== Plugins ===== | ||
| + | |||
| + | ==== AlignZero ==== | ||
| + | |||
| + | Aligner les zéros des axes Y. | ||
| + | |||
| + | <code javascript> | ||
| + | |||
| + | /** | ||
| + | * Plugin pour aligner les zéros des axes Y multiples dans un graphique Chart.js. | ||
| + | * Ce plugin ajuste dynamiquement les échelles des axes Y pour que leurs zéros soient alignés, | ||
| + | * améliorant ainsi la lisibilité des graphiques avec plusieurs axes Y. | ||
| + | * | ||
| + | * Fonctionnement : | ||
| + | * 1. Calcule le ratio de zéro pour chaque axe Y (proportion de l'axe en dessous de zéro) | ||
| + | * 2. Détermine le ratio dominant parmi tous les axes | ||
| + | * 3. Ajuste les échelles des autres axes pour qu'ils utilisent le même ratio dominant | ||
| + | * 4. Met à jour le graphique pour appliquer les nouvelles échelles | ||
| + | * | ||
| + | * Le plugin s' | ||
| + | * et évite les boucles infinies en utilisant un drapeau _alignZeroRunning. | ||
| + | */ | ||
| + | const alignZeroPlugin = { | ||
| + | id: ' | ||
| + | _alignZeroRunning: | ||
| + | |||
| + | afterLayout(chart) { | ||
| + | |||
| + | if (this._alignZeroRunning) | ||
| + | return; | ||
| + | this._alignZeroRunning = true; | ||
| + | |||
| + | const yAxes = Object.values(chart.scales).filter(s => s.axis === ' | ||
| + | if (yAxes.length < 2) return; | ||
| + | |||
| + | const getZeroRatio = (min, max) => { | ||
| + | if (min >= 0) return 0; | ||
| + | if (max <= 0) return 1; | ||
| + | return Math.abs(min) / (Math.abs(min) + Math.abs(max)); | ||
| + | }; | ||
| + | |||
| + | const ratios = yAxes.map(ax => getZeroRatio(ax.min, | ||
| + | const dominantRatio = Math.max(...ratios); | ||
| + | |||
| + | if (dominantRatio === 0 || dominantRatio === 1) | ||
| + | return; | ||
| + | |||
| + | yAxes.forEach((ax, | ||
| + | if (getZeroRatio(ax.min, | ||
| + | const absMax = Math.max(Math.abs(ax.min), | ||
| + | const newMin = Math.round(-absMax * (dominantRatio / (1 - dominantRatio))); | ||
| + | const newMax = Math.round(absMax * ((1 - dominantRatio) / dominantRatio)); | ||
| + | |||
| + | // Écriture dans les options pour que Chart.js en tienne compte | ||
| + | const scaleId = ax.id; | ||
| + | chart.options.scales[scaleId].min = ax.min < 0 ? ax.min : newMin; | ||
| + | chart.options.scales[scaleId].max = ax.max > 0 ? ax.max : newMax; | ||
| + | } | ||
| + | }); | ||
| + | |||
| + | // Forcer le recalcul des scales avec les nouvelles options | ||
| + | chart.update(' | ||
| + | this._alignZeroRunning = false; | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Crosshair ==== | ||
| + | |||
| + | Ligne de viseur (crosshair) sur toute la hauteur de l'axe Y. | ||
| + | |||
| + | <code javascript> | ||
| + | |||
| + | /** | ||
| + | * Plugin pour afficher une ligne de viseur (crosshair) verticale sur le graphique. | ||
| + | * Ce plugin permet de visualiser plus facilement les valeurs des données en traçant | ||
| + | * une ligne verticale qui suit le mouvement de la souris. | ||
| + | * | ||
| + | * Fonctionnement : | ||
| + | * 1. Initialise un objet crosshair dans le contexte du graphique pour suivre la position X | ||
| + | * 2. Écoute les événements de la souris (mousemove et mouseout) | ||
| + | * 3. Dessine une ligne verticale à la position actuelle de la souris lors du survol | ||
| + | * 4. Supprime la ligne lorsque la souris quitte la zone du graphique | ||
| + | * | ||
| + | * La ligne de viseur est dessinée avec une opacité réduite pour ne pas masquer les données | ||
| + | * et s' | ||
| + | */ | ||
| + | const crosshairPlugin = { | ||
| + | id: ' | ||
| + | afterInit(chart) { | ||
| + | chart.crosshair = { x: null }; | ||
| + | }, | ||
| + | afterEvent(chart, | ||
| + | if (!chart.crosshair) chart.crosshair = { x: null }; | ||
| + | if (event.type === ' | ||
| + | chart.crosshair.x = event.x; | ||
| + | chart.draw(); | ||
| + | } else if (event.type === ' | ||
| + | chart.crosshair.x = null; | ||
| + | chart.draw(); | ||
| + | } | ||
| + | }, | ||
| + | afterDraw(chart) { | ||
| + | if (!chart.crosshair || chart.crosshair.x == null) return; | ||
| + | const y = chart.scales.y; | ||
| + | if (!y) return; | ||
| + | const ctx = chart.ctx; | ||
| + | ctx.save(); | ||
| + | ctx.beginPath(); | ||
| + | ctx.moveTo(chart.crosshair.x, | ||
| + | ctx.lineTo(chart.crosshair.x, | ||
| + | ctx.lineWidth = 1; | ||
| + | ctx.strokeStyle = ' | ||
| + | ctx.stroke(); | ||
| + | ctx.restore(); | ||
| + | } | ||
| + | }; | ||
| + | </ | ||
informatique/javascript/chartjs.1778846664.txt.gz · Dernière modification : de cyrille
