SlideShare a Scribd company logo
1 of 53
D3.JS TIPS & TRICKS
(export to svg, crossfilter, maps etc.)
_by Oleksii Prohonnyi
INTRODUCTION
Introduction
D3.js is a JavaScript library for manipulating
documents based on data.
 D3 - Data-Driven Documents
 d3js.org
 github.com/mbostock/d3
 github.com/mbostock/d3/wiki/API-Reference
DATA VISUALIZATION
Overview
 Data visualization is the presentation of data in a
pictorial or graphical format.
 Reasons to use:
 helps people see things that were not obvious
to them before;
 patterns can be spotted quickly and easily;
 conveys information in a universal manner;
 answer questions like “What would happen if
we made an adjustment to that area?”.
Tools
 Charts wizards (Libre Office, MS Office, Numbers)
 Google Charts
 Modest Maps (mapping tool)
 Visual.ly
 Tableau
 RAW (from Density Design)
 D3.js
See more
 www.storytellingwithdata.com
 vizwiz.blogspot.com
 www.visualisingdata.com
 flowingdata.com
 helpmeviz.com
 plot.ly (collaboration online tool)
D3 CORE
Selections
 A selection is an array of elements pulled from the
current document. D3 uses CSS3 to select elements.
 After selecting elements, you apply operators to them
to do stuff. These operators can get or set attributes,
styles, properties, HTML and text content.
 d3.select(selector), d3.select(node)
 d3.selectAll(selector), d3.selectAll(nodes)
 See more: github.com/mbostock/d3/wiki/Selections
Demo: core/selections.html
SVG
Scalable Vector Graphics (SVG) is an XML-based
vector image format for two-dimensional graphics with
support for interactivity and animation.
 Shapes - generate geometric shapes and
primitives in SVG.
 Axes - generate standard axes for visualizations in
SVG.
 Controls - generate standard interactive
visualization controls in SVG.
Demo: core/svg.html
External resources
 d3.csv - request a comma-separated values (CSV) file.
 d3.html - request an HTML document fragment.
 d3.json - request a JSON blob.
 d3.text - request a text file.
 d3.tsv - request a tab-separated values (TSV) file.
 d3.xhr - request a resource using XMLHttpRequest.
 d3.xml - request an XML document fragment.
 See more: github.com/mbostock/d3/wiki/Requests
Demo: core/external-data.html
Scales
 Quantitative Scales - for continuous input
domains, such as numbers.
 Ordinal Scales - for discrete input domains,
such as names or categories.
 Time Scales - for time domains.
Layouts
 A layout encapsulates a strategy for laying out data elements
visually, relative to each other. Many layouts are built in to D3
itself:
 Chord - produce a chord diagram from a matrix of relationships.
 Partition - recursively partition a node tree into a sunburst or icicle.
 Pie - compute the start and end angles for arcs in a pie or donut
chart.
 Tree - position a tree of nodes tidily.
 etc.
 See more: github.com/mbostock/d3/wiki/Layouts
Demo: core/layouts.html
Transitions
 A special type of selection where the operators apply
smoothly over time rather than instantaneously.
 May have per-element delays and durations, computed
using functions of data similar to other operators.
 Multiple transitions may operate on any selection
sequentially or in parallel.
 See more: github.com/mbostock/d3/wiki/Transitions
Demo: core/transitions.html
Geography
 Paths - display geographic shapes.
 Projections - convert locations (latitude and
longitude) to pixel coordinates.
 Streams - streaming geometry transformations.
Even more
 Formatting
 Colors
 Localization
 Math
 Time
 etc.
Demo: core/other.html
Charts
Main purpose of data visualization:
 Comparison
 Composition
 Distribution
 Relationship
 See more:
www.storytellingwithdata.com/blog/2013/04/chart-chooser
 Try by yourself:
labs.juiceanalytics.com/chartchooser/index.html
Source: storytellingwithdata.com
D3 COOKBOOK
Coordinates axes
 Task:
 change chart 0,0 coordinate position to
svg left bottom corner.
 Solutions:
 y coordinate of chart bars should be
calculated depending on chart height;
 set range of the axis scale.
Demo: cookbook/coordinates.html
Multiple graphs
 Task:
 arrange more than one d3 graph on a web
page
 Solution:
 use a separate container and selector for
each of the graphs
Demo: cookbook/multi-graph.html
User actions
 Task:
 handle user’s mouse events on a graph
element and change view of groups
corresponding to them
 Solution:
 default JavaScript events should be
listened through on function
Demo: cookbook/mouse-events.html
Runtime dataset
 Task:
 change graph’s dataset in runtime on user
action
 Solution:
 request a new dataset after page load,
redraw existing svg element
Demo: cookbook/runtime-dataset.html
User-friendly graph’s API
 Task:
 create and configure the graph using user-
friendly API
 Solution:
 use dimple.js library for d3 core wrapping
