D3 im Detail
(d3indepth.com)- D3 in Depth ist ein Lernmaterial auf Basis von D3 6 und 7, das zeigt, wie man mit D3.js individuelle Datenvisualisierungen erstellt
- Der Fokus liegt weniger auf der Nutzung einfacher Diagramme, sondern auf der Erstellung individueller Visualisierungen; zugleich lernt man die Bausteine von Web-Visualisierungen kennen
- Grundlagen von HTML, SVG, CSS und JavaScript werden mit der Arbeit in D3 verknüpft und helfen so beim Verständnis webbasierter Datendarstellung
- In Verbindung mit Materialien zu Dashboards und Data Storys mit React, Chart.js und Leaflet lässt sich daraus ein Lernpfad für JavaScript-Visualisierung aufbauen
- Für Leser, die D3 vertieft lernen möchten, eignet es sich als Einsteiger- und Vertiefungsmaterial, das Konzeptverständnis und Praxis verbindet
Was D3 in Depth abdeckt
- D3 in Depth richtet sich an D3 Version 6 und 7
- Man lernt, wie man mit D3.js individuelle Datenvisualisierungen erstellt
- Als grundlegende Elemente für die Erstellung webbasierter Visualisierungen werden HTML, SVG, CSS und JavaScript gemeinsam behandelt
Weitere JavaScript-Visualisierungsmaterialien
- Data Dashboards with JavaScript behandelt, wie man mit React, Chart.js und Leaflet Daten-Dashboards erstellt
- Visualising Data with JavaScript behandelt, wie man mit Chart.js, Leaflet, D3 und React Diagramme und Data Storys erstellt
- Eine Leserbewertung stuft dieses Material unter den D3-Büchern hoch ein und beschreibt die Inhalte als klar, leicht nachvollziehbar und konzeptionell solide
1 Kommentare
Hacker-News-Kommentare
Es ist eine Bibliothek, die auf D3 aufsetzt und viele Konventionen und Komfortfunktionen zum Erstellen von Graphen, Charts und Plots hinzufügt
Darüber hinaus gibt es auch noch Observable Framework[2], einen Static-Site-Generator für Visualisierungs-Dashboards, der Plot, D3 und verschiedene andere Bibliotheken unterstützt
1: https://observablehq.com/plot/
2: https://observablehq.com/framework/
Bei vielen Arten von Plots ist es tatsächlich oft einfacher, die SVG-Daten direkt zu manipulieren, und so schwer ist das auch nicht
Ich wünschte, es gäbe Bibliotheken oder Frameworks, die die Manipulation von SVG- oder Canvas-Ausgabe einfacher machen. Kleine Anpassungen sollten sehr leicht sein, aber je höher das Abstraktionsniveau des Frameworks ist, desto schwerer wird es, den vorgegebenen Pfad zu verlassen
Die Dokumentation ist auch ziemlich gut, aber es fehlt ein brauchbarer API-Referenzabschnitt, daher ist es nicht einfach, Funktionen zu entdecken
Ich versuche das Erstellen von Graphen mit HTML5-Canvas möglichst zu vermeiden, daher wäre ein neuer Ansatz beim Design interessant
Edit: Mit aktivierter Hardwarebeschleunigung läuft es flüssiger, aber selbst auf einem Ryzen 9 ruckelt es immer noch mehr als erwartet
Wenn man mich bitten würde, eine partielle Differentialgleichung zu lösen, die ich seit zehn Jahren nicht gesehen habe, käme ich vermutlich schneller wieder rein
Ich halte auch die D3-Referenzdokumentation für wirklich furchtbar
Inzwischen scheint es aber stabiler zu sein. Statt nur D3 zu verwenden, habe ich angefangen, mit Svelte+D3 in einem stärker imperativen Stil zu schreiben, und damit wurde es greifbarer
So konnte ich die erzeugten Elemente leichter verstehen, statt sie erst hinterher in den Developer Tools zu untersuchen
Diese Website hilft beim gemeinsamen Einsatz von D3 und Svelte: https://svelte.recipes/
80 % meiner Arbeit sind eher Anwendung, 10 % System und 10 % Datenanalyse, und manchmal baue ich zwei Wochen lang ein Jupyter-Notebook und schaue es dann zwei Monate lang nicht mehr an
Die meisten Plotting-Bibliotheken haben viele willkürliche Regeln, die man auswendig lernen muss, und meist mehrere kleine domänenspezifische Sprachen. Ein einfacher String wird dann deutlich komplizierter interpretiert als bei
atoiAußerdem gibt es in vielen Bereichen aus meiner Sicht Dinge, die falsch laufen, etwa bei der Bestimmung von Achsenbereichen oder beim Umgang mit sehr vielen Punkten
D3 zwingt einen dazu, vieles selbst zu machen, aber die Schnittstellen dafür sind konzeptionell intuitiv. Statt fremden, aufgeblähten und fehleranfälligen Allzweckcode mit einer API zu verwenden, die sich anfühlt, als würde man ein Schiff in einer Flasche zusammenbauen, baue ich es lieber ordentlich mit D3.js
Es ist leicht, es falsch zu verwenden, schwer zu debuggen und schwer zu verstehen
Das heißt nicht, dass sich dieses Problem leicht lösen lässt. Wenn ich sehr spezifische datengesteuerte Grafiken erstellen müsste, würde ich mich wahrscheinlich trotzdem wieder für D3 entscheiden
Wenn man ein wenig im Original von Newton liest, merkt man sofort, dass das nicht schon immer so war
APIs an so einem Maßstab zu messen, scheint eigentlich unfair zu sein
Code, den selbst der Autor nur schwer versteht, sollte man möglichst vermeiden, und D3 ist ein Paradebeispiel für so eine Bibliothek
Wenn man zum Beispiel Daten im Bereich von 0 bis 100 auf einem 1080p-Bildschirm mit 1920x1080 darstellt, muss man irgendwann entscheiden, wie man die Daten für die Bildschirmprojektion skaliert
Man kann die Mathematik selbst rechnen oder die Berechnung einer Bibliothek wie D3 überlassen
Auch wenn man Daten nicht im Web zeichnet, wird man sie irgendwann irgendwo visualisieren müssen, und dann ist es nützlich, in diesem Ökosystem Werkzeuge mit derselben Rolle zu finden
Soweit ich mich erinnere, musste ich die Rechtecke für den Graphen passend auf die Größe des gerade erzeugten PNG skalieren
Natürlich war das sehr trivial und überhaupt nicht mit den erstaunlichen Dingen vergleichbar, die D3 kann, aber es war eine großartige erste Erfahrung damit, selbst Bilder auf dem Computer zu erzeugen
Ich persönlich habe D3 nie als intuitiv empfunden. Das Problem könnte sein, dass es auf zu vielen Abstraktionsebenen zu viele Dinge gleichzeitig machen will
Wenn es nur um die Projektion von Daten ginge, wäre es leicht zu verstehen, aber die Projektion ist eng mit Achsen und anderen Elementen verknüpft, daher wirkt es wohl so
Ich würde sagen, dass das von mbostock als zentrale Abstraktion von D3 bezeichnete
selectund die Diff-Berechnung vonselecteher Komfortfunktionen sind, um ein wiederbetretbarespaint()zu schreiben.Im Grunde ist es nur so, dass
paint-Anweisungen als Builder-Anweisungen ausgedrückt werden, selbst in denselect-Gültigkeitsbereich gebunden sind und zur Erzielung verschiedener Effekte aufgeteilt werden können.Gerade im Animationsbeispiel ist erstaunlich wenig von dem, was D3 übernimmt, und man muss die äußere Schleife sowie die Verfolgung des Zustands über die Zeit selbst implementieren.
D3 bietet auch keine Abstraktion, um Visualisierungen als Funktion oder in anderer Form zu kapseln; dieser Teil bleibt als Übung dem Leser überlassen.
Für neue D3-Nutzer ist all das eine große Überraschung oder sogar ein Schock. Es ist ein bisschen so, als würde man eine neue Datenbank einführen und bekäme nur Bibliotheken für Datei-I/O, B-Baum-Indizes und Query-Optimierer, müsste aber alles selbst verdrahten.
Es ersetzt
d3-select, das DOM-Manipulationsmodul von D3, durch React. Dass das möglich ist und gut funktioniert, ist ein Beleg dafür, wie gut D3 entworfen ist.Je nach Ziel kann es das richtige Werkzeug sein oder auch nicht.
Verschiedene Hilfsfunktionen wie Easing oder Skalierung nutze ich weiterhin, aber die eigentlichen Komponenten baue ich heute mit modernen Frameworks. In meinem Fall sind das Vue 3 und TypeScript.
Trotzdem bin ich D3.js dankbar für die großartige Zeit und dafür, dass es mir viele gute Praktiken der Datenvisualisierung beigebracht hat.
Mike Bostocks Defaults und Demos waren inspirierend und Beispiele für hohe Standards und passten auch gut zu Tuftes Minimalismus.
D3 und jQuery sind sich in gewisser Weise ähnlich, und beide neigen dazu, zu Spaghetti-Code zu werden. Werkzeuge wie VisX fügen über dem verwendeten D3 viel Struktur hinzu und halten alles auf vernünftige Weise beherrschbar.
Ich frage mich nur, ob es sich eingeschränkt anfühlt, in dem Sinn, dass man mit dem Werkzeug kämpfen muss, sobald man etwas stärker Angepasstes bauen will, verglichen mit reinem D3.
Ein weiteres von GG inspiriertes Werkzeug ist das passend benannte ggplot2 für die Sprache R.
Es bietet eine deutlich knappere, stärker funktionale Schnittstelle und passt auch gut zu einem seltenen Werkzeug namens Rush, also R-Einzeilern für die Shell, mit denen man CSV per Pipe übergeben und schnell Grafiken erzeugen kann.
Solche Werkzeuge hängen meist von Browser-Funktionen ab oder verwenden unbeholfene Server-Side-Rendering-Lösungen mit Headless-Browsern für die serverseitige Erzeugung.
Besonders schön wäre es, Venn-Diagramme programmatisch erzeugen zu können. Merkwürdigerweise gibt es in diesem Bereich fast nichts.
Einige JavaScript-Chartbibliotheken unterstützen das zwar, aber insgesamt scheint es kaum Unterstützung zu geben.
gnuplot sieht gut aus, unterstützt aber keine Venn-Diagramme.
Es ist auch eine Abhängigkeit von OpenSearch Dashboards und ermöglicht es Nutzern, benutzerdefinierte Dashboards auf Basis von Log- und Observability-Daten zu erstellen[2].
Die Vega-Bibliothek könnte das von anderen angesprochene Problem der steilen Lernkurve von D3 zumindest teilweise entschärfen.
[1] https://vega.github.io/vega/docs/
[2] https://opensearch.org/docs/latest/dashboards/visualize/vega...