Wrapper qui connecte les graphiques officiels DSFR Chart au systeme dsfr-data-source pour une alimentation dynamique des données.

Ce composant utilise la bibliothèque officielle DSFR Chart tout en beneficiant de la connexion automatique aux sources de données.

Attributs

AttributTypeDescription
sourceStringId de la <dsfr-data-source> (ou d'un transformateur) dont ce graphique consomme les données.
typeDSFRChartTypeType de graphique DSFR
label-fieldStringChemin vers le champ label
value-fieldStringChemin vers le champ valeur. Alias inline champ:Libellé (#668) : value-field="Panier_moyen:Panier moyen" affiche « Panier moyen » dans la légende à la place du nom technique. Un name explicite prime sur l'alias. Un : littéral dans un chemin ou un libellé s'échappe en %3A (escapeColonValue).
empty-labelStringLibellé affiché pour une catégorie vide (null, undefined ou "" dans label-field) : légende du pie, axe X des cartésiens (#647). Sans lui, DSFR Chart substituerait « Série N » à un nom vide. Pour EXCLURE ces lignes plutôt que les nommer, filtrer en amont : where="champ:isnotnull" (query) ou where="champ is not null" (source ODS).
heading-levelNumberNiveau de titre HTML du titre de la DataBox (RGAA 9.1, #670) : entier de 2 à 6, borné (défaut 3, rendu historique de DSFR Chart). heading-level="2" rend un h2.
selected-paletteStringPalette de couleurs
unit-tooltipStringUnité à afficher dans les tooltips
horizontalBooleanAffichage horizontal (bar chart uniquement)
stackedBooleanBarres empilées (bar chart uniquement)
fillBooleanRemplir le graphique (pie chart: true = plein, false = donut)
code-fieldStringChemin vers le champ code (prioritaire sur label-field) : departement/region (map/map-reg), nom d'academie (map-aca), code pays ISO a2/a3/num (map-monde)
map-highlightStringID du département/région à mettre en avant (map chart)
gauge-valueNumberValeur pour la jauge (gauge chart uniquement)
value-field-2StringChemin vers un second champ de valeur (pour bar-line: y-line). Alias inline champ:Libellé accepté (#668).
value-fieldsStringChamps de valeur supplémentaires, séparés par des virgules (ex: 'budget,score'). Alias inline champ:Libellé par série (#668) : value-fields="budget:Budget, score:Score". Un name explicite (tableau JSON) prime sur les alias.
series-fieldStringChamp "clé de série" pour des données au format long/tidy : ses valeurs distinctes deviennent autant de series (mode multi-series sans colonnes multiples). Ex: données {mois, groupe, valeur} avec series-field="groupe" → une série par groupe. S'applique aux types multi-series (bar, line, radar). Prioritaire sur value-fields.
nameStringNom(s) de série. Chaîne simple recommandée (name="Taux"), enveloppée automatiquement pour DSFR Chart ; tableau JSON pour le multi-séries (name='["Réalisé","Objectif"]'). Sur les cartes (map*), un seul nom : le premier élément d'un JSON est retenu (#653). Priorité (#668) : name explicite, sinon l'alias inline champ:Libellé de value-field(s), sinon le nom du champ (ou les valeurs de series-field en mode tidy).
unit-tooltip-barStringUnité pour les barres (bar-line uniquement)
highlight-indexStringIndex des éléments à mettre en avant (ex: "[0, 2]")
x-minStringLimite min de l'axe X (types cartésiens : line, scatter, bar-line).
x-maxStringLimite max de l'axe X (types cartésiens : line, scatter, bar-line).
y-minStringLimite min de l'axe Y. Pour type="radar" : borne min de l'échelle radiale (le centre du radar est fixé à y-min au lieu du minimum des données).
y-maxStringLimite max de l'axe Y. Pour type="radar" : borne max de l'echelle radiale ; si y-min et y-max sont entiers avec une amplitude de 1 a 10, la grille utilise des anneaux entiers (stepSize 1).
reference-linesStringLignes de référence (overlay) au format JSON. Graphiques cartésiens uniquement (line, bar, bar-line, scatter). Chaque item : { axis: "x"|"y", value: string|number, label?, color?, dash?, position? }. axis:"x" → ligne verticale à une catégorie/date ; axis:"y" → ligne horizontale à un seuil. Ex : reference-lines='[{"axis":"x","value":"2026-02", "label":"Lancement","color":"#c9191e","dash":true}]'.
targetsStringCibles / objectifs futurs (overlay) au format JSON. Types line et bar-line uniquement. Chaque item : { x: string|number (échéance, requis), value: number (requis), series?: string|number (nom de dataset ou index, défaut 0), label?: string, color?: string }. L'axe X est étendu automatiquement si l'échéance est au-delà des données (séries paddées avec null : trait plein jusqu'au dernier point réel, trajectoire pointillée vers le losange). Ex : targets='[{"x":2030,"value":26,"label":"Cible 2030 : 26 %"}]'.
targets-zoneStringZone future grisée + frontière pointillée réalisé/projeté. "off" désactive.
targets-legendStringLégende réalisé/projeté sous le graphe : "" = libellés par défaut (« Données historiques » / « Trajectoire, cible extrapolée »), "off" = masquée, '["a","b"]' = libellés personnalisés.
idle-messageStringMessage rendu quand l'amont attend un filtre (require-where, #690). Distinct de « aucune donnée » : aucune requête n'a été faite. Vide, le libellé par défaut est utilisé.

En attente d'un filtre

Sur une page d'exploration, l'amont peut porter require-where (<dsfr-data-source> ou <dsfr-data-query>) et ne rien émettre tant qu'aucun filtre n'est posé. Le graphique rend alors le texte de idle-message (« Choisissez un filtre pour afficher les données » par défaut) plutôt qu'un cadre vide : aucune requête n'a été faite, ce n'est pas un jeu de résultats vide. Le mécanisme est décrit sur dsfr-data-source.

Couleur fixée par modalité

selected-palette attribue les couleurs dans l'ordre des séries : la même modalité change de couleur dès que le filtrage change l'ordre. Quand une modalité porte une convention (le réalisé en bleu, l'objectif en rouge, un parti politique, un niveau d'alerte), color-map la fixe.

AttributTypeDescription
color-mapStringCouleur fixée par modalité (#732) : paires modalité:#couleur séparées par des virgules, même grammaire que dsfr-data-map-layer. Ex : "Réalisé:#000091,Objectif:#E1000F". La modalité est un nom de série (une couleur par courbe ou par barre) ou, à défaut, un libellé de l'axe (une couleur par part de camembert). Les modalités non citées gardent la couleur de la palette. Une virgule ou un deux-points dans une modalité s'écrit %2C ou %3A. Sans effet sur les cartes (map*).
<dsfr-data-chart
  source="budget"
  type="line"
  label-field="mois"
  value-fields="realise,objectif"
  color-map="realise:#000091, objectif:#E1000F">
</dsfr-data-chart>

La modalité est un nom de série pour les courbes et les barres, un libellé de l'axe pour les parts d'un camembert. Les modalités non citées gardent la couleur de la palette : on ne fixe que ce qui doit l'être. Sans effet sur les cartes choroplèthes (type="map" et ses variantes), dont le dégradé est piloté par selected-palette. La même grammaire existe sur dsfr-data-map-layer.

Résumé des cartes

Une carte (type="map" et ses variantes) affiche sous son titre une valeur de synthèse. Par défaut, c'est la moyenne non pondérée des valeurs dessinées : chaque territoire pèse autant, quelle que soit sa taille. Pour un taux, ce n'est pas le taux national. La moyenne des taux de personnels des collèges par département vaut 4,27 %, le taux national 5,6 %. Sur un indicateur homogène, l'écart est faible et passe inaperçu ; sur un indicateur dispersé, il atteint le quart de la valeur, et rien à l'écran ne distingue les deux cas.

AttributTypeDescription
map-summaryStringMODE de synthèse du résumé affiché sous le titre d'une carte (type="map*"), #927 — calculé sur les lignes dessinées, donc suivant les filtres comme le reste de la carte : - sum — la **somme**. La seule synthèse juste d'une carte de VOLUMES : le nombre de licenciés, d'établissements, de logements par territoire. La moyenne d'un volume par territoire ne mesure rien (« 3 074,06 en France » pour 310 480 licences) ; - avg — la moyenne NON pondérée, le calcul historique. Juste pour un indicateur dont les territoires pèsent pareil, faux pour un taux dès qu'ils diffèrent : la Lozère y pèse autant que le Nord ; - weighted — la moyenne pondérée, Σ(valeur × effectif) / Σ(effectif). La synthèse juste d'une carte de TAUX (#763), et exige map-summary-weight ; - none — **aucun résumé**. Le choix honnête quand la carte ne porte pas un indicateur qui se résume en un nombre (un indice, un rang, une catégorie recodée). Ce qui disparaît est le CHIFFRE : l'en-tête « …, en France » appartient à DSFR Chart et reste affiché, sans valeur (vérifié au navigateur le 2026-09-19). **La première question d'une carte thématique est volume ou taux**, et elle décide du mode : un volume s'additionne, un taux se pondère, et l'autre calcul est faux dans les deux sens. Une somme n'a de sens que si les lignes dessinées forment une PARTITION du territoire — chaque unité comptée une fois et une seule. Deux lignes portant le même code géographique sont additionnées toutes les deux alors que la carte n'en dessine qu'une (la dernière) : un avertissement console le signale en mode sum, et il faut alors agréger en amont (dsfr-data-query group-by="dep"). Les lignes écartées faute de code géographique exploitable ne sont dans aucun résumé — le compte de ces lignes est déjà journalisé. **Attribut absent : rien ne change.** Le résumé garde son ordre historique — valeur fournie, sinon moyenne pondérée si map-summary-weight est posé, sinon moyenne non pondérée. Cet attribut n'est qu'une façon de plus de résumer, jamais une redéfinition des chiffres déjà publiés. **Ordre de priorité** : none l'emporte sur tout ; map-summary-value (littéral, #763) l'emporte ensuite sur le mode, avec un avertissement console quand les deux sont posés. Un mode inconnu, ou weighted sans map-summary-weight, est une erreur de configuration et n'affiche AUCUN résumé — jamais un chiffre de repli qui aurait l'air juste. **Ce que le résumé lit** : la colonne value-field, telle qu'elle arrive — donc arrondis d'un dsfr-data-normalize round="…" en amont compris, qui faussent weighted sans se voir (PG-031, #929). L'arrondi au centième que la carte applique pour SE DESSINER, lui, ne compte pas. Pour arrondir l'affichage sans fausser le calcul : map-summary-field.
map-summary-weightStringChamp d'effectif pour un résumé de carte PONDÉRÉ (#763) : Σ(valeur × effectif) / Σ(effectif) sur les lignes dessinées. Pour un taux de personnels par élève, map-summary-weight="nb_eleves" rend le taux national, là où la moyenne des taux départementaux s'en écarte. Les lignes dont l'effectif n'est pas numérique sont écartées du calcul ; si aucune n'en porte, erreur de configuration et pas de résumé. **Sur quoi porte le calcul** : la colonne value-field telle qu'elle arrive. L'arrondi au centième que la carte applique pour SE DESSINER ne compte pas — le résumé repart des lignes source. Mais un dsfr-data-normalize round="champ:1" en amont réécrit la colonne dans la donnée, et la pondération porte alors sur des valeurs arrondies : 4,5331 au lieu de 4,5368 sur 101 départements (PG-031, #929). map-summary-field désigne alors la colonne brute.
map-summary-valueStringValeur du résumé affiché sous le titre des cartes (type="map*"), à la place de la moyenne calculée (#763). Nombre littéral, décimales à la française acceptées (map-summary-value="5,6") : la valeur nationale publiée par ailleurs, qui fait autorité. Prime sur map-summary-weight. Une valeur non numérique est une erreur de configuration, et aucun résumé n'est affiché plutôt qu'un chiffre faux. Sans cet attribut ni map-summary-weight, le résumé est la moyenne NON PONDÉRÉE des valeurs dessinées sur la carte. Pour un taux, ce n'est pas le taux national dès que les territoires ont des tailles différentes : l'écart mesuré atteint le quart de la valeur sur un indicateur dispersé, et reste invisible sur un indicateur homogène.
map-summary-fieldStringColonne sur laquelle le résumé d'une carte est CALCULÉ, quand elle n'est pas celle qu'on affiche (#929). Sans l'attribut le résumé porte sur value-field ; avec, value-field ne sert plus qu'au tracé et à l'infobulle. C'est la réponse au piège de composition d'un arrondi amont : compute="taux_aff = round(taux, 1)", puis value-field="taux_aff" map-summary-field="taux". Vaut pour les trois calculs (sum, avg, weighted), sans effet sous map-summary-value ou map-summary="none". Un champ qu'aucune ligne dessinée ne porte en numérique est une erreur de configuration nommée : aucun résumé, jamais un repli silencieux sur la colonne affichée — qui serait le chiffre faux que l'attribut évite. **Attribut absent : rien ne change.**
<!-- Taux national : moyenne des taux pondérée par l'effectif -->
<dsfr-data-chart
  source="personnels"
  type="map"
  code-field="code_dep"
  value-field="taux_personnels"
  map-summary-weight="nb_eleves">
</dsfr-data-chart>

Choisir l'effectif qui a servi de dénominateur au taux : pondérer un taux par élève par le nombre d'élèves rend exactement le rapport des deux sommes. Quand la valeur nationale est publiée par ailleurs et fait autorité, map-summary-value la reprend telle quelle. Seules les lignes dessinées entrent dans le calcul : une ligne au code géographique invalide ne pèse pas.

map-summary choisit le mode de synthèse, et la première question d'une carte thématique le décide : volume ou taux. Un volume s'additionne (map-summary="sum") — la moyenne d'un nombre de licenciés par département n'est pas un chiffre lisible, et une valeur écrite à la main dans map-summary-value cesse d'être juste au premier filtre. Un taux se pondère (map-summary="weighted"). map-summary="none" retire le chiffre quand l'indicateur ne se résume pas en un nombre — l'en-tête « en France » appartient à DSFR Chart et reste affiché.

<!-- Carte de volumes : le résumé est le total, et il suit les filtres -->
<dsfr-data-chart
  source="licences"
  type="map"
  code-field="code_dep"
  value-field="nb_licences"
  map-summary="sum">
</dsfr-data-chart>

Une somme suppose une partition : chaque territoire compté une fois. Deux lignes portant le même code sont additionnées toutes les deux alors que la carte n'en dessine qu'une — un avertissement console le signale, et il faut agréger en amont (dsfr-data-query group-by="code_dep"). Un mode inconnu, ou weighted sans map-summary-weight, est une erreur de configuration : aucun résumé n'est affiché plutôt qu'un chiffre de repli qui aurait l'air juste.

Le résumé porte sur la colonne value-field telle qu'elle arrive. L'arrondi au centième que la carte applique pour se dessiner ne compte pas — le calcul repart des lignes source. Mais un arrondi posé en amont (dsfr-data-normalize round="champ:1", le réflexe pour une infobulle lisible) réécrit la colonne dans la donnée : la pondération porte alors sur des valeurs arrondies, et le taux national est faux de peu — donc invisible. Mesuré sur les 101 départements d'une fédération sportive : 4,5331 au lieu de 4,5368. map-summary-field désigne la colonne de calcul, distincte de celle qu'on affiche.

<!-- Afficher l'arrondi, calculer sur la valeur brute -->
<dsfr-data-normalize id="n" source="licences"
  compute="lics_pop_aff = round(lics_pop, 1)"></dsfr-data-normalize>
<dsfr-data-chart
  source="n"
  type="map"
  code-field="code_dep"
  value-field="lics_pop_aff"
  map-summary-weight="pop"
  map-summary-field="lics_pop">
</dsfr-data-chart>

Un champ de calcul qu'aucune ligne dessinée ne porte en numérique est une erreur de configuration : aucun résumé n'est affiché, jamais un repli silencieux sur la colonne affichée — qui serait exactement le chiffre faux que l'attribut existe pour éviter.

Attributs DataBox

L'attribut databox active l'habillage DataBox DSFR autour du graphique : cadre editorial avec titre, source, date, switch chart/tableau integre, screenshot PNG, téléchargement CSV, plein écran, tendance.

AttributTypeDescription
databoxBooleanEnvelopper le chart dans une DataBox DSFR native
databox-titleStringTitre affiché dans l'en-tête DataBox
databox-sourceStringMention de la source (ex: "INSEE, 2024")
databox-dateStringDate de la donnée (ex: "Mars 2024"), affichée dans le pied de la DataBox et sur les cartes. Aucune date n'est rendue si l'attribut est absent — plus de repli sur la date du jour, qui n'est pas celle des données (#650). Prime sur databox-date-field quand les deux sont posés.
databox-date-fieldStringFraîcheur lue dans la donnée (#661) : chemin d'une colonne de dates ISO (AAAA-MM-JJ, heure facultative). La plus récente est affichée comme date de la DataBox (et des cartes), formatée JJ/MM/AAAA. Ignoré si databox-date est posé ; aucune date rendue si la colonne ne contient aucune date ISO valide.
databox-downloadBooleanBouton téléchargement CSV dans DataBox
databox-screenshotBooleanBouton screenshot PNG
databox-fullscreenBooleanBouton plein écran
databox-trendStringBadge tendance (ex: "+5.2", "-3.1")
databox-tooltip-titleStringTitre du tooltip info DataBox
databox-tooltip-contentStringContenu du tooltip info DataBox
databox-modal-titleStringTitre de la modale DataBox
databox-modal-contentStringContenu de la modale DataBox
databox-default-sourceStringSource par défaut dans le selecteur multi-source DataBox
databox-actionsStringActions personnalisees DataBox (JSON array, ex: '["Source officielle","Pole emploi"]')

Événements : le composant n'émet pas d'événement custom ; il participe au data-bridge en consommateur (abonnement à la source, états loading/erreur/vide rendus dans le wrapper).

Quand databox est active, dsfr-data-a11y ne doit PAS inclure table ni download (DataBox les fournit deja). Conserver uniquement description sur dsfr-data-a11y.

Types de graphiques

type accepte bar, line, pie, radar, gauge, scatter, bar-line et les quatre cartes choroplèthes map (départements), map-reg (régions), map-aca (académies) et map-monde. Les quatre variantes de carte sont des valeurs de type, pas des composants : elles n'ont pas de page propre et sont documentées dans Graphiques — map-chart, avec les clés géographiques attendues par chacune.

1. Graphique en barres verticales

<dsfr-data-chart
  source="sites"
  type="bar"
  label-field="nom"
  value-field="score_rgaa"
  selected-palette="categorical"
  unit-tooltip="%">
</dsfr-data-chart>

2. Graphique en barres horizontales

<dsfr-data-chart
  source="sites"
  type="bar"
  label-field="ministere"
  value-field="score_rgaa"
  horizontal="true">
</dsfr-data-chart>

3. Graphique en ligne

<dsfr-data-chart
  source="sites"
  type="line"
  label-field="nom"
  value-field="score_dsfr"
  unit-tooltip="%">
</dsfr-data-chart>

3b. Lignes de référence (seuil / repère)

L'attribut reference-lines superpose des repères : ligne horizontale à un seuil (axis:"y") ou verticale à une catégorie (axis:"x"), avec un libellé en pastille. Graphiques cartésiens uniquement (line, bar, bar-line, scatter).

<dsfr-data-chart
  source="sites"
  type="line"
  label-field="nom"
  value-field="score_dsfr"
  reference-lines='[{"axis":"y","value":80,"label":"Objectif","color":"#c9191e"}]'>
</dsfr-data-chart>

3c. Cibles / objectifs futurs (targets)

L'attribut targets représente un objectif lointain : l'axe X est étendu jusqu'à l'échéance, une trajectoire pointillée relie le dernier point réel à un losange, la zone future est grisée et une légende « Données historiques / Trajectoire, cible extrapolée » est ajoutée. Au survol du losange, un tooltip liste les cibles de toutes les séries à cette échéance. Types line et bar-line uniquement — préférer des labels numériques (axe linéaire : l'écart 2025 → 2030 est proportionnel).

<dsfr-data-chart
  source="fossiles"
  type="line"
  label-field="annee"
  value-field="part"
  unit-tooltip=" %"
  targets='[{"x":"2030","value":26,"label":"Cible 2030 : 26 %"}]'>
</dsfr-data-chart>

4. Diagramme circulaire (Pie)

<dsfr-data-chart
  source="sites"
  type="pie"
  label-field="ministere"
  value-field="score_rgaa"
  selected-palette="categorical">
</dsfr-data-chart>

5. Graphique radar

<dsfr-data-chart
  source="sites"
  type="radar"
  label-field="ministere"
  value-field="score_rgaa"
  y-min="0"
  y-max="100">
</dsfr-data-chart>

6. Graphique avec DataBox

<dsfr-data-chart id="chart" source="data" type="bar"
  label-field="ministere" value-field="score_moyen"
  databox
  databox-title="Score RGAA moyen par ministere"
  databox-source="Referentiel RGAA"
  databox-date="2024"
  databox-download
  databox-screenshot>
</dsfr-data-chart>
<!-- Avec DataBox : pas de table ni download sur a11y -->
<dsfr-data-a11y for="chart" source="data"
  description="Ce graphique montre le score RGAA moyen par ministere.">
</dsfr-data-a11y>

Comparaison : dsfr-data-chart vs DSFR Chart natif

Fonctionnalite dsfr-data-chart DSFR Chart natif
Données dynamiques Oui (via dsfr-data-source) Non (statiques)
Rafraichissement auto Oui Non
Transformation données Automatique Manuelle
Complexite d'usage Simple Moyenne