and work with DOM through the API
 use c3.js library for d3 core wrapping and
work with DOM through the API
Demo: cookbook/friendly-api.html
Export to svg
 Task:
 export the graph to svg file
 Solution:
 browser build-in functionality (<img>, <canvas>)
 server-side conversion of svg data
 node.js/phantom.js for saving svg data into file
 canvas graph copy export (canvg.js)
 FileSaver.js API using
Demo: cookbook/export-to-svg.html
Export to svg – FileSaver.js API using
 Connect Blob.js and FileSaver.js scripts.
 Graph should be implemented using svg.
 Use FileSaver.js API:
Demo: cookbook/export-to-svg.html
Sankey diagram
 Task:
 visualize dataset using Sankey diagram
 Solution:
 compose d3 bar and line charts
 Sankey library
 Sankey plugin for d3
Demo: cookbook/sankey.html
Sankey diagram – About
 A specific type of flow diagram, in which the width
of the arrows is shown proportionally to the flow
quantity.
 Are typically used to visualize energy or material or
cost transfers between processes. They can also
visualize the energy accounts or material flow
accounts on a regional or national level.
 See more: www.sankey-diagrams.com
Sankey diagram – About
Source: wikimedia.org
Sankey diagram – Sankey plugin
 Connect sankey.js script.
 Dataset should contain “links” and “nodes” collections.
 Use Sankey plugin:
Demo: cookbook/sankey.html
Force layout diagram
 Task:
 visualize dataset using force layout
diagram
 Solution:
 instantiate d3.layout.force object and
extend it with configurations
Demo: cookbook/force-layout.html
Force layout diagram – About
 It’s purpose: to position the nodes of a graph in two-
dimensional or three-dimensional space so that all the
edges are of more or less equal length and there are as few
crossing edges as possible.
 It could be implemented by assigning forces among the set
of edges and the set of nodes, based on their relative
positions, and then using these forces either to simulate the
motion of the edges and nodes or to minimize their energy.
 See more: github.com/mbostock/d3/wiki/Force-Layout
Force layout diagram – About
Source: homes.cs.washington.edu
Force layout diagram – Pros & Cons
Pros:
 Good-quality results
 Flexibility
 Intuitive
 Simplicity
 Interactivity
 Strong theoretical
foundations
Cons:
 High running time
 Poor local minima
Force layout diagram – Implementation
 Dataset should contain “links” and “nodes” collections.
 Use d3.layout.force() function:
Demo: cookbook/force-layout.html
Map
 Task:
 visualize dataset using geographical
features of D3
 Solution:
 use d3.geo object for data display and it’s
manipulation
Demo: cookbook/map-simple.html
Map – Geo Paths
 For cartographic visualizations, D3 supports a handful of
components for displaying and manipulating geographic data.
 Datasets could be presented in the following formats:
 Shape file (binary format) – could be converted using
ogr2ogr utility
 GeoJSON - a standard way of representing geographic
features in JavaScript
 TopoJSON - an extension of GeoJSON that is significantly
more compact
 The primary mechanism for displaying geographic data is
d3.geo.path.
Map – Projections
Map – Projections
D3 includes several common projections by
default. All of them are presented below:
 d3.geo.albersUsa
 d3.geo.azimuthalEqualArea
 d3.geo.azimuthalEquidistant
 d3.geo.conicEqualArea
 d3.geo.conicConformal
 d3.geo.conicEquidistant
 d3.geo.equirectangular
 d3.geo.gnomonic
 d3.geo.Mercator
 d3.geo.orthographic
 d3.geo.stereographic
 d3.geo.transverseMercator
Map – Projections
 Numerous (less-commonly used) projections are
available in the extended geographic projections
plugin and the polyhedral projection plugin.
 Most projections provided by D3 are created via
d3.geo.projection and are configurable.
Map – Geo Streams
 For fast transformations of geometry without
temporary copies of geometry objects, D3 uses
geometry streams.
 The main d3.geo.stream method converts a
GeoJSON input object to a stream: a series of
method calls on a stream listener.
 See more: github.com/mbostock/d3/wiki/Geo-
Streams
Map – Implementation
 Finding Data
 Installing Tools
 Converting Data
 Loading Data
 Displaying Polygons
 Styling Polygons
 Displaying Boundaries
 Displaying Places
 Do magic
Demo: cookbook/map-advanced.html
The road to data nirvana:
 Step 1: Raw data
 Step 2: Visualize data
 Step 3: Interact with data
 Step 4: Data immersion
One more thing
Data immersion – Crossfilter
 Crossfilter is a JavaScript library for exploring large
datasets that include many variables in the browser.
 Crossfilter provides a map-reduce function to data
using “dimensions” and “groups”.
 MapReduce is a programming model for processing
large data sets with a parallel, distributed algorithm on
a cluster.
 See more: square.github.io/crossfilter
Demo: cookbook/crossfilter.html
Data immersion – Dc.js
 Dc.js is designed to be an enabler for both libraries
