====== Visualisierung mit D3.js ======
Noah Bubenhofer, 28. Oktober 2014
[[https://pub.cl.uzh.ch/wiki/public/vis/d3js?do=export_reveal.js&theme=simple#/|Slideshow]]
===== Was ist D3.js? =====
* D3: Data-Driven Documents: [[http://d3js.org/]]
* JavaScript-Bibliothek um Dokumente aufgrund von Daten zu manipulieren: Bindet Daten an ein DOM (Document Object Model)-Dokument
* nutzt HTML, SVG and CSS
===== Beispiele =====
* Siehe: https://github.com/mbostock/d3/wiki/Gallery
* Politischer Einfluss: http://www.brightpointinc.com/interactive/political_influence/index.html?source=d3js
* Geokollokationen: http://www.bubenhofer.com/geocollocations/explorer/
===== Beispiele mit DB-Anbindung =====
* Dynamische Bar-Chart-Erstellung durch DB-Abfrage: [[http://linguistik.zih.tu-dresden.de/nbubenhofer/geocollocations/barchart.html|Beispiel im Web]], generelle [[http://bost.ocks.org/mike/bar/|Anleitung]] zu Bar Charts in D3.js
* Dynamische Karten-Darstellung durch DB-Abfrage: [[http://linguistik.zih.tu-dresden.de/nbubenhofer/geocollocations/d3.geocollocations.v6.html|Beispiel im Web]], generelle [[http://datamaps.github.io/|Anleitung]] zu Karten mit D3.js
* Dynamische Karten-Darstellung durch DB-Abfrage (ausführliche Version): [[http://linguistik.zih.tu-dresden.de/nbubenhofer/geocollocations/geocollocations.explorer.html|Beispiel im Web]]
* Code im Git [[http://rogerdudler.github.io/git-guide/|Anleitung]]: ''%%ssh://git@pub.cl.uzh.ch:11022/bubenhofer/vislingkurs.git%%''
* Vgl. dazu auch https://pub.cl.uzh.ch/wiki/public/pcl3/uebungvis
===== Tutorials, Einführungen =====
* https://github.com/mbostock/d3/wiki
* grundlegende Einführung: http://d3js.org/
* viele Tutorials mit unterschiedlichen Schwerpunkten: https://github.com/mbostock/d3/wiki/Tutorials
* mit hat gefallen: http://christopheviau.com/d3_tutorial/
* API-Referenz: https://github.com/mbostock/d3/wiki/API-Reference
===== Grundkonzeption =====
* Interface als HTML-Seite mit Javascript
* Visualisierung mit der Javascript-Bibliothek [[http://www.d3js.org|D3.js]]: SVG-Elemente
* Daten:
* einlesen von CSV-, XML- oder JSON-Datei
* Abfrage aus Datenbank; Abfrage-Interface über PHP
===== Einbettung in HTML =====
// Referenz zur D3-Bibliothek
// Hier kommen HTML-Elemente zur Seitengestaltung, Navigation etc.
===== Wichtigste Code-Bausteine =====
==== Daten laden ====
Wir rufen zunächst die zu visualisierenden Daten auf:
* mit ''d3.csv()'' eine CSV-Datei
* mit ''d3.tsv()'' eine Tab-separierte Datei
* mit ''d3.json()'' JSON-formatierte Daten
* ...
==== Code CSV ====
d3.csv("meinedaten.csv", function(error, data) {
// Wir machen etwas mit den Daten.
}
==== Code JSON ====
d3.json("php/dbquery.php?query=query", function(error, data) {
// Wir machen etwas mit den Daten.
}
==== Visualisierung der Daten ====
* Visualisierung auf einer [[https://de.wikipedia.org/wiki/Scalable_Vector_Graphics|SVG-Fläche]]
* Verwendung der ''d3.select''-Funktion, um ein DOM-Element auf der Webseite zu adressieren und daran ein SVG-Element anzubringen
==== Code SVG-Fläche erstellen ====
var svg = d3.select("#container").append("svg")
.attr("width", 700)
.attr("height", 500)
* Adressierung eines div-Elements mit der id "container"
* ''svg''-Element mit den Attributen ''width'' und ''height'' wird daran angehängt
==== Code Daten anbinden ====
var places = svg.selectAll("g")
.data(data)
.enter()
.append("g")
.attr("id", function(d) {
return "id"+ d.id;
})
var marker = places.append("circle")
.attr("r", "20")
.attr("fill", "black");
==== Code Daten anbinden (Erläuterungen) ====
* geladene Daten mit zu erstellenden ''g''-Elementen verknüpfen (mit denen wir die nachfolgenden SVG-Elemente gruppieren)
* mit ''selectAll("g")'' alle ggf. bereits vorhandenen ''g''-Elemente auswählen
* die Daten mit ''.data(data)'' daran anbinden
* ''.enter()'': neue Datensätze in den Daten werden zu ggf. bestehenden Daten hinzugefügt
* für jeden Datensatz wird ein neues ''g''-Element erstellt
* es können beliebige weitere SVG-Elemente mit Attributen erstellt werden – alles unterhalb ''.data(data).enter()'' wird für jeden Datensatz erstellt
==== Code Datenwerte verwenden (Erläuterungen) ====
* zu erstellenden Attributen können feste Werte zugewiesen werden: ''.attr("fill", "black")''
* oder aber dynamisch Werte aus dem Datensatz: Dafür wird die Konstruktion ''function(d) { return d.[Spaltenbezeichnung]; }'' verwendet
* die Funktion stellt mit ''d'' den aktuellen Datensatz bereit; mit ''d.[Spaltenbezeichnung]'' wird auf die Spalte zugegriffen (z.B. mit ''d.frequency'' auf einen Frequenzwert des Datensatzes)
==== Code Datenwerte verwenden ====
var places = svg.selectAll("g")
.data(data)
.enter()
.append("g")
.attr("id", function(d) {
return "id"+ d.id;
})
var marker = places.append("circle")
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", function(d) { return (1/d.frequency)*20; })
.attr("fill", "black");
==== Code DOM-Baum ====
Im Beispiel oben wird also für jeden Datensatz Folgendes erstellt:
==== Code Kartendarstellung (Erläuterungen) ====
* im Beispiel oben sind für die Datensätze x- und y-Werte vorhanden, die für die Darstellung verwendet werden können
* Spezialfall Kartendarstellung: hier sind x- und y-Werte die Koordinaten auf der Karte
* da eine Karte mit einer Projektion gezeichnet wird (Verzerrung der Kugelform auf Fläche) müssen die x- und y-Werte projiziert werden
* im nächsten Beispiel werden zur Berechnung der x- und y-Werte die Koordinaten der Funktion ''projection'' übergeben
==== Code Kartendarstellung ====
var places = svg.selectAll("g")
.data(data)
.enter()
.append("g")
.attr("id", function(d) {
return "id"+ d.id;
})
var marker = places.append("circle")
.attr("cx", function(d) { return projection([d.lon, d.lat])[0]; })
.attr("cy", function(d) { return projection([d.lon, d.lat])[1]; })
.attr("r", function(d) { return (1/d.frequency)*20; })
.attr("fill", "black");
* Komplettbeispiel Kartendarstellung: [[https://pub.cl.uzh.ch:11443/bubenhofer/vislingkurs/blob/master/geocollocations/d3.geocollocations.v6.html|Code]], [[http://linguistik.zih.tu-dresden.de/nbubenhofer/geocollocations/d3.geocollocations.v6.html|im Web]]
* Umfangreicheres Beispiel: [[https://pub.cl.uzh.ch:11443/bubenhofer/vislingkurs/blob/master/geocollocations/geocollocations.explorer.html|Code]], [[http://linguistik.zih.tu-dresden.de/nbubenhofer/geocollocations/geocollocations.explorer.html|im Web]]
===== Standarddiagramme =====
* Standardiagramme (Balken, Linien, Plots etc.) müssen nicht komplett gezeichnet werden; es gibt Standardfunktionen
* gute Ausgangspunkte:
* https://github.com/mbostock/d3/wiki/Gallery
* http://bost.ocks.org/mike/
* Beispiel Barchart: [[http://bost.ocks.org/mike/bar/|Tutorial]]
* Barchart interaktiv mit Datenbankanbindung: [[https://pub.cl.uzh.ch:11443/bubenhofer/vislingkurs/blob/master/geocollocations/barchart.html|Code]], [[http://linguistik.zih.tu-dresden.de/nbubenhofer/geocollocations/barchart.html|im Web]]