SlideShare una empresa de Scribd logo
1 de 54
Descargar para leer sin conexión
D3 Data
Visualization
USE CASES
Nation’s Report Card.gov
Shapes: Natural Earth
Projection: Albers USA
GlobalChange.gov
Shapes: custom
agilebpa.forumone.com
BUILDING
BLOCKS
Scalable Vector Graphics (SVG)
Scalable Vector Graphics (SVG) is an XML-based
vector image format for two-dimensional graphics
with support for interactivity and animation.
SVG Highlights
● DOM API
● Defines vector-based graphics for the Web
● Supports CSS styling
● Element Grouping
● Hyperlinks
● Accessible alternative content
● Path elements for arbitrary drawing
SVG support by browser
Source: Can I use...
Common SVG Elements
svg
- Container element
circle, rect, line, ...
- Various shape elements
path
- Arbitrary drawing paths
- ‘d’ attribute for path data
g
- Used for grouping
a
- Links of course
text
- Textual content
SVG Attributes
fill
- color of the inside of an element
stroke
- color of the border of an element
stroke-width
- width of the border
stroke-dasharray
- customizable dashes for lines
<html>
<body>
<h1>My first SVG</h1>
<svg width="600" height="600">
</svg>
</body>
</html>
My first SVG
<html>
<body>
<h1>My first SVG</h1>
<svg width="600" height="600">
<rect width="300" height="200">
</svg>
</body>
</html>
My first SVG
<html>
<body>
<h1>My first SVG</h1>
<svg width="600" height="600">
<rect width="300" height="200" fill="red"
stroke="black" stroke-width="4">
</svg>
</body>
</html>
My first SVG
<html>
<body>
<h1>My first SVG</h1>
<svg width="600" height="600">
<rect width="300" height="200" fill="red"
stroke="black" stroke-width="4">
<circle r="80" fill="purple" />
</svg>
</body>
</html>
My first SVG
<html>
<body>
<h1>My first SVG</h1>
<svg width="600" height="600">
<rect width="300" height="200" fill="red"
stroke="black" stroke-width="4" x="10" y="10" />
<circle r="80" fill="purple" cx="100" cy="100" />
</svg>
</body>
</html>
My first SVG
<html>
<body>
<h1>My first SVG</h1>
<svg width="600" height="600">
<rect width="300" height="200" fill="red"
stroke="black" stroke-width="4" x="10" y="10" />
<circle r="80" fill="purple" cx="100" cy="100" />
<text x="70" y="80" fill="white">I love SVG!
</text>
</svg>
</body>
</html>
My first SVG
SVG Path
● M = moveto
● L = lineto
● H = horizontal lineto
● V = vertical lineto
● C = curveto
● S = smooth curveto
● Q = quadratic Bézier curve
● T = smooth quadratic Bézier curveto
● A = elliptical Arc
● Z = closepath
<html>
<body>
<h1>My first SVG</h1>
<svg width="600" height="600">
<path d="M150 0 L75 200 L225 200 Z" />
</svg>
</body>
</html>
My first SVG
SVG + CSS
<html>
<body>
<style>
svg path {
fill:red;
stroke-width:4;
stroke:black;
}
</style>
<h1>My first SVG</h1>
<svg width="600" height="600">
<path d="M150 0 L75 200 L225 200 Z" />
</svg>
</body>
</html>
My first SVG
SVG + CSS + D3
What is D3?
D3.js is a JavaScript library for
manipulating documents based on data.
- D3js.org
D3js is the glue between data and SVG.
Why should I use it?
● Cross Browser Compatibility
● Easy to learn API
● Good documentation and examples
● Expansive library of data visualizations
● Out-of-the-box functions:
○ XHR data loading
○ Geo data conversion
D3 Selections
d3.select(selector: string)
- query one element
d3.selectAll(selector: string)
- query multiple elements
Example: SVG Element
var svg = d3.select(‘body’)
.append(‘svg’)
.attr(‘width’, 960)
.attr(‘height’, 500);
Adding Attributes
append("circle")
.attr(‘cx’, 50)
.attr(‘cy’, 50)
.attr(‘r’, 40);
<div id="viz"/>
<script>
//Create a sized SVG surface within viz:
var vizsvg = d3.select("#viz")
.append("svg")
.attr("width", 600)
.attr("height", 600);
//Add to the svg surface a circle
var circle =
vizsvg.append("circle")
.attr("fill", "red")
.attr("r", 40)
.attr("cx", 50)
.attr("cy", 50);
</script>
Bring in the Data
Data Joins
update = selection.data(data)
Bind array of data to selection.
update.enter()
Iterates over data points that don’t have associated nodes.
update.exit()
Data nodes without matching data trigger this.
…
var dataset = [ 5, 10, 15, 20, 25 ];
var circles = svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle")
.attr("r", function(d) {
return d;
})
.attr("cx", function(d, i) {
// i is the current data node index
return (i * 50) + 25;
})
.attr("cy", h/2)
.attr("fill","red");
DRUPAL &
D3 MODULE
Common Integration Methods
Views with
Basic D3
Module
Libraries
Views with
Custom D3
Module
Libraries
Custom D3
WITHOUT
D3 Module
Why use the D3 module?
D3 Module Features
● Simple API
● Out-of-the-box basic visualizations
● Custom library support
● Simplified data binding through Views integration and
custom library
Views with Basic D3 Libraries
Select the Views Format
Add Your Fields
Select a D3 Library and Configure Data
Configure D3 Library Display
Views with Custom D3 Libraries
Custom D3 Library Files
● d3.myLibrary (folder at sites/SITE/libraries)
○ d3.myLibrary.libraries.info (contains info and
dependencies)
○ myLibrary.css (contains custom CSS)
○ myLibrary.js (contains custom D3 js)
○ views-setting.php (contains views info)
d3.myViz.libraries.info
name = My Vis
description = My Vis custom D3 display
files[js][] = myvis.js
files[js][] = nv.d3.min.js
files[css][] = myvis.css
version = 0.1
dependencies[] = d3.extend
dependencies[] = d3.tooltip
views[version] = 3.0
views[fields][rows][__data_type] = 2dnnv
views[fields][rows][x_label][label] = X label
views[fields][rows][x_label][type] = string
views[fields][rows][x_label][description] = The label that
appears on the X axis.
views[fields][rows][value] = { __repeated: TRUE, __cardinality: 0,
label: Numeric value, type: integer, description: The numeric
value that will be used to plot each dot (circle) on the line }
views[fields][legend][__cardinality] = 0
views[fields][legend][__data_type] = 1dn
views[fields][legend][label] = Line label
views[fields][legend][description] = The meaning of each
different line.
views[fields][legend][type] = string
views[settings] = views-settings.php
● Same as out the box D3 module
custom library info file with some
exceptions
myViz.js
(function($) {
Drupal.d3.myvis = function (select, settings) {
// Get the name of the DIV ID to place the visualization in
var div = (settings.id) ? settings.id : 'visualization';
// Get the height/width from the views settings
var height = (settings.height) ? settings.height : '400';
var width = (settings.width) ? settings.width : '600';
// Get the rows of content
var rows = settings.rows;
// Shift the yLabel names from the rows array
var yLabels = rows.map(function(d) { return d.shift(); });
// Get key names for content grouping
var key = settings.legend;
...
● Load data and configuration from
views into JS variables for later use
myViz.js (cont.)
…
var troopData = [];
// Force rows array into data structure noted above
for (var i in rows) {
var row = rows[i];
var items = [];
for (var j in row) {
var item = row[j];
items.push({
"label" : key[j],
"value" : item
});
}
troopData.push({
"key" : yLabels[i],
"values" : items
});
}
...
● Rearrange data structure to match the
following structure:
"key": "Dragon",
"color": "#E80CC8",
"values": [
{
"label" : "Cost" ,
"value" : 5
},
{
"label" : "Strength" ,
"value" : 5
}
]
myViz.js (cont.)
…
// Render the NVD3 Multi-Bar Horizontal Chart in the proper DIV
element
var chart;
nv.addGraph(function() {
chart = nv.models.multiBarHorizontalChart()
.x(function(d) { return d.label })
.y(function(d) { return d.value })
.margin({top: 30, right: 20, bottom: 50, left: 175})
.showValues(false) //Hide bar values
.showControls(false) //Hide group toggle option
.showYAxis(false); // Do not show yaxis values
d3.select('#' + div).append("svg") // Append SVG to views div
.attr("width",width) // Set SVG width and height
.attr("height",height)
.datum(troopData) // Inject Data
.call(chart); // Inject the chart call
nv.utils.windowResize(chart.update); // ensure proper sizing of
window
return chart;
});
}
})(jQuery);
● Create an NVD3 Multi-Bar-Horizontal-
Chart data visualization with the data
variables set previously
● Create an SVG element inside the
Views content DIV
● NVD3 chart will be injected into the
SVG element
Resulting Custom Data Visualization
Custom D3 WITHOUT D3 Module
D3 Fully Custom
1. Get data in a structured format (JSON, CSV, Array, etc.)
a. Views works best unless using outside data
2. Create custom D3js Drupal library
3. Create custom Drupal module/hook to invoke library where
needed
a. Commonly injected into the content of blocks, panes
and custom pages
4. Additional theming if needed
Keenan Holloway
Senior Developer
kholloway@forumone.com
www.forumone.com
THANK YOU!