(Crossfilter.js and D3.js). Taking the power of
crossfilter's data manipulation capabilities and
integrating the graphical capabilities of d3.js.
 It is designed to provide access to a range of
different chart types in a relatively easy to use
fashion.
 See more: dc-js.github.io/dc.js
Demo: cookbook/dc-js.html
Data immersion – Dc.js
The different (generic) types of chart that dc.js
supports are:
 Bar Chart
 Pie Chart
 Row Chart
 Line Chart
 Bubble Chart
 Geo Choropleth Chart
 Data Table
Demo: cookbook/dc-js.html
More examples
 github.com/mbostock/d3/wiki/Tutorials
 github.com/mbostock/d3/wiki/Gallery
 bost.ocks.org/mike
 bl.ocks.org/mbostock
 christopheviau.com/d3list
 techslides.com/over-1000-d3-js-examples-and-
demos
REFERENCES
References
 “Getting Started with D3” (Mike Dewar, 2012)
 “D3.js in Action” (Elijah Meeks, 2014)
 “D3 Tips and Tricks” (Malcolm Maclean, 2013)
 “Data Visualization with d3.js Cookbook” (Ari
Lerner, Victor Powell, 2014)
 github.com/mbostock/d3/wiki/Tutorials
 dashingd3js.com
THANK YOU
FOR YOUR ATTENTION
Q&A
Oleksii Prohonnyi
 oprohonnyi@gmail.com
 fb.com/oprohonnyi
 linkedin.com/in/oprohonnyi/en
 Sources: goo.gl/gjgHwO

More Related Content

Viewers also liked

Exploradores.caroes
Exploradores.caroesExploradores.caroes
Exploradores.caroesmaryespitia
 
Front-end rich JavaScript application creation (Backbone.js)
Front-end rich JavaScript application creation (Backbone.js)Front-end rich JavaScript application creation (Backbone.js)
Front-end rich JavaScript application creation (Backbone.js)Oleksii Prohonnyi
 
Как создать сайт за 2 часа? (Wordpress)
Как создать сайт за 2 часа? (Wordpress)Как создать сайт за 2 часа? (Wordpress)
Как создать сайт за 2 часа? (Wordpress)Oleksii Prohonnyi
 
Dive into Angular, part 5: Experience
Dive into Angular, part 5: ExperienceDive into Angular, part 5: Experience
Dive into Angular, part 5: ExperienceOleksii Prohonnyi
 
Conference DotJS 2015 Paris review
Conference DotJS 2015 Paris reviewConference DotJS 2015 Paris review
Conference DotJS 2015 Paris reviewOleksii Prohonnyi
 
Разработка веб-сайта. Сайт. Зачем он?
Разработка веб-сайта. Сайт. Зачем он?Разработка веб-сайта. Сайт. Зачем он?
Разработка веб-сайта. Сайт. Зачем он?Oleksii Prohonnyi
 
Dive into Angular, part 3: Performance
Dive into Angular, part 3: PerformanceDive into Angular, part 3: Performance
Dive into Angular, part 3: PerformanceOleksii Prohonnyi
 
Chorme devtools
Chorme devtoolsChorme devtools
Chorme devtools傑倫 鍾
 
Dive into Angular, part 1: Introduction
Dive into Angular, part 1: IntroductionDive into Angular, part 1: Introduction
Dive into Angular, part 1: IntroductionOleksii Prohonnyi
 
Chrome DevTools Awesome 10 Features +1
Chrome DevTools Awesome 10 Features +1Chrome DevTools Awesome 10 Features +1
Chrome DevTools Awesome 10 Features +1yoshikawa_t
 
Google Chrome DevTools features overview
Google Chrome DevTools features overviewGoogle Chrome DevTools features overview
Google Chrome DevTools features overviewOleksii Prohonnyi
 
JavaScript Presentation Frameworks and Libraries
JavaScript Presentation Frameworks and LibrariesJavaScript Presentation Frameworks and Libraries
JavaScript Presentation Frameworks and LibrariesOleksii Prohonnyi
 
Dive into Angular, part 4: Angular 2.0
Dive into Angular, part 4: Angular 2.0Dive into Angular, part 4: Angular 2.0
Dive into Angular, part 4: Angular 2.0Oleksii Prohonnyi
 
Code review process with JetBrains UpSource
Code review process with JetBrains UpSourceCode review process with JetBrains UpSource
Code review process with JetBrains UpSourceOleksii Prohonnyi
 

Viewers also liked (19)

reveal.js 3.0.0
reveal.js 3.0.0reveal.js 3.0.0
reveal.js 3.0.0
 
Managing Remote Teams
Managing Remote TeamsManaging Remote Teams
Managing Remote Teams
 
Exploradores.caroes
Exploradores.caroesExploradores.caroes
Exploradores.caroes
 
