République
française
dsfr-data
Documentation — Web Components DSFR pour la dataviz
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.
| Attribut | Type | Description |
|---|---|---|
source | String | Id de la <dsfr-data-source> (ou d'un transformateur) dont ce graphique consomme les données. |
type | DSFRChartType | Type de graphique DSFR |
label-field | String | Chemin vers le champ label |
value-field | String | Chemin 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-label | String | Libellé 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-level | Number | Niveau 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-palette | String | Palette de couleurs |
unit-tooltip | String | Unité à afficher dans les tooltips |
horizontal | Boolean | Affichage horizontal (bar chart uniquement) |
stacked | Boolean | Barres empilées (bar chart uniquement) |
fill | Boolean | Remplir le graphique (pie chart: true = plein, false = donut) |
code-field | String | Chemin 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-highlight | String | ID du département/région à mettre en avant (map chart) |
gauge-value | Number | Valeur pour la jauge (gauge chart uniquement) |
value-field-2 | String | Chemin vers un second champ de valeur (pour bar-line: y-line). Alias inline champ:Libellé accepté (#668). |
value-fields | String | Champs 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-field | String | Champ "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. |
name | String | Nom(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-bar | String | Unité pour les barres (bar-line uniquement) |
highlight-index | String | Index des éléments à mettre en avant (ex: "[0, 2]") |
x-min | String | Limite min de l'axe X (types cartésiens : line, scatter, bar-line). |
x-max | String | Limite max de l'axe X (types cartésiens : line, scatter, bar-line). |
y-min | String | Limite 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-max | String | Limite 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-lines | String | Lignes 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}]'. |
targets | String | Cibles / 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-zone | String | Zone future grisée + frontière pointillée réalisé/projeté. "off" désactive. |
targets-legend | String | Lé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-message | String | Message 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é. |
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.
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.
| Attribut | Type | Description |
|---|---|---|
color-map | String | Couleur 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.
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.
| Attribut | Type | Description |
|---|---|---|
map-summary | String | MODE 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-weight | String | Champ 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-value | String | Valeur 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-field | String | Colonne 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.
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.
| Attribut | Type | Description |
|---|---|---|
databox | Boolean | Envelopper le chart dans une DataBox DSFR native |
databox-title | String | Titre affiché dans l'en-tête DataBox |
databox-source | String | Mention de la source (ex: "INSEE, 2024") |
databox-date | String | Date 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-field | String | Fraî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-download | Boolean | Bouton téléchargement CSV dans DataBox |
databox-screenshot | Boolean | Bouton screenshot PNG |
databox-fullscreen | Boolean | Bouton plein écran |
databox-trend | String | Badge tendance (ex: "+5.2", "-3.1") |
databox-tooltip-title | String | Titre du tooltip info DataBox |
databox-tooltip-content | String | Contenu du tooltip info DataBox |
databox-modal-title | String | Titre de la modale DataBox |
databox-modal-content | String | Contenu de la modale DataBox |
databox-default-source | String | Source par défaut dans le selecteur multi-source DataBox |
databox-actions | String | Actions 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.
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.
<dsfr-data-chart source="sites" type="bar" label-field="nom" value-field="score_rgaa" selected-palette="categorical" unit-tooltip="%"> </dsfr-data-chart>
<dsfr-data-chart source="sites" type="bar" label-field="ministere" value-field="score_rgaa" horizontal="true"> </dsfr-data-chart>
<dsfr-data-chart source="sites" type="line" label-field="nom" value-field="score_dsfr" unit-tooltip="%"> </dsfr-data-chart>
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>
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>
<dsfr-data-chart source="sites" type="pie" label-field="ministere" value-field="score_rgaa" selected-palette="categorical"> </dsfr-data-chart>
<dsfr-data-chart source="sites" type="radar" label-field="ministere" value-field="score_rgaa" y-min="0" y-max="100"> </dsfr-data-chart>
<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>
| 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 |