Workshop D3

par @ThomasG77, WebGeoDataVore

Workshop D3

par @ThomasG77 WebGeoDataVore

WebGeoDataVore

Consultant SIG, OpenData et visualisation de données, proposant conseil, formation et développement.

Auteur d'un livre sur OpenLayers 3 (en anglais), spécialiste JavaScript et Python.

Contact: thomas.gratier(at)webgeodatavore.com

Plan

1) D3: possibilités de représentations et écosystème

2) Contextualisation: pourquoi D3? La visualisation de données

3) Quel(s) intérêt(s) pour la cartographie ?

4) Rappels pratiques

5) Travaux pratiques avec mise en ligne de votre démo

De nombreux exemples

Une parenté: Protovis

Un écosystème effervescent


Surcouches pour des besoins classiques (sans cartographie)


Surcouches cartographiques

Choroplèthes et points proportionnels, https://datamaps.github.io

Visualisation avec fond de plan et plus, https://github.com/emeeks/d3-carto-map

Globe 3D, http://planetaryjs.com

Services et autres applications utilisant D3

Pour faire une première visualisation en ligne

En passant depuis un autre language de programmation


Contexte de D3: OpenData et Visualisation de données

Deux phénomènes liés à un changement de vision du rapport au citoyen

Quelques raccourcis explicatifs sur ces sujets


Principes de l'OpenData:


Côté visualisation de données:


Plusieurs aspects de la visualisation de données:


D3 intervient en phase 2 et 3:

Des classifications

Choix du diagramme

Intérêts dans un contexte cartographique?

Plusieurs visions possibles:


Commentaires

Qui l'utilise?

Qui en a besoin potentiellement?

Rappel pratique: D3 permet de visualiser des données :

en utilisant les standards du web: HTML, CSS, JS et SVG

en transformant la donnée en élément HTML ou SVG

Données vers éléments


Data-Driven Documents

Le nom “D3” fait référence aux 3 initiales et au Document Object Model (DOM) du W3C.


Ressources HTML

Spécifications HTML 5, HTML 5 for developers, Mozilla Developer Network

Base HTML 5

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Titre de la page</title>
  <style></style>
  <script></script>
</head>
<body>
  <!-- Le reste du contenu -->
</body>
</html>

Démo


Ressources SVG

Spécifications SVG, MDN, partie SVG, Référence de l'API D3, cours en français sur SVG par Gilles Chagnon

Démo SVG

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Exemple SVG</title>
  <style></style>
  <script></script>
</head>
<body>
  <svg height="100" width="100">
    <circle cx="50" cy="50" r="40" stroke="black" stroke-width="0.5" fill="#F89C43" />
    Navigateur sans support SVG "inline".
  </svg> 
</body>
</html>

Démo


Ressources CSS

Spécifications HTML 5, HTML 5 for developers, Mozilla Developer Network

Démo CSS

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Exemple CSS</title>
  <style>
  body {
    background-color: #F89C43;
  }
  </style>
  <script src="script.js"></script>
</head>
<body>
  <!-- Le reste du contenu -->
</body>
</html>

Démo


Ressources JavaScript

Spécifications SVG, MDN, partie SVG, Référence de l'API D3, liste de livres JavaScript de Revolunet dont Eloquent JavaScript en français

Démo JavaScript

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Exemple JavaScript</title>
  <style></style>
  <script>
    console.log([5, 10, 15, 20, 25]);
  </script>
</head>
<body>
  <!-- Le reste du contenu -->
</body>
</html>

Démo


JavaScript, l'incontournable

Le JavaScript peut être considéré comme la glue dans D3:
rien ne marche sans lui.

Il faut donc le maîtriser correctement pour pouvoir produire des visualisations personnalisées ou personnaliser les outils utilisant D3.

Chrome Developer Tools

Plugin FireBug (Mozilla Firefox)

Debuggueur Mozilla Firefox par défaut

"Secrets of the Browser
Developer Tools"


Où trouver les ressources spécifiques D3


Se retrouver dans l'API

Chercher par fonctions


Mettre vos démos en ligne à disposition

Recommençons avec le SVG

Revenons aussi au JavaScript

Pour cela, ouvrez la console/le debuggeur de votre navigateur soit:

Structures JavaScript

Les chaînes

console.log('Bonjour');