Front-end rich JavaScript application creation (Backbone.js)
Front-end rich JavaScript application creation (Backbone.js)Front-end rich JavaScript application creation (Backbone.js)
Front-end rich JavaScript application creation (Backbone.js)
 
Как создать сайт за 2 часа? (Wordpress)
Как создать сайт за 2 часа? (Wordpress)Как создать сайт за 2 часа? (Wordpress)
Как создать сайт за 2 часа? (Wordpress)
 
Dive into Angular, part 5: Experience
Dive into Angular, part 5: ExperienceDive into Angular, part 5: Experience
Dive into Angular, part 5: Experience
 
Conference DotJS 2015 Paris review
Conference DotJS 2015 Paris reviewConference DotJS 2015 Paris review
Conference DotJS 2015 Paris review
 
Разработка веб-сайта. Сайт. Зачем он?
Разработка веб-сайта. Сайт. Зачем он?Разработка веб-сайта. Сайт. Зачем он?
Разработка веб-сайта. Сайт. Зачем он?
 
Dive into Angular, part 3: Performance
Dive into Angular, part 3: PerformanceDive into Angular, part 3: Performance
Dive into Angular, part 3: Performance
 
Chorme devtools
Chorme devtoolsChorme devtools
Chorme devtools
 
OpenLayer's basics
OpenLayer's basicsOpenLayer's basics
OpenLayer's basics
 
Dive into Angular, part 1: Introduction
Dive into Angular, part 1: IntroductionDive into Angular, part 1: Introduction
Dive into Angular, part 1: Introduction
 
Chrome DevTools Awesome 10 Features +1
Chrome DevTools Awesome 10 Features +1Chrome DevTools Awesome 10 Features +1
Chrome DevTools Awesome 10 Features +1
 
Bower introduction
Bower introductionBower introduction
Bower introduction
 
Google Chrome DevTools features overview
Google Chrome DevTools features overviewGoogle Chrome DevTools features overview
Google Chrome DevTools features overview
 
Introduction to D3.js
Introduction to D3.jsIntroduction to D3.js
Introduction to D3.js
 
JavaScript Presentation Frameworks and Libraries
JavaScript Presentation Frameworks and LibrariesJavaScript Presentation Frameworks and Libraries
JavaScript Presentation Frameworks and Libraries
 
Dive into Angular, part 4: Angular 2.0
Dive into Angular, part 4: Angular 2.0Dive into Angular, part 4: Angular 2.0
Dive into Angular, part 4: Angular 2.0
 
Code review process with JetBrains UpSource
Code review process with JetBrains UpSourceCode review process with JetBrains UpSource
Code review process with JetBrains UpSource
 

Similar to D3.JS Tips & Tricks (export to svg, crossfilter, maps etc.)

"Визуализация данных с помощью d3.js", Михаил Дунаев, MoscowJS 19
"Визуализация данных с помощью d3.js", Михаил Дунаев, MoscowJS 19"Визуализация данных с помощью d3.js", Михаил Дунаев, MoscowJS 19
"Визуализация данных с помощью d3.js", Михаил Дунаев, MoscowJS 19MoscowJS
 
React, D3 and the dataviz ecosystem
React, D3 and the dataviz ecosystemReact, D3 and the dataviz ecosystem
React, D3 and the dataviz ecosystemMarcos Iglesias
 
GIS 5103 – Fundamentals of GISLecture 83D GIS.docx
GIS 5103 – Fundamentals of GISLecture 83D GIS.docxGIS 5103 – Fundamentals of GISLecture 83D GIS.docx
GIS 5103 – Fundamentals of GISLecture 83D GIS.docxshericehewat
 
D3js learning tips
D3js learning tipsD3js learning tips
D3js learning tipsLearningTech
 
Graph computation
Graph computationGraph computation
Graph computationSigmoid
 
School of Computing, Science & EngineeringAssessment Briefin.docx
School of Computing, Science & EngineeringAssessment Briefin.docxSchool of Computing, Science & EngineeringAssessment Briefin.docx
School of Computing, Science & EngineeringAssessment Briefin.docxanhlodge
 
ESRI Dev Meetup: Building Distributed JavaScript Map Widgets
ESRI Dev Meetup: Building Distributed JavaScript Map WidgetsESRI Dev Meetup: Building Distributed JavaScript Map Widgets
ESRI Dev Meetup: Building Distributed JavaScript Map WidgetsAllan Glen
 
Data visualization in python/Django
Data visualization in python/DjangoData visualization in python/Django
Data visualization in python/Djangokenluck2001
 
Large-scale Recommendation Systems on Just a PC
Large-scale Recommendation Systems on Just a PCLarge-scale Recommendation Systems on Just a PC
Large-scale Recommendation Systems on Just a PCAapo Kyrölä
 
Learn D3.js in 90 minutes
Learn D3.js in 90 minutesLearn D3.js in 90 minutes
Learn D3.js in 90 minutesJos Dirksen
 
