D3 en profondeur
(d3indepth.com)- D3 in Depth est une ressource d’apprentissage consacrée à la création de visualisations de données personnalisées avec D3.js, basée sur D3 6 et 7
- Elle met l’accent sur la création de visualisations personnalisées plutôt que sur la simple utilisation de graphiques, tout en abordant les composants de la visualisation web
- Les bases de HTML, SVG, CSS et JavaScript y sont reliées au travail avec D3, ce qui aide à comprendre la représentation de données sur le web
- Elle peut aussi s’inscrire dans un parcours d’apprentissage de la visualisation en JavaScript, avec des ressources sur les dashboards et les récits de données utilisant React, Chart.js et Leaflet
- Pour les lecteurs qui souhaitent approfondir D3, elle peut servir de ressource d’initiation et d’approfondissement combinant compréhension des concepts et pratique
Ce que couvre D3 in Depth
- D3 in Depth cible les versions 6 et 7 de D3
- Elle permet d’apprendre à créer des visualisations de données personnalisées avec D3.js
- Elle couvre aussi les éléments de base nécessaires à la création de visualisations web : HTML, SVG, CSS et JavaScript
Autres ressources de visualisation JavaScript à consulter
- Data Dashboards with JavaScript traite de la création de dashboards de données avec React, Chart.js et Leaflet
- Visualising Data with JavaScript explique comment créer des graphiques et des récits de données avec Chart.js, Leaflet, D3 et React
- Selon l’avis d’un lecteur, cette ressource compte parmi les bons livres sur D3, avec un contenu clair, facile à suivre et des concepts solides
1 commentaires
Avis Hacker News
C’est une bibliothèque qui ajoute à D3 de nombreuses conventions et fonctionnalités pratiques pour créer des graphiques, diagrammes et plots
Il existe aussi Observable Framework[2], qui va plus loin : un générateur de sites statiques pour tableaux de bord de visualisation, prenant en charge Plot, D3 et plusieurs autres bibliothèques
1: https://observablehq.com/plot/
2: https://observablehq.com/framework/
Pour de nombreux types de plots, il est souvent plus simple en pratique de manipuler directement les données SVG, et ce n’est pas si difficile
J’aimerais qu’il existe des bibliothèques ou frameworks qui facilitent la manipulation de sorties SVG ou canvas. Les petites modifications devraient être très faciles, mais plus un framework est haut niveau, plus il devient difficile de sortir du chemin prévu
La documentation est plutôt correcte, mais il manque une section de référence API vraiment exploitable, ce qui ne facilite pas la découverte des fonctionnalités
J’essaie d’éviter autant que possible de créer des graphiques avec le canvas HTML5, donc j’aimerais qu’il existe une approche repensée pour cela
Modification : en activant l’accélération matérielle, c’est devenu plus fluide, mais même sur un Ryzen 9, cela reste plus saccadé que prévu
Si l’on me demandait de résoudre une équation aux dérivées partielles que je n’ai pas vue depuis 10 ans, je pense que les réflexes reviendraient plus vite
Je trouve aussi la documentation de référence de D3 vraiment épouvantable
Cela dit, cela semble plus stable aujourd’hui. J’ai commencé à écrire de manière plus impérative avec Svelte+D3 plutôt qu’avec D3 seul, et j’ai fini par m’y retrouver
C’était plus facile de comprendre les éléments générés que de les inspecter après coup dans les outils de développement
Ce site m’a aidé pour utiliser D3 avec Svelte : https://svelte.recipes/
80 % de mon travail relève plutôt des applications, 10 % des systèmes, 10 % de l’analyse de données, et il m’arrive souvent de créer un notebook Jupyter pendant deux semaines puis de ne plus y toucher pendant deux mois
La plupart des bibliothèques de tracé ont beaucoup de règles arbitraires à mémoriser et, en général, plusieurs petits langages dédiés à un domaine. Un simple littéral chaîne y est interprété de manière bien plus complexe que par
atoiEn plus, sur plusieurs aspects comme la détermination de la plage des axes ou le traitement d’un très grand nombre de points, il y a des choses qui, de mon point de vue, ne vont pas
D3 force à faire beaucoup de choses soi-même, mais les interfaces prévues pour cela sont conceptuellement intuitives. Je préfère faire les choses correctement avec D3.js plutôt que d’utiliser du code généraliste obèse et bogué écrit par d’autres, avec une API qui donne l’impression de construire un bateau dans une bouteille
Il est facile de mal l’utiliser, difficile à déboguer et difficile à comprendre
Cela ne veut pas dire que le problème se résout facilement. Si je devais produire des graphiques pilotés par les données très spécifiques, je choisirais probablement encore D3
Comparer une API à ce niveau d’exigence ne me paraît pas vraiment équitable
Il faut autant que possible éviter le code que même son auteur a du mal à comprendre, et D3 est l’exemple type de ce genre de bibliothèque
Par exemple, si l’on affiche des données dans une plage de 0 à 100 points sur un écran 1080p de 1920x1080, il faut bien décider à un moment donné comment mettre à l’échelle les données pour les projeter sur l’écran
On peut faire les calculs soi-même, ou les confier à une bibliothèque comme D3
Même si l’on ne dessine pas de données sur le web, on finira un jour ou l’autre par représenter des données quelque part, et il sera utile de savoir trouver, dans cet écosystème, l’outil qui joue le même rôle
Je me souviens avoir dû mettre à l’échelle les rectangles à dessiner dans le graphique en fonction de la taille du PNG que je créais
Bien sûr, c’était très trivial et cela n’avait rien à voir avec les choses incroyables que D3 peut faire, mais c’était une première expérience assez géniale de création d’images par ordinateur par moi-même
D3 ne m’a personnellement jamais paru intuitif. Le problème vient peut-être du fait qu’il essaie de faire trop de choses à trop de niveaux d’abstraction
Si l’on parle simplement de projeter des données, c’est facile à comprendre, mais il semble que cette projection soit aussi étroitement liée aux axes et à d’autres éléments
Je vois le calcul de différence entre
selectetselect, que mbostock présente comme l’abstraction centrale de D3, plutôt comme un dispositif pratique pour écrire unpaint()réentrantLes instructions de paint sont simplement exprimées comme des instructions de builder, elles-mêmes encapsulées dans la portée d’un select, avec en plus la possibilité de les fractionner pour produire plusieurs effets
En particulier, dans les exemples d’animation, ce que D3 fait est étonnamment limité, et il faut écrire soi-même la boucle externe et suivre l’état au fil du temps
D3 ne fournit pas non plus d’abstraction pour encapsuler une visualisation, que ce soit sous forme de fonction ou autrement ; cette partie est laissée en exercice au lecteur
Pour un nouvel utilisateur de D3, tout cela est une grande surprise, voire un choc. C’est un peu comme adopter une nouvelle base de données et découvrir qu’elle ne fournit que les E/S fichiers, les index B-tree et une bibliothèque d’optimisation de requêtes, et qu’il faut tout relier soi-même
C’est comme remplacer
d3-select, le module de manipulation du DOM de D3, par React. Le fait que ce soit possible et que cela fonctionne bien montre à quel point la conception de D3 est solideSelon votre objectif, ce peut être l’outil qu’il vous faut, ou non
J’utilise encore plusieurs de ses fonctions auxiliaires, comme l’easing ou la mise à l’échelle, mais je construis les composants réels avec des frameworks modernes. Dans mon cas, Vue 3 et TypeScript
Je reste néanmoins reconnaissant à D3.js pour les belles années qu’il m’a offertes et pour m’avoir appris de nombreuses bonnes pratiques en visualisation de données
Les valeurs par défaut et les démos de Mike Bostock étaient une source d’inspiration et de bons exemples de référence, et elles s’accordaient bien avec le minimalisme de Tufte
D3 et jQuery se ressemblent dans une certaine mesure, et tous deux ont facilement tendance à produire du code spaghetti. Des outils comme VisX ajoutent beaucoup de structure par-dessus le D3 qu’ils utilisent, ce qui aide à rester sain
Je me demande toutefois si, pour créer quelque chose de plus personnalisé qu’avec du D3 pur, on finit par le ressentir comme contraignant, au point de devoir se battre contre l’outil
Un autre outil inspiré par GG est ggplot2, au nom bien choisi, pour le langage R
Il offre une interface beaucoup plus concise et proche du fonctionnel, et s’intègre aussi bien avec Rush, un outil assez rare qui permet de créer rapidement des graphiques en passant un CSV par pipe, autrement dit des one-liners R pour le shell
Ces outils dépendent généralement des fonctionnalités du navigateur, ou utilisent des solutions de rendu côté serveur bancales reposant sur un navigateur headless pour la génération serveur
J’aimerais en particulier pouvoir générer des diagrammes de Venn par programmation. Étrangement, il n’y a presque rien dans ce domaine
Quelques bibliothèques de graphiques JavaScript les prennent en charge, mais dans l’ensemble le support semble très limité
gnuplot a l’air intéressant, mais ne prend pas en charge les diagrammes de Venn
C’est aussi une dépendance d’OpenSearch Dashboards, qui permet aux utilisateurs de créer des tableaux de bord personnalisés au-dessus de leurs logs et données d’observabilité[2]
La bibliothèque Vega semble pouvoir atténuer dans une certaine mesure les problèmes de courbe d’apprentissage de D3 mentionnés par d’autres
[1] https://vega.github.io/vega/docs/
[2] https://opensearch.org/docs/latest/dashboards/visualize/vega...