Más contenido relacionado

La actualidad más candente

Introduction to django
Introduction to djangoIntroduction to django
Introduction to django
Ilian Iliev
 

La actualidad más candente (20)

chapter 6 data visualization ppt.pptx
chapter 6 data visualization ppt.pptxchapter 6 data visualization ppt.pptx
chapter 6 data visualization ppt.pptx
 
CartoDB Inside Out
CartoDB Inside OutCartoDB Inside Out
CartoDB Inside Out
 
What is data engineering?
What is data engineering?What is data engineering?
What is data engineering?
 
오픈소스 GIS 실습 (5)
오픈소스 GIS 실습 (5)오픈소스 GIS 실습 (5)
오픈소스 GIS 실습 (5)
 
Xhtml
XhtmlXhtml
Xhtml
 
Data Mining : Concepts and Techniques
Data Mining : Concepts and TechniquesData Mining : Concepts and Techniques
Data Mining : Concepts and Techniques
 
Dw & etl concepts
Dw & etl conceptsDw & etl concepts
Dw & etl concepts
 
Big Data: The 4 Layers Everyone Must Know
Big Data: The 4 Layers Everyone Must KnowBig Data: The 4 Layers Everyone Must Know
Big Data: The 4 Layers Everyone Must Know
 
Introduction To Django
Introduction To DjangoIntroduction To Django
Introduction To Django
 