World wind java sdk in progess
World wind java sdk in progessWorld wind java sdk in progess
World wind java sdk in progessRaffaele de Amicis
 
Digital Fabrication Studio.03 _Software @ Aalto Media Factory
Digital Fabrication Studio.03 _Software @ Aalto Media FactoryDigital Fabrication Studio.03 _Software @ Aalto Media Factory
Digital Fabrication Studio.03 _Software @ Aalto Media FactoryMassimo Menichinelli
 
GraphQL & DGraph with Go
GraphQL & DGraph with GoGraphQL & DGraph with Go
GraphQL & DGraph with GoJames Tan
 
Eclipse Con Europe 2014 How to use DAWN Science Project
Eclipse Con Europe 2014 How to use DAWN Science ProjectEclipse Con Europe 2014 How to use DAWN Science Project
Eclipse Con Europe 2014 How to use DAWN Science ProjectMatthew Gerring
 
OpenStreetMap in 3D - current developments
OpenStreetMap in 3D - current developmentsOpenStreetMap in 3D - current developments
OpenStreetMap in 3D - current developmentsvirtualcitySYSTEMS GmbH
 
How to design an application correctly ?
How to design an application correctly ?How to design an application correctly ?
How to design an application correctly ?Guillaume AGIS
 

Similar to D3.JS Tips & Tricks (export to svg, crossfilter, maps etc.) (20)

"Визуализация данных с помощью d3.js", Михаил Дунаев, MoscowJS 19
"Визуализация данных с помощью d3.js", Михаил Дунаев, MoscowJS 19"Визуализация данных с помощью d3.js", Михаил Дунаев, MoscowJS 19
"Визуализация данных с помощью d3.js", Михаил Дунаев, MoscowJS 19
 
React, D3 and the dataviz ecosystem
React, D3 and the dataviz ecosystemReact, D3 and the dataviz ecosystem
React, D3 and the dataviz ecosystem
 
3DRepo
3DRepo3DRepo
3DRepo
 
GIS 5103 – Fundamentals of GISLecture 83D GIS.docx
GIS 5103 – Fundamentals of GISLecture 83D GIS.docxGIS 5103 – Fundamentals of GISLecture 83D GIS.docx
GIS 5103 – Fundamentals of GISLecture 83D GIS.docx
 
D3js learning tips
D3js learning tipsD3js learning tips
D3js learning tips
 
Graph computation
Graph computationGraph computation
Graph computation
 
School of Computing, Science & EngineeringAssessment Briefin.docx
School of Computing, Science & EngineeringAssessment Briefin.docxSchool of Computing, Science & EngineeringAssessment Briefin.docx
School of Computing, Science & EngineeringAssessment Briefin.docx
 
ESRI Dev Meetup: Building Distributed JavaScript Map Widgets
ESRI Dev Meetup: Building Distributed JavaScript Map WidgetsESRI Dev Meetup: Building Distributed JavaScript Map Widgets
ESRI Dev Meetup: Building Distributed JavaScript Map Widgets
 
Data visualization in python/Django
Data visualization in python/DjangoData visualization in python/Django
Data visualization in python/Django
 
Large-scale Recommendation Systems on Just a PC
Large-scale Recommendation Systems on Just a PCLarge-scale Recommendation Systems on Just a PC
Large-scale Recommendation Systems on Just a PC
 
CS267_Graph_Lab
CS267_Graph_LabCS267_Graph_Lab
CS267_Graph_Lab
 
DEX: Seminar Tutorial
DEX: Seminar TutorialDEX: Seminar Tutorial
DEX: Seminar Tutorial
 
Learn D3.js in 90 minutes
Learn D3.js in 90 minutesLearn D3.js in 90 minutes
Learn D3.js in 90 minutes
 
SVGD3Angular2React
SVGD3Angular2ReactSVGD3Angular2React
SVGD3Angular2React
 
World wind java sdk in progess
World wind java sdk in progessWorld wind java sdk in progess
World wind java sdk in progess
 
Digital Fabrication Studio.03 _Software @ Aalto Media Factory
Digital Fabrication Studio.03 _Software @ Aalto Media FactoryDigital Fabrication Studio.03 _Software @ Aalto Media Factory
Digital Fabrication Studio.03 _Software @ Aalto Media Factory
 
GraphQL & DGraph with Go
GraphQL & DGraph with GoGraphQL & DGraph with Go
GraphQL & DGraph with Go
 
Eclipse Con Europe 2014 How to use DAWN Science Project
Eclipse Con Europe 2014 How to use DAWN Science ProjectEclipse Con Europe 2014 How to use DAWN Science Project
Eclipse Con Europe 2014 How to use DAWN Science Project
 
OpenStreetMap in 3D - current developments
OpenStreetMap in 3D - current developmentsOpenStreetMap in 3D - current developments
OpenStreetMap in 3D - current developments
 
How to design an application correctly ?
How to design an application correctly ?How to design an application correctly ?
How to design an application correctly ?
 

