Le récit défilant : le moment dataviz¶
L'essentiel en 3 points
- Votre récit contient au moins un moment dataviz : des données réelles qui apparaissent au bon moment et font avancer l'histoire.
- Une bonne dataviz de récit, c'est une question, une donnée, une forme simple, une révélation au défilement, une chute.
- L'API (Application Programming Interface) se choisit et se teste au cours du ven. 13 nov. : choisir et tester votre API. Elle doit fonctionner à la bêta (ven. 20 nov.).
Ce qui fait un bon moment dataviz¶
Une dataviz de récit n'est pas un tableau de bord. Elle ne montre pas toutes les données : elle en montre une, au moment où le lecteur en a besoin.
| Ingrédient | La question à se poser | Exemple |
|---|---|---|
| Une question | Qu'est-ce que le lecteur se demande à ce moment du récit? | « Combien de fois la Terre a-t-elle tremblé cette semaine? » |
| Une donnée | Quelle donnée réelle y répond? | Les séismes des 7 derniers jours |
| Une forme simple | Quelle forme se comprend en 2 secondes? | Un chiffre géant, puis un point par séisme |
| Une révélation | Qu'est-ce qui bouge, et quand? | Le chiffre compte jusqu'à sa valeur quand on l'atteint |
| Une chute | Quelle phrase dit ce que la donnée raconte? | « Le plus fort : magnitude 6,8 » |
Des formes simples qui marchent¶
Pas besoin de librairie de graphiques : ces formes se font en HTML, en CSS et avec un peu de JavaScript.
- Le chiffre géant : une seule valeur, très grande, qui compte jusqu'à sa valeur finale.
- Une unité par donnée : un point, une icône ou un carré par élément. Le nombre devient visible.
- Les barres : comparer quelques valeurs. Elles poussent quand on les atteint. Attention : c'est la forme la plus courante, donc la moins mémorable (voir plus bas).
- L'échelle : comparer une valeur à quelque chose de connu (la hauteur d'un immeuble, la taille d'un terrain de soccer).
- La ligne du temps : une valeur qui change avec les années, révélée au fil du défilement.
Visez plus loin que le graphique à barres¶
Un graphique à barres ou en pointe de tarte, c'est la forme par défaut : il informe, mais il ne raconte rien, et il ressemble à tous les rapports. Dans un récit défilant, la donnée doit prendre la forme de votre histoire.
Le graphique à barres n'est pas interdit, mais c'est le minimum. La créativité compte aussi pour votre moment dataviz.
| Idée | Le principe | Par exemple |
|---|---|---|
| La donnée change le décor | La donnée ne s'affiche pas : elle modifie la scène. | La météo réelle d'un lieu change le ciel de votre illustration : pluie, neige, nuages. S'il pleut aujourd'hui dans la forêt du Chaperon, il pleut dans le chapitre. |
| Des unités à l'image de votre sujet | Une icône de votre univers par donnée, plutôt qu'un point ou une barre. | Une goutte par litre, un arbre par hectare, une silhouette par personne. |
| La donnée pilote une animation | La valeur règle la vitesse, la taille ou l'intensité d'une animation. | La magnitude du plus gros séisme fait trembler l'écran plus ou moins fort; la vitesse du vent pousse les nuages. |
| L'échelle au défilement | Le défilement devient la mesure. | Comme The Deep Sea : la profondeur, une distance, une durée qu'on parcourt en défilant. |
| Le lieu, dans votre style | Les données placées sur une illustration ou une carte dessinée dans votre style. | Les séismes de la semaine sur un globe dessiné à la main. |
| Le temps réel | La page change selon le moment de la visite. | L'heure du coucher du soleil règle la lumière de la page. |
Le test du rapport annuel
Si votre dataviz pourrait se retrouver telle quelle dans le rapport annuel d'une entreprise, poussez-la plus loin. Elle doit avoir le style de votre récit : votre palette, votre typographie, vos images.
Une seule idée, bien réalisée, suffit. Et aucune de ces idées n'a besoin d'une librairie de graphiques.
Des exemples à décortiquer¶
Ouvrez-les sur un ordinateur, défilez lentement, et repérez les 5 ingrédients.
The Deep Sea, Neal Agarwal
On descend au fond de l'océan en défilant, avec la profondeur affichée en continu. Le défilement lui-même devient la donnée. À observer : à quel moment apparaissent les repères qui nous font réaliser la profondeur.
Wealth, Shown to Scale
La fortune des milliardaires, à l'échelle : un pixel vaut 1 000 dollars, et on défile, longtemps. À observer : comment une comparaison rend un chiffre impossible à imaginer enfin concret.
A Visual Introduction to Machine Learning, R2D3
Un classique primé : des centaines de points qui se déplacent et se trient au fil du défilement. À observer : les mêmes données changent de forme à chaque étape de l'explication.
The Largest Vocabulary in Hip Hop, The Pudding
Des rappeurs classés selon le nombre de mots différents dans leurs textes. À observer : un graphique qui se construit étape par étape, avec une phrase pour chaque étape.
The Fallen of World War II
Un documentaire interactif sur les victimes de la Seconde Guerre mondiale, où les données sont racontées comme un film. À observer : une unité par personne, et l'effet des chiffres qui s'empilent.
Our World in Data
Des milliers de graphiques sur la santé, l'environnement, la société. Une mine d'idées et de données pour votre thème. À observer : le titre de chaque graphique est une phrase qui dit ce qu'il montre.
Vous trouverez d'autres exemples, dont The Pudding et Pixel Space, dans la page exemples et inspirations.
La démo : la Terre bouge¶
Une petite démo avec deux moments dataviz et des données réelles, chargées au moment où on les atteint :
- Un chiffre géant, puis une unité par donnée : le nombre de séismes de la semaine (API USGS), puis un point par séisme, dont la taille suit la magnitude.
- Des barres qui poussent : la température maximale des 7 prochains jours à Montréal (API Open-Meteo).
Le code est commenté dans js/dataviz.js. Il suit toujours les mêmes 4 étapes : attendre que le moment approche (IntersectionObserver), charger les données (fetch), construire la forme, puis révéler avec une classe CSS.
Des pistes pour choisir votre API¶
Voici plusieurs pistes à explorer pour trouver l'API de votre moment dataviz :
- Public APIs : une grande liste d'API gratuites, classées par thème. Visez les colonnes Auth :
No(sans clé d'identification : niapiKey, niOAuth) et CORS :Yes(utilisable depuis le navigateur;Unknownest permis, mais testez avant de choisir). L'index des catégories est loin dans la page : les liens directs par catégorie. - Données Québec et les données ouvertes de Montréal : des données d'ici, en français. Plusieurs jeux de données sont des fichiers à télécharger plutôt qu'une API : on en reparlera au cours.
- Quelques API sans clé, prêtes à tester : Open-Meteo (météo, climat), REST Countries (pays), Cleveland Museum of Art (œuvres d'art, avec images), USGS (séismes en temps réel), PokéAPI , Open Library (livres), Sunrise-Sunset (lever et coucher du soleil).
Choisir et tester votre API¶
Une API, c'est une adresse web qui renvoie des données en JSON au lieu d'une page. Vous connaissez déjà fetch() : vous l'utilisez pour data.json. Interroger une API, c'est le même fetch(), avec une adresse sur un autre site.
Ce qui est nouveau, c'est seulement : choisir l'API, lire sa réponse, et prévoir qu'elle tombe en panne.
1. Choisir une API¶
Une bonne API pour votre récit coche ces 4 cases :
- sans clé d'identification : pas d'inscription, pas de jeton (token). Dans Public APIs, c'est la colonne Auth : visez
No. ÉvitezapiKey(une clé à demander et à cacher) etOAuth(une connexion avec un compte); - CORS :
Yes(ouUnknown) : utilisable depuis le navigateur. Sans CORS, le navigateur bloque la réponse.Unknownveut dire que personne ne l'a vérifié : l'API fonctionne peut-être. Testez-la avant de la choisir (tester le CORS) : si la console affiche blocked by CORS policy, choisissez-en une autre; - elle renvoie du JSON;
- elle contient votre donnée, celle qui répond à la question de votre moment dataviz.
CORS, c'est quoi?
CORS (Cross-Origin Resource Sharing, le partage entre origines) est une règle de sécurité du navigateur. Par défaut, votre page n'a pas le droit de lire une réponse qui vient d'un autre site. L'API doit donner sa permission, dans un en-tête de sa réponse (Access-Control-Allow-Origin).
- Avec la permission (CORS :
Yes) : votrefetch()reçoit les données. - Sans la permission : le serveur répond quand même, mais le navigateur bloque la réponse avant que votre code la voie.
C'est pourquoi une API peut très bien s'afficher dans la barre d'adresse, et échouer dans votre page : la barre d'adresse n'est pas « un autre site » qui demande.
Des pistes : la liste Public APIs , et les API sans clé de la section Des pistes pour choisir votre API.
Public APIs, par catégorie¶
La liste Public APIs est classée par thème, mais l'index des catégories est loin dans la page. Allez-y directement :
- Animaux
- Art et design
- Livres
- Environnement
- Nourriture
- Jeux et BD
- Géolocalisation
- Santé
- Musique
- Données ouvertes
- Sciences et maths
- Sports
- Transport
- Météo
Dans chaque catégorie, un tableau : regardez les colonnes Auth (No) et CORS (Yes, ou Unknown à tester).
Pas d'API pour votre donnée?
Un jeu de données ouvert (Données Québec, Montréal, Statistique Canada) est souvent un fichier CSV à télécharger, pas une API. Vous pouvez le convertir en JSON et le mettre dans votre dépôt, comme au portfolio. Mais le fetch() vers une API externe reste exigé : ajoutez alors un petit élément « vivant » (la météo, l'heure du coucher du soleil) ailleurs dans le récit.
2. Tester l'adresse dans le navigateur¶
Avant d'écrire une ligne de code, collez l'adresse dans la barre d'adresse du navigateur. Firefox affiche le JSON joliment, avec des triangles pour plier et déplier. Dans Chrome, cochez Impression élégante.
Par exemple, la température maximale des 7 prochains jours à Montréal : l'adresse Open-Meteo .
La plupart des API se règlent dans l'adresse, après le ? : latitude=45.5, daily=temperature_2m_max. Changez une valeur, rechargez : vous voyez tout de suite ce que ça change. Plusieurs API, comme Open-Meteo, ont même un générateur d'adresse dans leur documentation.
Tester le CORS¶
La barre d'adresse ne vérifie pas le CORS : une API peut s'afficher très bien là, et être bloquée dans votre page. Le test se fait depuis une page web :
- Ouvrez n'importe quelle page web, par exemple ces notes de cours.
- Ouvrez la console (F12, onglet Console).
-
Collez ces lignes, avec l'adresse de votre API, puis Enter :
const url = "https://openaccess-api.clevelandart.org/api/artworks/"; await fetch(url + "?limit=1").then((r) => r.json()); -
Lisez le résultat : - un objet s'affiche : le CORS passe, l'API est utilisable; - un message rouge avec blocked by CORS policy : le navigateur bloque la réponse. Choisissez une autre API.
Rien ne s'affiche?
Vérifiez le menu des niveaux, en haut à droite de la console : Infos doit être coché. Sinon, la console cache les console.log().
Un vrai cas : deux musées
L'API du Cleveland Museum of Art passe le test. Celle de l'Art Institute of Chicago répond dans la barre d'adresse, mais la console affiche une erreur CORS : elle est inutilisable dans votre page.
3. Trouver le chemin vers votre donnée¶
La réponse contient souvent beaucoup plus que ce qu'il vous faut. Cherchez le chemin vers votre valeur, comme dans un objet JS :
data l'objet reçu
.daily la propriété « daily »
.temperature_2m_max un tableau de 7 températures
En code : data.daily.temperature_2m_max. Un tableau d'objets? data.features[0].properties.mag.
Trouver une donnée dans un JSON complexe : la méthode, et un outil pour tester vos chemins
Copier le chemin dans Chrome
Outils de développement, onglet Réseau (Network), filtre Fetch/XHR. Cliquez sur la requête, onglet Aperçu (Preview), puis clic droit sur la valeur : Copier le chemin de la propriété.
4. Le fetch(), dans le fichier de votre chapitre¶
Le moment dataviz appartient à un chapitre : son code va dans le fichier de ce chapitre.
// js/chapitres/ch-05.js
const WEATHER_URL = "https://api.open-meteo.com/v1/forecast"
+ "?latitude=45.5&longitude=-73.57"
+ "&daily=temperature_2m_max&timezone=auto";
async function loadWeather() {
const response = await fetch(WEATHER_URL);
if (!response.ok) {
throw new Error("Météo introuvable (" + response.status + ")");
}
const data = await response.json();
console.log(data); // d'abord, regardez ce qui arrive
return data.daily.temperature_2m_max; // 7 valeurs
}
C'est le même fetch() que pour data.json : voir Récap JS : async / await.
5. Charger au bon moment¶
Pas au chargement de la page : quand le visiteur approche du chapitre. C'est le rôle d'IntersectionObserver, avec un rootMargin qui le déclenche un peu avant, pour que les données soient là à temps.
6. Prévoir la panne¶
Une API externe peut être lente, changer, ou tomber en panne. Le jour de votre présentation aussi. Votre récit doit rester lisible si elle ne répond pas :
async function showWeather(section) {
let temperatures;
try {
temperatures = await loadWeather();
} catch (error) {
console.error(error);
// Valeurs de secours : le récit continue
temperatures = [4, 6, 3, 2, 5, 7, 4];
section.querySelector(".source").textContent =
"Données hors ligne : relevé du 13 novembre";
}
// ... construire la forme avec temperatures
}
Gardez des valeurs de secours réelles (copiées de la réponse un jour où l'API fonctionnait), et dites-le au lecteur.
7. Documenter votre choix¶
Dans la section 6 de votre CAHIER-DE-CHARGES.md, ajoutez :
- l'API : son nom et le lien vers sa documentation;
- l'adresse que vous interrogez;
- le chemin de la valeur utilisée (ex.
data.daily.temperature_2m_max).
Puis commit (Cahier : ajoute l'API de la dataviz) et push.
Pour votre cahier de charges¶
Dans la section 6 du gabarit, décrivez votre idée :
- dans quel chapitre arrive le moment dataviz;
- la question à laquelle il répond, et le genre de données que vous aimeriez montrer;
- la forme que vous imaginez : une donnée qui change le décor, des unités à l'image de votre sujet, une donnée qui pilote une animation, une échelle au défilement… (voir plus haut);
- la chute : ce que la donnée raconte dans votre histoire.
Ajoutez un cadre pour ce moment dans votre storyboard. L'API se choisit au cours du ven. 13 nov. : voir Choisir et tester votre API.