Les entiers et les réels

    console.log(parseInt('14', 10));
    console.log(14);
    console.log(14.76);
    console.log(parseFloat(14.76));
    console.log(+14.76);

Structures JavaScript

Les tableaux (array)

console.log(["A", "B", "C", "D"]);

var obj = {letterA: "A", letterB: "B", number3: 3};
console.log(obj);
console.log(obj['letterB']);
console.log(obj.number3);

Les fonctions JavaScript

function helloWorld() {
  return 'Bonjour le monde';
}
­
console.log(helloWorld());
­
var helloWorld2 = function helloWorld2(nom) {
  console.log('Bonjour le monde 2 ' + nom);
}
­
helloWorld2('Thomas');

Boucles JavaScript

Sur un tableau

var arr = ["A", "B", "C", "D"];
for (var i = 0, len = arr.length; i < len; i++) {
  console.log(arr[i]);
}

Sur un objet

var obj = {letterA: "A", letterB: "B", number3: 3};
for (var prop in obj) {
  console.log("o." + prop + " = " + obj[prop]);
}

Boucles et chainage sur un tableau

var arr = ["A", "B", "C", "D"];
arr.forEach(function(el, i) {
  console.log(el, i);
})
var arr = ["A", "B", "C", "D"];
console.log(arr.filter(function(el, i) {
  return ["B","C"].indexOf(el) == -1
}).map(function(el) {
  return {
    "letter": el
  }
}))

Outils pour débuter