More from Oleksii Prohonnyi

Dive into Angular, part 2: Architecture
Dive into Angular, part 2: ArchitectureDive into Angular, part 2: Architecture
Dive into Angular, part 2: ArchitectureOleksii Prohonnyi
 
Front-end development introduction (JavaScript). Part 2
Front-end development introduction (JavaScript). Part 2Front-end development introduction (JavaScript). Part 2
Front-end development introduction (JavaScript). Part 2Oleksii Prohonnyi
 
Front-end development introduction (HTML, CSS). Part 1
Front-end development introduction (HTML, CSS). Part 1Front-end development introduction (HTML, CSS). Part 1
Front-end development introduction (HTML, CSS). Part 1Oleksii Prohonnyi
 
Test-driven development & Behavior-driven development basics
Test-driven development & Behavior-driven development basicsTest-driven development & Behavior-driven development basics
Test-driven development & Behavior-driven development basicsOleksii Prohonnyi
 
JavaScript Coding Guidelines
JavaScript Coding GuidelinesJavaScript Coding Guidelines
JavaScript Coding GuidelinesOleksii Prohonnyi
 
Database Optimization (MySQL)
Database Optimization (MySQL)Database Optimization (MySQL)
Database Optimization (MySQL)Oleksii Prohonnyi
 
Usability of UI Design (motivation, heuristics, tools)
Usability of UI Design (motivation, heuristics, tools)Usability of UI Design (motivation, heuristics, tools)
Usability of UI Design (motivation, heuristics, tools)Oleksii Prohonnyi
 

More from Oleksii Prohonnyi (9)

Dive into Angular, part 2: Architecture
Dive into Angular, part 2: ArchitectureDive into Angular, part 2: Architecture
Dive into Angular, part 2: Architecture
 
BEM methodology overview
BEM methodology overviewBEM methodology overview
BEM methodology overview
 
Front-end development introduction (JavaScript). Part 2
Front-end development introduction (JavaScript). Part 2Front-end development introduction (JavaScript). Part 2
Front-end development introduction (JavaScript). Part 2
 
Front-end development introduction (HTML, CSS). Part 1
Front-end development introduction (HTML, CSS). Part 1Front-end development introduction (HTML, CSS). Part 1
Front-end development introduction (HTML, CSS). Part 1
 
Test-driven development & Behavior-driven development basics
Test-driven development & Behavior-driven development basicsTest-driven development & Behavior-driven development basics
Test-driven development & Behavior-driven development basics
 
JavaScript Coding Guidelines
JavaScript Coding GuidelinesJavaScript Coding Guidelines
JavaScript Coding Guidelines
 
Database Optimization (MySQL)
Database Optimization (MySQL)Database Optimization (MySQL)
Database Optimization (MySQL)
 
PHPCS (PHP Code Sniffer)
PHPCS (PHP Code Sniffer)PHPCS (PHP Code Sniffer)
PHPCS (PHP Code Sniffer)
 
Usability of UI Design (motivation, heuristics, tools)
Usability of UI Design (motivation, heuristics, tools)Usability of UI Design (motivation, heuristics, tools)
Usability of UI Design (motivation, heuristics, tools)
 

Recently uploaded

WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2
 
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2
 
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next IntegrationWSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next IntegrationWSO2
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
WSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid EnvironmentsWSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid EnvironmentsWSO2
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2
 
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...WSO2
 
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...WSO2
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxAnnaArtyushina1
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2
 
WSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2
 

Recently uploaded (20)

WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next IntegrationWSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
WSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid EnvironmentsWSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid Environments
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
 
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AI
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
WSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in Uganda
 

