dataset = [{name: 'Allemagne', value: 65},{name: 'Albanie', value :59}, {name: 'Italie', value: 80}, {name: 'France', value: 81}, { name: 'Gabon', value: 56}, {name: 'Maroc', value: 55},{name: 'Égypte', value: 40}]Cours 2 - 2025-2026
September 9, 2025
Source : Four color theorem, Carlos ZGZ, public domain licence.
Le traitement visuel pré-attentif est un traitement visuel qui se produit avant l’attention consciente.
Il permet de détecter des caractéristiques visuelles telles que la couleur, la forme, la taille, etc.
Par exemple dans le cadre d’un rapport présentant les données d’exportation de la France, par rapport à ses voisins, en 2019 :
pré-attentif
2869408609876
9348586748676
2967303986739
3967496749674
2869408609876
9348586748676
2967303986739
3967496749674
2869408609876
9348586748676
2967303986739
3967496749674
2869408609876
9348586748676
2967303986739
3967496749674
2869408609876
9348586748676
2967303986739
3967496749674
Les propriétés pré-attentives sont les caractéristiques des éléments visuels qui peuvent être détectées pré-attentivement.
On peut les classer en 4 catégories :
Ces attributs pré-attentifs illustrent comment les éléments peuvent être mis en évidence dans une visualisation de données.
Développée par des psychologues allemands au début du XXe siècle.
La théorie de la Gestalt est utilisée en design, en psychologie, en ergonomie, en informatique, etc. … et en visualisation de données.
Jacques Bertin (1918-2010) est un cartographe et théoricien de la sémiologie graphique.
Il a développé une théorie de la visualisation de données dans son ouvrage “Sémiologie graphique” (1967).
Il a notamment défini les variables rétiniennes (ou variables visuelles) et leurs propriétés.
Les variables visuelles sont les propriétés des objets visuels qui peuvent être utilisées pour encoder les données.
Les variables visuelles sont au nombre de 7 :
Les propriétés des variables visuelles sont les caractéristiques des variables visuelles qui permettent de les distinguer les unes des autres.
Les propriétés des variables visuelles sont au nombre de 4 :

Cf. le cours d’introduction et les exercices en TP
Différentes ressources peuvent aider à choisir le bon type de graphique :

“Une visualisation est dite expressive si et seulement si elle encode toutes les relations de données prévues et aucune autre relation de données” - Stuart Card, 2008
“Les critères d’efficacité permettent de déterminer lequel de ces langages graphiques [qui sont expressifs], dans une situation donnée, est le plus efficace pour exploiter les capacités du support de sortie et du système visuel humain. - Mackinlay, 1986
Les visualisations de données doivent être simples à comprendre : de manière générale, il faudra essayer de choisir la manière la plus simple de transmettre l’information.
Éviter les éléments visuels complexes et inutiles qui pourraient distraire de l’objectif principal de la visualisation (3D, effets spéciaux, etc.).
Chaque élément visuel d’un graphique ajoute une charge cognitive (i.e. un effort mental nécessaire à traiter l’information)
Identifiez ce qui n’apporte pas de valeur ajoutée à votre visualisation et supprimez-le.
dataset2 = [{name: 'January', value: 65},{name: 'February', value :59}, {name: 'March', value: 80}, {name: 'April', value: 81}, { name: 'May', value: 56}, {name: 'June', value: 55},{name: 'July', value: 40}]
Plot.plot({
grid: true,
x: { label: null },
marks: [
Plot.barY(dataset2, {x: 'name', y: 'value', fill: 'black', fillOpacity: 0.7, stroke: 'black', sort: {"x": null} }),
]
})Plot = require('@observablehq/plot')
Plot.plot({
grid: true,
y: {
domain: [0, 85]
},
x: { label: null },
style: {
fontFamily: "Inconsolata,monospace",
fontSize: "17px"
},
marks: [
Plot.frame({ fill: 'brown', fillOpacity: 0.65, stroke: 'black' }),
Plot.gridX({ interval: 1, stroke: "black", strokeOpacity: 1, strokeWidth: 2.5 }),
Plot.gridY({ interval: 5, stroke: "black", strokeOpacity: 1, strokeWidth: 2.5 }),
Plot.barY(dataset2, { x: 'name', y: d => d.value + 1, fill: 'black', fillOpacity: 1, stroke: 'black', dx: 5, sort: {"x": null} }),
Plot.barY(dataset2, { x: 'name', y: 'value', fill: 'name', fillOpacity: 1, stroke: 'name' }),
]
})Par ailleurs :
Utilisez une police, une taille de police, une couleur et un alignement uniformes.
Utilisez des espaces blancs :
Il est nécessaire :



