Graphique en ruban
Composition
Qui progresse et qui recule ? Quand les parts de marché, la répartition budgétaire ou les résultats d'un vote se redistribuent d'une période à l'autre, les rubans reliant chaque colonne vous permettent de suivre une seule catégorie tandis qu'elle gonfle, se réduit, et échange sa place avec ses rivales.
Le graphique ci-dessus utilise le même moteur dans chaque framework - seul le code d'intégration ci-dessous diffère.
Quand le choisir
- Parts de marché, répartitions budgétaires, classements. Quand les catégories échangent leur place d'une période à l'autre, les rubans font de « qui a dépassé qui, et quand » la première chose que les lecteurs voient.
- Présenter des redistributions à un public professionnel. Chaque catégorie garde sa couleur pendant qu'elle gonfle, se réduit et change de rang, pour que l'œil suive un même concurrent tout au long de l'histoire.
- Si aucun rang ne change jamais, les rubans restent parallèles et un graphique en aires raconte la même histoire de parts avec moins d'encre.
Données volumineuses sur WebGPU Expérimental
RibbonChart possède un renderer="webgpu" optionnel qui dessine ses rubans sur le GPU tandis que les axes, les libellés et les infobulles restent sur la couche SVG. Il est conditionné aux capacités du navigateur : sur un navigateur sans WebGPU, il bascule automatiquement sur canvas, et getContext().renderer indique lequel a effectivement dessiné.
Animation de révélation
Le graphique se dessine de gauche à droite au montage, révélant ses éléments dans l'ordre avant de se stabiliser. Désactivé par défaut - un graphique l'active avec la prop progressiveDraw.
Chaque ligne grandit de la première à la dernière année ; l'étiquette suit la pointe puis se pose à l'extrémité de la ligne. Avec reduced motion activé, le graphique s'affiche entièrement tracé, instantanément.
progressiveDraw: true applique les réglages par défaut (1200 ms, easeInOutCubic). Un objet de configuration affine le comportement :
const ref = useRef<RibbonChartHandle>(null);
<RibbonChart
ref={ref}
{...props}
progressiveDraw={{ durationMs: 2000 }}
/>;
// ref.current?.replay() rejoue l'animation à la demande<RibbonChart :options="{ ...props, progressiveDraw: { durationMs: 2000 } }" /><div use:ribbonChart={{ ...props, progressiveDraw: { durationMs: 2000 } }}></div>applyRibbonChartProps(this.c.nativeElement, {
...props,
progressiveDraw: { durationMs: 2000 },
});<michi-vz-ribbon-chart id="c"></michi-vz-ribbon-chart>
<script>
const el = document.getElementById("c");
el.progressiveDraw = { durationMs: 2000 };
// el.replay() rejoue l'animation
</script>durationMseteasing("linear", "easeOutQuad", "easeInOutCubic", ou une fonction(t) => tpersonnalisée) façonnent le rythme du tracé.autoplay: falserend le graphique entièrement tracé ; appelezreplay()(handle de ref React, méthode du web component ou instance core) pour lancer l'animation à la demande.replayOnUpdate: truela rejoue à chaque changement de données.- Respecte
prefers-reduced-motion: le graphique s'affiche alors entièrement tracé, instantanément.
Faire defiler les annees
Les données couvrent déjà plusieurs années, il n'y a donc rien à taguer. Activez timeline : le bouton lecture et le curseur propres au graphique parcourent ces années - à chaque étape, les rubans ne se dessinent que jusqu'à l'année active, et la lecture les prolonge en douceur au fil de l'avancée. Reculez le curseur et les rubans se rétractent en conséquence. Le survol n'inspecte jamais que ce qui est réellement tracé. Désactivé par défaut - sans opt-in, rien ne change.
Appuyez sur le bouton lecture sous le graphique : le graphique se dessine plus loin jusqu'à chaque année au fil de la lecture. Faites glisser le curseur pour sauter à une année.
const ref = useRef<RibbonChartHandle>(null);
<RibbonChart ref={ref} {...props} timeline={{ speedMs: 1000, loop: true }} />;
// ref.current?.timeline() -> play() / pause() / seek(year) / stepForward()<RibbonChart :options="{ ...props, timeline: { speedMs: 1000, loop: true } }" /><div use:ribbonChart={{ ...props, timeline: { speedMs: 1000, loop: true } }}></div>applyRibbonChartProps(this.c.nativeElement, { ...props, timeline: { speedMs: 1000, loop: true } });<michi-vz-ribbon-chart id="c"></michi-vz-ribbon-chart>
<script>
const el = document.getElementById("c");
el.timeline = { speedMs: 1000, loop: true };
// el.getTimeline() -> play() / pause() / seek(year)
</script>speedMsrègle le rythme,loopreboucle,autoplay: truedémarre au montage,showControl: falsemasque la barre intégrée.- Le contrôleur headless reste disponible :
chart.timeline()exposeplay() / pause() / toggle() / seek(period) / stepForward() / stepBack(), plusonStepetformatPerioddans la config pour une UI maison. - Les valeurs glissent entre les années par défaut (
interpolate) ; passezinterpolate: falsepour des coupes nettes. Avec reduced motion, la coupe est toujours nette. timelinel'emporte surprogressiveDrawquand les deux sont définis sur le même graphique.
Utilisation
import { RibbonChart } from "@michi-vz/react";
export default () => <RibbonChart {...props} />; // props = the chart options<script setup>
import { RibbonChart } from "@michi-vz/vue";
</script>
<template>
<RibbonChart :options="props" />
</template><script>
import { ribbonChart } from "@michi-vz/svelte";
</script>
<div use:ribbonChart={props}></div>// main.ts - register the elements once
import "@michi-vz/angular";
import { applyRibbonChartProps } from "@michi-vz/angular";
// component (uses CUSTOM_ELEMENTS_SCHEMA)
// template: <michi-vz-ribbon-chart #c></michi-vz-ribbon-chart>
applyRibbonChartProps(this.c.nativeElement, props);<script type="module" src="https://cdn.jsdelivr.net/npm/@michi-vz/wc/dist/michi-vz-wc.bundle.js"></script>
<michi-vz-ribbon-chart id="c"></michi-vz-ribbon-chart>
<script>
Object.assign(document.getElementById("c"), props); // dataSet/series, title, …
</script>import { mountRibbonChart } from "@michi-vz/core";
const chart = mountRibbonChart(el, props);
chart.update(next);
chart.getContext(); // renderer-agnostic, LLM-ready
chart.destroy();API
Les props sont typées comme RibbonChartProps dans @michi-vz/core. Communes à tous les graphiques : width, height, margin, colors / colorsMapping, renderer ("svg", "canvas", ou "webgpu" expérimental), highlightItems, disabledItems, et les callbacks on*. onChartDataProcessed / getContext() renvoient le ChartContext indépendant du moteur de rendu.