D3.JS Tips & Tricks (export to svg, crossfilter, maps etc.)

  • 1. D3.JS TIPS & TRICKS (export to svg, crossfilter, maps etc.) _by Oleksii Prohonnyi
  • 2.
  • 4. Introduction D3.js is a JavaScript library for manipulating documents based on data.  D3 - Data-Driven Documents  d3js.org  github.com/mbostock/d3  github.com/mbostock/d3/wiki/API-Reference
  • 6. Overview  Data visualization is the presentation of data in a pictorial or graphical format.  Reasons to use:  helps people see things that were not obvious to them before;  patterns can be spotted quickly and easily;  conveys information in a universal manner;  answer questions like “What would happen if we made an adjustment to that area?”.
  • 7.
  • 8. Tools  Charts wizards (Libre Office, MS Office, Numbers)  Google Charts  Modest Maps (mapping tool)  Visual.ly  Tableau  RAW (from Density Design)  D3.js
  • 9. See more  www.storytellingwithdata.com  vizwiz.blogspot.com  www.visualisingdata.com  flowingdata.com  helpmeviz.com  plot.ly (collaboration online tool)
  • 11. Selections  A selection is an array of elements pulled from the current document. D3 uses CSS3 to select elements.  After selecting elements, you apply operators to them to do stuff. These operators can get or set attributes, styles, properties, HTML and text content.  d3.select(selector), d3.select(node)  d3.selectAll(selector), d3.selectAll(nodes)  See more: github.com/mbostock/d3/wiki/Selections Demo: core/selections.html
  • 12. SVG Scalable Vector Graphics (SVG) is an XML-based vector image format for two-dimensional graphics with support for interactivity and animation.  Shapes - generate geometric shapes and primitives in SVG.  Axes - generate standard axes for visualizations in SVG.  Controls - generate standard interactive visualization controls in SVG. Demo: core/svg.html
  • 13. External resources  d3.csv - request a comma-separated values (CSV) file.  d3.html - request an HTML document fragment.  d3.json - request a JSON blob.  d3.text - request a text file.  d3.tsv - request a tab-separated values (TSV) file.  d3.xhr - request a resource using XMLHttpRequest.  d3.xml - request an XML document fragment.  See more: github.com/mbostock/d3/wiki/Requests Demo: core/external-data.html
  • 14. Scales  Quantitative Scales - for continuous input domains, such as numbers.  Ordinal Scales - for discrete input domains, such as names or categories.  Time Scales - for time domains.
  • 15. Layouts  A layout encapsulates a strategy for laying out data elements visually, relative to each other. Many layouts are built in to D3 itself:  Chord - produce a chord diagram from a matrix of relationships.  Partition - recursively partition a node tree into a sunburst or icicle.  Pie - compute the start and end angles for arcs in a pie or donut chart.  Tree - position a tree of nodes tidily.  etc.  See more: github.com/mbostock/d3/wiki/Layouts Demo: core/layouts.html
  • 16. Transitions  A special type of selection where the operators apply smoothly over time rather than instantaneously.  May have per-element delays and durations, computed using functions of data similar to other operators.  Multiple transitions may operate on any selection sequentially or in parallel.  See more: github.com/mbostock/d3/wiki/Transitions Demo: core/transitions.html
  • 17. Geography  Paths - display geographic shapes.  Projections - convert locations (latitude and longitude) to pixel coordinates.  Streams - streaming geometry transformations.
  • 18. Even more  Formatting  Colors  Localization  Math  Time  etc. Demo: core/other.html
  • 19. Charts Main purpose of data visualization:  Comparison  Composition  Distribution  Relationship  See more: www.storytellingwithdata.com/blog/2013/04/chart-chooser  Try by yourself: labs.juiceanalytics.com/chartchooser/index.html
  • 22. Coordinates axes  Task:  change chart 0,0 coordinate position to svg left bottom corner.  Solutions:  y coordinate of chart bars should be calculated depending on chart height;  set range of the axis scale. Demo: cookbook/coordinates.html
  • 23. Multiple graphs  Task:  arrange more than one d3 graph on a web page  Solution:  use a separate container and selector for each of the graphs Demo: cookbook/multi-graph.html
  • 24. User actions  Task:  handle user’s mouse events on a graph element and change view of groups corresponding to them  Solution:  default JavaScript events should be listened through on function Demo: cookbook/mouse-events.html
  • 25. Runtime dataset  Task:  change graph’s dataset in runtime on user action  Solution:  request a new dataset after page load, redraw existing svg element Demo: cookbook/runtime-dataset.html
  • 26. User-friendly graph’s API  Task:  create and configure the graph using user- friendly API  Solution:  use dimple.js library for d3 core wrapping and work with DOM through the API  use c3.js library for d3 core wrapping and work with DOM through the API Demo: cookbook/friendly-api.html
  • 27. Export to svg  Task:  export the graph to svg file  Solution:  browser build-in functionality (<img>, <canvas>)  server-side conversion of svg data  node.js/phantom.js for saving svg data into file  canvas graph copy export (canvg.js)  FileSaver.js API using Demo: cookbook/export-to-svg.html
  • 28. Export to svg – FileSaver.js API using  Connect Blob.js and FileSaver.js scripts.  Graph should be implemented using svg.  Use FileSaver.js API: Demo: cookbook/export-to-svg.html
  • 29. Sankey diagram  Task:  visualize dataset using Sankey diagram  Solution:  compose d3 bar and line charts  Sankey library  Sankey plugin for d3 Demo: cookbook/sankey.html
  • 30. Sankey diagram – About  A specific type of flow diagram, in which the width of the arrows is shown proportionally to the flow quantity.  Are typically used to visualize energy or material or cost transfers between processes. They can also visualize the energy accounts or material flow accounts on a regional or national level.  See more: www.sankey-diagrams.com
  • 31. Sankey diagram – About Source: wikimedia.org
  • 32. Sankey diagram – Sankey plugin  Connect sankey.js script.  Dataset should contain “links” and “nodes” collections.  Use Sankey plugin: Demo: cookbook/sankey.html
  • 33. Force layout diagram  Task:  visualize dataset using force layout diagram  Solution:  instantiate d3.layout.force object and extend it with configurations Demo: cookbook/force-layout.html
  • 34. Force layout diagram – About  It’s purpose: to position the nodes of a graph in two- dimensional or three-dimensional space so that all the edges are of more or less equal length and there are as few crossing edges as possible.  It could be implemented by assigning forces among the set of edges and the set of nodes, based on their relative positions, and then using these forces either to simulate the motion of the edges and nodes or to minimize their energy.  See more: github.com/mbostock/d3/wiki/Force-Layout
  • 35. Force layout diagram – About Source: homes.cs.washington.edu
  • 36. Force layout diagram – Pros & Cons Pros:  Good-quality results  Flexibility  Intuitive  Simplicity  Interactivity  Strong theoretical foundations Cons:  High running time  Poor local minima
  • 37. Force layout diagram – Implementation  Dataset should contain “links” and “nodes” collections.  Use d3.layout.force() function: Demo: cookbook/force-layout.html
  • 38. Map  Task:  visualize dataset using geographical features of D3  Solution:  use d3.geo object for data display and it’s manipulation Demo: cookbook/map-simple.html
  • 39. Map – Geo Paths  For cartographic visualizations, D3 supports a handful of components for displaying and manipulating geographic data.  Datasets could be presented in the following formats:  Shape file (binary format) – could be converted using ogr2ogr utility  GeoJSON - a standard way of representing geographic features in JavaScript  TopoJSON - an extension of GeoJSON that is significantly more compact  The primary mechanism for displaying geographic data is d3.geo.path.
  • 41. Map – Projections D3 includes several common projections by default. All of them are presented below:  d3.geo.albersUsa  d3.geo.azimuthalEqualArea  d3.geo.azimuthalEquidistant  d3.geo.conicEqualArea  d3.geo.conicConformal  d3.geo.conicEquidistant  d3.geo.equirectangular  d3.geo.gnomonic  d3.geo.Mercator  d3.geo.orthographic  d3.geo.stereographic  d3.geo.transverseMercator
  • 42. Map – Projections  Numerous (less-commonly used) projections are available in the extended geographic projections plugin and the polyhedral projection plugin.  Most projections provided by D3 are created via d3.geo.projection and are configurable.
  • 43. Map – Geo Streams  For fast transformations of geometry without temporary copies of geometry objects, D3 uses geometry streams.  The main d3.geo.stream method converts a GeoJSON input object to a stream: a series of method calls on a stream listener.  See more: github.com/mbostock/d3/wiki/Geo- Streams
  • 44. Map – Implementation  Finding Data  Installing Tools  Converting Data  Loading Data  Displaying Polygons  Styling Polygons  Displaying Boundaries  Displaying Places  Do magic Demo: cookbook/map-advanced.html
  • 45. The road to data nirvana:  Step 1: Raw data  Step 2: Visualize data  Step 3: Interact with data  Step 4: Data immersion One more thing
  • 46. Data immersion – Crossfilter  Crossfilter is a JavaScript library for exploring large datasets that include many variables in the browser.  Crossfilter provides a map-reduce function to data using “dimensions” and “groups”.  MapReduce is a programming model for processing large data sets with a parallel, distributed algorithm on a cluster.  See more: square.github.io/crossfilter Demo: cookbook/crossfilter.html
  • 47. Data immersion – Dc.js  Dc.js is designed to be an enabler for both libraries (Crossfilter.js and D3.js). Taking the power of crossfilter's data manipulation capabilities and integrating the graphical capabilities of d3.js.  It is designed to provide access to a range of different chart types in a relatively easy to use fashion.  See more: dc-js.github.io/dc.js Demo: cookbook/dc-js.html
  • 48. Data immersion – Dc.js The different (generic) types of chart that dc.js supports are:  Bar Chart  Pie Chart  Row Chart  Line Chart  Bubble Chart  Geo Choropleth Chart  Data Table Demo: cookbook/dc-js.html
  • 49. More examples  github.com/mbostock/d3/wiki/Tutorials  github.com/mbostock/d3/wiki/Gallery  bost.ocks.org/mike  bl.ocks.org/mbostock  christopheviau.com/d3list  techslides.com/over-1000-d3-js-examples-and- demos
  • 51. References  “Getting Started with D3” (Mike Dewar, 2012)  “D3.js in Action” (Elijah Meeks, 2014)  “D3 Tips and Tricks” (Malcolm Maclean, 2013)  “Data Visualization with d3.js Cookbook” (Ari Lerner, Victor Powell, 2014)  github.com/mbostock/d3/wiki/Tutorials  dashingd3js.com
  • 52. THANK YOU FOR YOUR ATTENTION
  • 53. Q&A Oleksii Prohonnyi  oprohonnyi@gmail.com  fb.com/oprohonnyi  linkedin.com/in/oprohonnyi/en  Sources: goo.gl/gjgHwO