Source : https://twitter.com/Motorsport/status/1432668101905195013/photo/1

Source : https://observablehq.com/@kenklin/shortest-f1-races-by-distance

“In general, in a time-series, use a baseline that shows the data not the zero point” - Edward Tufte


Alternative :




… et les corriger si nécessaire (suppression de valeurs aberrantes, etc.).


dicopal = import("https://cdn.skypack.dev/dicopal@0.8.1")
function makePalette(colors) {
return `<div style="display: grid; height: 4rem; padding: 0.5rem; gap: 1px;
grid-template-columns: repeat(auto-fit, minmax(0, 1fr));">${colors
.map((t) => `<span style="background:${t};"> </span>`)
.join("")}</div>`;
}- Attention aux personnes présentant des difficultés visuelles (daltonisme, etc.) : utilisez des palettes de couleurs adaptées.


Utilisez de manière préférentielle des palettes existantes (celles fournis par D3.js, etc.) pour éviter les erreurs.
En JavaScript :
Pour manipuler les couleurs en JavaScript :
function corr(x, y) {
const n = x.length;
if (y.length !== n)
throw new Error("The two columns must have the same length.");
const x_ = d3.mean(x);
const y_ = d3.mean(y);
const XY = d3.sum(x, (_, i) => (x[i] - x_) * (y[i] - y_));
const XX = d3.sum(x, (d) => (d - x_) ** 2);
const YY = d3.sum(y, (d) => (d - y_) ** 2);
return XY / Math.sqrt(XX * YY);
}
fields = ["economy (mpg)", "cylinders", "displacement (cc)", "power (hp)", "weight (lb)", "0-60 mph (s)", "year"]
correlations = d3.cross(fields, fields).map(([a, b]) => ({
a,
b,
correlation: corr(Plot.valueof(cars, a), Plot.valueof(cars, b))
}))Difficile de lire les valeurs…
Plot.plot({
marginLeft: 100,
label: null,
height: 370,
color: { scheme: "rdylbu", pivot: 0, legend: true, label: "correlation" },
marks: [
Plot.cell(correlations, { x: "a", y: "b", fill: "correlation" }),
Plot.text(correlations, {
x: "a",
y: "b",
text: (d) => d.correlation.toFixed(2),
fill: (d) => 'black'
})
]
})Meilleure lisibilité :
Plot.plot({
marginLeft: 90,
label: null,
height: 370,
color: { scheme: "rdylbu", pivot: 0, legend: true, label: "correlation" },
marks: [
Plot.cell(correlations, { x: "a", y: "b", fill: "correlation" }),
Plot.text(correlations, {
x: "a",
y: "b",
text: (d) => d.correlation.toFixed(2),
fill: (d) => (Math.abs(d.correlation) > 0.6 ? "white" : "black")
})
]
})Prenez le temps nécessaire à configurer, modifier, tester, corriger, etc. votre visualisation de données : il s’agit d’un processus itératif.
Demandez des retours à vos collègues, à vos amis, etc.
Source : https://www.e-education.psu.edu/geog586/node/808 - Credit: Blanford, © Penn State University, licensed under CC BY-NC-SA 4.0
Une partie des erreurs classiques sont résumées dans ce cours. D’autres peuvent être consultées sur la page suivante :
Une autre tentative de résumer des règles de base (et de quand il est OK de passer outre) est disponible sur la page suivante :
Si vous voulez vous faire peur, vous pouvez aussi consulter la page suivante dédiée aux visualisation de données ratées :