Data mining basic fundamentals
Data mining basic fundamentalsData mining basic fundamentals
Data mining basic fundamentals
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
Introduction to django
Introduction to djangoIntroduction to django
Introduction to django
 
Data Engineering Basics
Data Engineering BasicsData Engineering Basics
Data Engineering Basics
 
Mastering RecyclerView Layouts
Mastering RecyclerView LayoutsMastering RecyclerView Layouts
Mastering RecyclerView Layouts
 
Gis and-sap-realestate-mgmt
Gis and-sap-realestate-mgmtGis and-sap-realestate-mgmt
Gis and-sap-realestate-mgmt
 
Hadoop & MapReduce
Hadoop & MapReduceHadoop & MapReduce
Hadoop & MapReduce
 
Modern-Data-Warehouses-In-The-Cloud-Use-Cases-Slim-Baltagi
Modern-Data-Warehouses-In-The-Cloud-Use-Cases-Slim-BaltagiModern-Data-Warehouses-In-The-Cloud-Use-Cases-Slim-Baltagi
Modern-Data-Warehouses-In-The-Cloud-Use-Cases-Slim-Baltagi
 
Database management systems
Database management systemsDatabase management systems
Database management systems
 
Introduction Django
Introduction DjangoIntroduction Django
Introduction Django
 
