Barres doubles (Tornado)
Comparaison
Quel côté l'emporte, et de combien ? Ancrez deux valeurs opposées à une ligne centrale partagée et le déséquilibre se lit d'un coup d'œil - gauche vs droite, hommes vs femmes, avant vs après. La classique pyramide des âges et le diagramme en tornade, où la barre la plus longue est l'histoire.
- Hommes (droite, plein)
- Femmes (gauche, pâle)
Le graphique ci-dessus est le même moteur dans chaque framework - seul le code d'intégration ci-dessous diffère.
Quand le choisir
- Quand l'asymétrie est l'histoire. Pyramides des âges, importations contre exportations, promoteurs contre détracteurs : deux grandeurs opposées sur une même ligne centrale, et le côté déséquilibré parle en premier.
- Documents de synthèse pour dirigeants. La barre la plus longue et le côté le plus lourd communiquent avant même qu'un seul chiffre soit lu - idéal quand le public a dix secondes.
- Si les deux valeurs ne s'opposent pas (cette année contre l'an dernier, cible contre réel), gardez les deux du même côté de zéro avec une barre comparable.
Données volumineuses sur WebGPU Expérimental
DualHorizontalBarChart dispose d'un renderer="webgpu" optionnel qui peint les barres value1/value2 sur le GPU tandis que les axes, étiquettes et infobulles restent sur la couche SVG. C'est conditionné par les capacités du navigateur : sur un navigateur sans WebGPU, il rétrograde automatiquement vers canvas, et getContext().renderer indique lequel a effectivement peint.
Faire defiler les annees
Donnez un date à chaque ligne et activez timeline : le diagramme en tornade devient un récit année par année, avec son propre bouton lecture et son curseur, un instantané de l'équilibre gauche/droite à la fois. Désactivé par défaut - sans opt-in, rien ne change.
Appuyez sur le bouton lecture sous le graphique : les données défilent année après année, un instantané à la fois. Faites glisser le curseur pour sauter à une année.
const ref = useRef<DualHorizontalBarChartHandle>(null);
<DualHorizontalBarChart ref={ref} {...props} timeline={{ speedMs: 1000, loop: true }} />;
// ref.current?.timeline() -> play() / pause() / seek(year) / stepForward()<DualHorizontalBarChart :options="{ ...props, timeline: { speedMs: 1000, loop: true } }" /><div use:dualHorizontalBarChart={{ ...props, timeline: { speedMs: 1000, loop: true } }}></div>applyDualHorizontalBarChartProps(this.c.nativeElement, { ...props, timeline: { speedMs: 1000, loop: true } });<michi-vz-dual-horizontal-bar-chart id="c"></michi-vz-dual-horizontal-bar-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.- Les valeurs glissent d'une période à l'autre par défaut (
interpolate) ; ajustez le mouvement avectweenMseteasing, ou passezinterpolate: falsepour des coupes nettes. Avec reduced motion, la coupe est toujours nette. - Le contrôleur headless reste disponible :
chart.timeline()exposeplay() / pause() / toggle() / seek(period) / stepForward() / stepBack(), plusonStepetformatPerioddans la config pour une UI maison. - Un
filter(top-N, tri) s'applique toujours à l'intérieur de chaque période : un « top 5 par an » fonctionne d'emblée. - Les lignes sans
daterestent visibles à chaque période.
Usage
import { DualHorizontalBarChart } from "@michi-vz/react";
export default () => <DualHorizontalBarChart {...props} />; // props = the chart options<script setup>
import { DualHorizontalBarChart } from "@michi-vz/vue";
</script>
<template>
<DualHorizontalBarChart :options="props" />
</template><script>
import { dualHorizontalBarChart } from "@michi-vz/svelte";
</script>
<div use:dualHorizontalBarChart={props}></div>// main.ts - register the elements once
import "@michi-vz/angular";
import { applyDualHorizontalBarChartProps } from "@michi-vz/angular";
// component (uses CUSTOM_ELEMENTS_SCHEMA)
// template: <michi-vz-dual-horizontal-bar-chart #c></michi-vz-dual-horizontal-bar-chart>
applyDualHorizontalBarChartProps(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-dual-horizontal-bar-chart id="c"></michi-vz-dual-horizontal-bar-chart>
<script>
Object.assign(document.getElementById("c"), props); // dataSet/series, title, …
</script>import { mountDualHorizontalBarChart } from "@michi-vz/core";
const chart = mountDualHorizontalBarChart(el, props);
chart.update(next);
chart.getContext(); // renderer-agnostic, LLM-ready
chart.destroy();API
Les props sont typées comme DualHorizontalBarChartProps dans @michi-vz/core. Communes à tous les graphiques : width, height, margin, colors / colorsMapping, renderer ("svg", "canvas", ou expérimentalement "webgpu"), highlightItems, disabledItems, et les callbacks on*. onChartDataProcessed / getContext() renvoient le ChartContext agnostique du moteur de rendu.