Un éditeur de texte. Cela peut être Notepad++ sous Windows, Gedit sous Linux (Par défaut sous Ubuntu), SublimeText (version d'essai, pas opensource), Atom, Brackets

Un serveur web. de nombreuses solutions mais le plus simple est d' utiliser Python pour cela en lançant en ligne de commande python -m SimpleHTTPServer (version 2.x) ou python3 -m http.server (version 3.x)

Commençons par créer une carte simple: juste les contours de la France

Points importants:

Choisir un projection pour afficher la carte:

Utiliser encore plus de projections

d3 est fait pour les sélections

d3.select('body')
d3.selectAll('path')

C'est similaire à document.querySelector et document.querySelectorAll

On sélectionne pour manipuler avec des "opérateurs"

Exemple pour ajouter une balise SVG

d3.select('body').append('svg')

Ou définir des attributs

.attr('width', width)
.attr('height', height);

La donnée vit ailleurs, on l'appelle via Ajax

La manière classique de D3 pour Ajax

d3.json('geofla-departements.geojson', function(error, depts) {
  console.log(depts);
})

Sélections, sélections:

Une sélection peut se faire pour des élements à créer et pas seulement pour des élements existants. On utilise un pattern enter/exit/remove qui consiste à gérer la correspondance entre élements et données via une "jointure"

Trois tris avec:

enter: pour faire la correspondance initialement

exit: si on refait un enter avec moins de données que d'élements DOM, exit permet de récupérer les élements DOM ne correspondant pas

remove permet de "nettoyer" les éléments qu'on lui passe

Mission 1

  • Récupérer le code
  • Alléger le GeoJSON avec le site web MapShaper
  • Créer un fichier de type TopoJSON
  • Tenter de remplacer la source GeoJSON avec le TOPOJSON.

Correction code

Mission 2

Autres exemples cartographiques purs

Carte choroplèthe de la densité de population par département

Différences avec le cas précédent

Fondamentalement, ce n'est pas vraiment différent sauf qu'on définit une classe en fonction d'une discrétisation plutôt qu'avec un seul nom land.

On introduit la notion de domain et range dans D3

d3.domain/d3.range, le couple

Ils sont utilisés via l'intermédiaire des fonctions d3.scale.*

Un domain c'est l'étendue de la donnée du type min, max généralement

Un range c'est la dimension pour ce qu'on va dessiner

En réalité, il s'agit de faire correspondre une valeur de la donnée à une autre valeur, généralement les mesures sur l'écran mais pas uniquement.

Par exemple, d3.scale.threshold fait une correspondance valeur et information discrète.

Statistiques en JavaScript

Pour des calculs pour discrétiser dans le navigateur, on utilise geostats. D3 embarque quelques méthodes comme d3.min, d3.max, d3.mean, d3.median, d3.quantile, d3.deviation, d3.variance (...) si vous êtes sur des statistiques descriptives. Voir la documentation sur la manipulation des tableaux à ce propos.

Information au survol

Plutôt que de réinventer, nosu avons retenu un composant pour affichage de l'information au survol. En bindant ce composant lors des l'événement mouseout et mouseover sur nos éléments du DOM, on répond au besoin.

Mission 3

  • Changer la couleur des choroplèthes de 3 manières différentes (indice: css, classification, classes)
  • Changer ce que vous afficher dans l'infobulle en trouvant les autres attributs possibles.
  • Mettez en ligne votre code sur un GIST sur Github (préférable d'avoir un compte gratuit) pour utiliser http://bl.ocks.org

Autres exemples cartographiques purs

Carte avec points proportionnels de la production vinicole 2015 par départements

Les nouveautés dans le code

On utilise un hash pour joindre les données carto et CSV (attributaires)

On crée des cercles proportionnels avec les échelles via d3.scale.sqrt() pour garder une proportionnalité à la surface.

On gère l'ajout d'une légende

Chainage des appels Ajax pour faciliter l'usage de plusieurs fichiers

Utilisation d'une bibliothèque nommé queue par le même auteur que D3 qui présente l'intérêt de de chainer des appels Ajax imbriqués. C'est plus lisible. C'est assez similaire à des promesses ("Promise" JavaScript).

queue()
  .defer(d3.json, "geofla-departements-light-4p.topojson")
  .defer(d3.csv, "données-vin-2014-volume-recoltes.csv")
  .await(ready);

Mission 4

  • Utiliser un TSV (fourni, nommé "nb_comm_par_dept.tsv") qui est comme un CSV mais où le séparateur est une tabulation pour afficher des cercles proportionnels au nombre de communes par département.
  • Changer les styles: couleurs ou taille maximale du cercle

Diagramme vertical v1

Le "A retenir"

Un simple DIV avec un fond CSS permet d'avoir des diagrammes en barre. Pas besoin de SVG obligatoirement.

Mission 5

  • Utilisez d3.max et un d3.scale.linear pour calculer la largeur de manière dynamique plutôt qu'avec une valeur en dur (5000)

Diagramme vertical v2

Leçon du passage au SVG pour ce type de diagramme

Plutôt qu'utilisez des DIV, on utilise un élement de type rect.

Il est nécessaire d'utiliser des groupes: il n'est pas possible d'aligner les textes avec les rectangles sans cela.

On utilise les fonctions natives de SVG (transform) pour décaler les barres avec .attr("transform", function(d, i) { return "translate(0," + i * barHeight + ")"; });

Mission 6

  • Changez les tailles et les labels du diagramme
  • Espacez les barres entre elles en jouant sur transform

Diagramme horizontal

De l'utilisation des axes

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom");
­
var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left")
    .ticks(10);

Voir la documentation officielle sur les axes

Mission 7

  • Changez l'orientation du text avec (indice: il existe un moyen de faire une rotation en SVG)
  • Faites un effet miroir par rapport à l'axe des X: "la valeur Y devient -Y"

Synchronisation/Effet de sélection multiples entre graphiques

Carte avec points proportionnels de la production vinicole 2015 par départements et diagramme en barre

Synchronisation

Une méthode des plus simples grâce à des sélections SVG en utilisant des identifiants et des "listeners": ce qui permet de surveiller si on survole un élément. C'est un autre terme déjà utilisé pour réagir au mouseout, mouseover de l'infobulle

Mission 9

  • Ajouter le rang dans la donnée
  • Affichez l'infobulle de survol de la carte mise à jour.

Quelques exemples cartographiques sympathiques

En dehors des cartes et des diagrammes simples, quelles représentations avec D3?

Les "layouts"?

Pour pouvoir générer des graphes, ils permettent de spécifier les relations graphiques entre les élements d'un graphe. Généralement, il faut une structure de données précises en entrée. Un layout est un algorithme qui génère une structure de données. On réutilise cette structure pour construire la visualisation.

Layout "treemap"

Layout "pack"

Et encore et encore

On préfère arrêter les exemples "à la Prévert". N'hésitez pas explorer les exemples D3 tellement les choix sont nombreux.

On peut explorer quelques cas avec l'application RAW

Mission 9

Explorer l'outil RAW pour découvrir quelques autres layout

Pour terminer

Cours et ressources en ligne

En Français

En anglais

Pour l'inspiration: quelques champions D3