XML and Databases
XML and DatabasesXML and Databases
XML and Databases
 

Similar a D3 data visualization

Data Visualizations with D3
Data Visualizations with D3Data Visualizations with D3
Data Visualizations with D3
Doug Domeny
 
Mongo db washington dc 2014
Mongo db washington dc 2014Mongo db washington dc 2014
Mongo db washington dc 2014
ikanow
 

Similar a D3 data visualization (20)

D3.js 30-minute intro
D3.js   30-minute introD3.js   30-minute intro
D3.js 30-minute intro
 
SVGD3Angular2React
SVGD3Angular2ReactSVGD3Angular2React
SVGD3Angular2React
 
Visualization of Big Data in Web Apps
Visualization of Big Data in Web AppsVisualization of Big Data in Web Apps
Visualization of Big Data in Web Apps
 
D3js learning tips
D3js learning tipsD3js learning tips
D3js learning tips
 
SVG - Scalable Vector Graphics
SVG - Scalable Vector GraphicsSVG - Scalable Vector Graphics
SVG - Scalable Vector Graphics
 
Accessibility on SVG and SEO
Accessibility on SVG and SEOAccessibility on SVG and SEO
Accessibility on SVG and SEO
 
Accessibility on SVG and SEO
Accessibility on SVG and SEOAccessibility on SVG and SEO
Accessibility on SVG and SEO
 
Dreamforce 2014 - Introduction to d3.js
Dreamforce 2014 - Introduction to d3.jsDreamforce 2014 - Introduction to d3.js
Dreamforce 2014 - Introduction to d3.js
 
Html5
Html5Html5
Html5
 
Data Visualizations with D3
Data Visualizations with D3Data Visualizations with D3
Data Visualizations with D3
 
D3
D3D3
D3
 
The D3 Toolbox
The D3 ToolboxThe D3 Toolbox
The D3 Toolbox
 
Mongo db washington dc 2014
Mongo db washington dc 2014Mongo db washington dc 2014
Mongo db washington dc 2014
 
Svcc 2013-d3
Svcc 2013-d3Svcc 2013-d3
Svcc 2013-d3
 
SVCC 2013 D3.js Presentation (10/05/2013)
SVCC 2013 D3.js Presentation (10/05/2013)SVCC 2013 D3.js Presentation (10/05/2013)
SVCC 2013 D3.js Presentation (10/05/2013)
 
SenchaCon 2016: Add Magic to Your Ext JS Apps with D3 Visualizations - Vitaly...
SenchaCon 2016: Add Magic to Your Ext JS Apps with D3 Visualizations - Vitaly...SenchaCon 2016: Add Magic to Your Ext JS Apps with D3 Visualizations - Vitaly...
SenchaCon 2016: Add Magic to Your Ext JS Apps with D3 Visualizations - Vitaly...
 
Advanced D3 Charting
Advanced D3 ChartingAdvanced D3 Charting
Advanced D3 Charting
 
Introduction to data visualisation with D3
Introduction to data visualisation with D3Introduction to data visualisation with D3
Introduction to data visualisation with D3
 
Introduction to d3js (and SVG)
Introduction to d3js (and SVG)Introduction to d3js (and SVG)
Introduction to d3js (and SVG)
 
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Último (20)

Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 

