Aller au contenu

Composant · Visualisation

LineChart

Stable

Graphique en ligne pour visualiser une série temporelle ou numérique. Axe X ordinal (libellés) ou numérique (échelle linéaire), lissage Bézier optionnel, remplissage d’aire optionnel, tons sémantiques, infobulle au survol et liste de valeurs accessible.

Exemples

Ligne simple

Série hebdomadaire avec axe X ordinal.

Ligne simple

  • Lun: 42
  • Mar: 65
  • Mer: 30
  • Jeu: 85
  • Ven: 55
  • Sam: 20
  • Dim: 15
Voir le code (Svelte)
<div class="chart-wrapper">
  <LineChart
    data={[{"x":"Lun","y":42},{"x":"Mar","y":65},{"x":"Mer","y":30},{"x":"Jeu","y":85},{"x":"Ven","y":55},{"x":"Sam","y":20},{"x":"Dim","y":15}]}
    label="Requêtes par jour"
    width={520}
    height={260}
  />
</div>

Lissage + aire

`smooth` active la courbe Bézier ; `area` remplit sous la ligne.

Lissage + aire

  • Jan: 1.8
  • Fév: 2.4
  • Mar: 2.1
  • Avr: 3.2
  • Mai: 4.6
  • Jui: 4.1
Voir le code (Svelte)
<div class="chart-wrapper">
  <LineChart
    data={[{"x":"Jan","y":1.8},{"x":"Fév","y":2.4},{"x":"Mar","y":2.1},{"x":"Avr","y":3.2},{"x":"Mai","y":4.6},{"x":"Jui","y":4.1}]}
    smooth
    area
    tone="category3"
    label="Coût mensuel (k$)"
    width={520}
    height={260}
  />
</div>

Axe X numérique

Quand tous les `x` sont des nombres, l’axe utilise une échelle linéaire et n’affiche qu’une sélection de graduations.

Axe X numérique

  • 0: 320
  • 4: 290
  • 8: 410
  • 12: 380
  • 16: 510
  • 20: 470
  • 24: 350
Voir le code (Svelte)
<div class="chart-wrapper">
  <LineChart
    data={[{"x":0,"y":320},{"x":4,"y":290},{"x":8,"y":410},{"x":12,"y":380},{"x":16,"y":510},{"x":20,"y":470},{"x":24,"y":350}]}
    tone="category5"
    label="Latence (ms) sur 24 h"
    width={520}
    height={260}
  />
</div>

Annotations

`annotations` superpose des repères exprimés dans l’espace des données : `region` (bande remplie, derrière la série), `line` (repère d’axe), `point`, `label` (texte) et `shape` (polygone). Chaque repère est ajouté à la liste accessible (« Annotation : … »).

Annotations

  • 0: 320
  • 4: 290
  • 8: 410
  • 12: 380
  • 16: 510
  • 20: 470
  • 24: 350
  • Annotation: Hors SLA
  • Annotation: SLA
  • Annotation: Pic
  • Annotation: Creux
Voir le code (Svelte)
<div class="chart-wrapper">
  <LineChart
    data={[{"x":0,"y":320},{"x":4,"y":290},{"x":8,"y":410},{"x":12,"y":380},{"x":16,"y":510},{"x":20,"y":470},{"x":24,"y":350}]}
    tone="category1"
    label="Latence (ms) annotée"
    width={520}
    height={260}
    annotations={[{"kind":"region","axis":"y","from":450,"to":520,"label":"Hors SLA"},{"kind":"line","axis":"y","value":450,"label":"SLA"},{"kind":"point","x":16,"y":510,"label":"Pic"},{"kind":"label","x":4,"y":290,"text":"Creux","anchor":"middle"}]}
  />
</div>

Curseur synchronisé (contrôlé)

`hoverKey` (la clé d’un point = `String(x)`) pilote le curseur (ligne verticale pointillée + marqueur) et l’infobulle depuis le parent : ici `hoverKey="Mer"`. Le parent partage ainsi un même canal de survol entre plusieurs graphiques alignés. `onHoverKeyChange(key | null)` est émis à chaque survol/sortie, même en mode contrôlé. Sans `hoverKey` (`undefined`), le survol interne reprend la main (rétro-compatible).

Curseur synchronisé (contrôlé)

  • Lun: 42
  • Mar: 65
  • Mer: 30
  • Jeu: 85
  • Ven: 55
  • Sam: 20
  • Dim: 15
Voir le code (Svelte)
<div class="chart-wrapper">
  <LineChart
    data={[{"x":"Lun","y":42},{"x":"Mar","y":65},{"x":"Mer","y":30},{"x":"Jeu","y":85},{"x":"Ven","y":55},{"x":"Sam","y":20},{"x":"Dim","y":15}]}
    tone="category2"
    label="Requêtes (curseur contrôlé)"
    width={520}
    height={260}
    hoverKey="Mer"
  />
</div>

API

PropTypeDefault
dataLineChartDatum[][]
labelstringrequis
toneLineChartTone"category1"
smoothbooleanfalse
areabooleanfalse
domain[number, number]auto
scale"linear" | "log""linear"
invertAxisbooleanfalse
referenceLinesChartReferenceLine[]aucune
bandsChartBand[]aucune
goalLineChartGoalLineaucune
trendbooleanfalse
annotationsChartAnnotation[]aucune
hoverKeystring | nullnon contrôlé
onHoverKeyChange(key: string | null) => void–
data[].forecastbooleanfalse
showLegendbooleanfalse
widthnumber480
heightnumber240
classstringoptionnel

LineChartDatum = { x: number | string; y: number; forecast?: boolean } · LineChartTone = "category1" | … | "category8". Si tous les `x` sont numériques, l’axe X devient linéaire ; sinon il est ordinal (réparti uniformément).

Les overlays sont ajoutés à la liste accessible : lignes de référence, bandes, ligne d’objectif et tendance linéaire.

Chaque point peut porter `forecast: true` : il est alors rendu en prévision : segment(s) pointillé(s) avec le ton prévision dédié, y compris le segment entre le dernier point réel et le premier point de prévision (transition continue). Les valeurs concernées sont annoncées « … (prévision) » dans la liste accessible. Sans point en prévision, le rendu est inchangé.

Notes d’usage

`label` est obligatoire : il alimente l’`aria-label` du conteneur (`role="img"`). Les couples `x : y` sont exposés dans une liste accessible hors SVG, sans multiplier les arrêts de tabulation.

L’axe Y est rembourré (~8 %) autour des valeurs et utilise des graduations « nice » ; le domaine ne force pas le zéro.

`width`/`height` définissent le `viewBox` ; le SVG est mis à l’échelle de façon responsive (`preserveAspectRatio`) à 100 % de la largeur du conteneur.

Tokens utilisés

  • --st-semantic-data-category1 … --st-semantic-data-category8
  • --st-component-lineChart-gridStroke
  • --st-component-lineChart-axisStroke
  • --st-component-lineChart-labelColor
  • --st-component-lineChart-forecastStroke
  • --st-component-lineChart-tooltipBackground
  • --st-component-lineChart-tooltipText
  • --st-semantic-border-subtle
  • --st-semantic-border-interactive
  • --st-semantic-text-secondary
  • --st-semantic-surface-default
  • --st-semantic-surface-inverse
  • --st-semantic-text-inverse
  • --st-radius-sm