D3 data visualization

  • 3. Nation’s Report Card.gov Shapes: Natural Earth Projection: Albers USA
  • 8. Scalable Vector Graphics (SVG) is an XML-based vector image format for two-dimensional graphics with support for interactivity and animation.
  • 9. SVG Highlights ● DOM API ● Defines vector-based graphics for the Web ● Supports CSS styling ● Element Grouping ● Hyperlinks ● Accessible alternative content ● Path elements for arbitrary drawing
  • 10. SVG support by browser Source: Can I use...
  • 11. Common SVG Elements svg - Container element circle, rect, line, ... - Various shape elements path - Arbitrary drawing paths - ‘d’ attribute for path data g - Used for grouping a - Links of course text - Textual content
  • 12. SVG Attributes fill - color of the inside of an element stroke - color of the border of an element stroke-width - width of the border stroke-dasharray - customizable dashes for lines
  • 13. <html> <body> <h1>My first SVG</h1> <svg width="600" height="600"> </svg> </body> </html> My first SVG
  • 14. <html> <body> <h1>My first SVG</h1> <svg width="600" height="600"> <rect width="300" height="200"> </svg> </body> </html> My first SVG
  • 15. <html> <body> <h1>My first SVG</h1> <svg width="600" height="600"> <rect width="300" height="200" fill="red" stroke="black" stroke-width="4"> </svg> </body> </html> My first SVG
  • 16. <html> <body> <h1>My first SVG</h1> <svg width="600" height="600"> <rect width="300" height="200" fill="red" stroke="black" stroke-width="4"> <circle r="80" fill="purple" /> </svg> </body> </html> My first SVG
  • 17. <html> <body> <h1>My first SVG</h1> <svg width="600" height="600"> <rect width="300" height="200" fill="red" stroke="black" stroke-width="4" x="10" y="10" /> <circle r="80" fill="purple" cx="100" cy="100" /> </svg> </body> </html> My first SVG
  • 18. <html> <body> <h1>My first SVG</h1> <svg width="600" height="600"> <rect width="300" height="200" fill="red" stroke="black" stroke-width="4" x="10" y="10" /> <circle r="80" fill="purple" cx="100" cy="100" /> <text x="70" y="80" fill="white">I love SVG! </text> </svg> </body> </html> My first SVG
  • 19. SVG Path ● M = moveto ● L = lineto ● H = horizontal lineto ● V = vertical lineto ● C = curveto ● S = smooth curveto ● Q = quadratic Bézier curve ● T = smooth quadratic Bézier curveto ● A = elliptical Arc ● Z = closepath
  • 20. <html> <body> <h1>My first SVG</h1> <svg width="600" height="600"> <path d="M150 0 L75 200 L225 200 Z" /> </svg> </body> </html> My first SVG
  • 22. <html> <body> <style> svg path { fill:red; stroke-width:4; stroke:black; } </style> <h1>My first SVG</h1> <svg width="600" height="600"> <path d="M150 0 L75 200 L225 200 Z" /> </svg> </body> </html> My first SVG
  • 23. SVG + CSS + D3
  • 24. What is D3? D3.js is a JavaScript library for manipulating documents based on data. - D3js.org D3js is the glue between data and SVG.
  • 25. Why should I use it? ● Cross Browser Compatibility ● Easy to learn API ● Good documentation and examples ● Expansive library of data visualizations ● Out-of-the-box functions: ○ XHR data loading ○ Geo data conversion
  • 26. D3 Selections d3.select(selector: string) - query one element d3.selectAll(selector: string) - query multiple elements
  • 27. Example: SVG Element var svg = d3.select(‘body’) .append(‘svg’) .attr(‘width’, 960) .attr(‘height’, 500);
  • 29. <div id="viz"/> <script> //Create a sized SVG surface within viz: var vizsvg = d3.select("#viz") .append("svg") .attr("width", 600) .attr("height", 600); //Add to the svg surface a circle var circle = vizsvg.append("circle") .attr("fill", "red") .attr("r", 40) .attr("cx", 50) .attr("cy", 50); </script>
  • 30. Bring in the Data
  • 31. Data Joins update = selection.data(data) Bind array of data to selection. update.enter() Iterates over data points that don’t have associated nodes. update.exit() Data nodes without matching data trigger this.
  • 32. … var dataset = [ 5, 10, 15, 20, 25 ]; var circles = svg.selectAll("circle") .data(dataset) .enter() .append("circle") .attr("r", function(d) { return d; }) .attr("cx", function(d, i) { // i is the current data node index return (i * 50) + 25; }) .attr("cy", h/2) .attr("fill","red");
  • 33.
  • 35. Common Integration Methods Views with Basic D3 Module Libraries Views with Custom D3 Module Libraries Custom D3 WITHOUT D3 Module
  • 36. Why use the D3 module?
  • 37. D3 Module Features ● Simple API ● Out-of-the-box basic visualizations ● Custom library support ● Simplified data binding through Views integration and custom library
  • 38. Views with Basic D3 Libraries
  • 39.
  • 42. Select a D3 Library and Configure Data
  • 44.
  • 45. Views with Custom D3 Libraries
  • 46. Custom D3 Library Files ● d3.myLibrary (folder at sites/SITE/libraries) ○ d3.myLibrary.libraries.info (contains info and dependencies) ○ myLibrary.css (contains custom CSS) ○ myLibrary.js (contains custom D3 js) ○ views-setting.php (contains views info)
  • 47. d3.myViz.libraries.info name = My Vis description = My Vis custom D3 display files[js][] = myvis.js files[js][] = nv.d3.min.js files[css][] = myvis.css version = 0.1 dependencies[] = d3.extend dependencies[] = d3.tooltip views[version] = 3.0 views[fields][rows][__data_type] = 2dnnv views[fields][rows][x_label][label] = X label views[fields][rows][x_label][type] = string views[fields][rows][x_label][description] = The label that appears on the X axis. views[fields][rows][value] = { __repeated: TRUE, __cardinality: 0, label: Numeric value, type: integer, description: The numeric value that will be used to plot each dot (circle) on the line } views[fields][legend][__cardinality] = 0 views[fields][legend][__data_type] = 1dn views[fields][legend][label] = Line label views[fields][legend][description] = The meaning of each different line. views[fields][legend][type] = string views[settings] = views-settings.php ● Same as out the box D3 module custom library info file with some exceptions
  • 48. myViz.js (function($) { Drupal.d3.myvis = function (select, settings) { // Get the name of the DIV ID to place the visualization in var div = (settings.id) ? settings.id : 'visualization'; // Get the height/width from the views settings var height = (settings.height) ? settings.height : '400'; var width = (settings.width) ? settings.width : '600'; // Get the rows of content var rows = settings.rows; // Shift the yLabel names from the rows array var yLabels = rows.map(function(d) { return d.shift(); }); // Get key names for content grouping var key = settings.legend; ... ● Load data and configuration from views into JS variables for later use
  • 49. myViz.js (cont.) … var troopData = []; // Force rows array into data structure noted above for (var i in rows) { var row = rows[i]; var items = []; for (var j in row) { var item = row[j]; items.push({ "label" : key[j], "value" : item }); } troopData.push({ "key" : yLabels[i], "values" : items }); } ... ● Rearrange data structure to match the following structure: "key": "Dragon", "color": "#E80CC8", "values": [ { "label" : "Cost" , "value" : 5 }, { "label" : "Strength" , "value" : 5 } ]
  • 50. myViz.js (cont.) … // Render the NVD3 Multi-Bar Horizontal Chart in the proper DIV element var chart; nv.addGraph(function() { chart = nv.models.multiBarHorizontalChart() .x(function(d) { return d.label }) .y(function(d) { return d.value }) .margin({top: 30, right: 20, bottom: 50, left: 175}) .showValues(false) //Hide bar values .showControls(false) //Hide group toggle option .showYAxis(false); // Do not show yaxis values d3.select('#' + div).append("svg") // Append SVG to views div .attr("width",width) // Set SVG width and height .attr("height",height) .datum(troopData) // Inject Data .call(chart); // Inject the chart call nv.utils.windowResize(chart.update); // ensure proper sizing of window return chart; }); } })(jQuery); ● Create an NVD3 Multi-Bar-Horizontal- Chart data visualization with the data variables set previously ● Create an SVG element inside the Views content DIV ● NVD3 chart will be injected into the SVG element
  • 51. Resulting Custom Data Visualization
  • 52. Custom D3 WITHOUT D3 Module
  • 53. D3 Fully Custom 1. Get data in a structured format (JSON, CSV, Array, etc.) a. Views works best unless using outside data 2. Create custom D3js Drupal library 3. Create custom Drupal module/hook to invoke library where needed a. Commonly injected into the content of blocks, panes and custom pages 4. Additional theming if needed