Logo D3.svg
Developer(s) Mike Bostock, Jason Davies, Jeffrey Heer, Vadim Ogievetsky, and community
Initial release 18 February 2011; 7 years ago (2011-02-18)
Stable release
5.5.0 / 16 June 2018; 3 months ago (2018-06-16)[1]
Repository Edit this at Wikidata
Written in JavaScript
Type Data visualization, JavaScript library
License BSD
Website d3js.org

D3.js (or just D3 for Data-Driven Documents) is a JavaScript library for producing dynamic, interactive data visualizations in web browsers. It makes use of the widely implemented SVG, HTML5, and CSS standards. It is the successor to the earlier Protovis framework.[2] In contrast to many other libraries, D3.js allows great control over the final visual result.[3] Its development was noted in 2011,[4] as version 2.0.0 was released in August 2011.[5]

D3.js is used on hundreds of thousands of websites.[6] Some popular uses include creating interactive graphics for online news websites, information dashboards for viewing data, and producing maps from GIS map making data. In addition, the exportable nature of SVG enables graphics created by D3 to be used in print publications.


There have been various previous attempts to bring data visualization to web browsers. The most notable examples were the Prefuse, Flare, and Protovis toolkits, which can all be considered as direct predecessors of D3.js.

Prefuse was a visualization toolkit created in 2005 that required usage of Java, and visualizations were rendered within browsers with a Java plug-in. Flare was a similar toolkit from 2007 that used ActionScript, and required a Flash plug-in for rendering.

In 2009, based on the experience of developing and utilizing Prefuse and Flare, Jeff Heer, Mike Bostock, and Vadim Ogievetsky of Stanford University's Stanford Visualization Group created Protovis, a JavaScript library to generate SVG graphics from data. The library was known to data visualization practitioners and academics.[7]

In 2011, the development of Protovis was stopped to focus on a new project, D3.js. Informed by experiences with Protovis, Bostock, along with Heer and Ogievetsky, developed D3.js to provide a more expressive framework that, at the same time, focuses on web standards and provides improved performance.[8]

Technical principles

Embedded within an HTML webpage, the JavaScript D3.js library uses pre-built JavaScript functions to select elements, create SVG objects, style them, or add transitions, dynamic effects or tooltips to them. These objects can also be widely styled using CSS. Large datasets can be easily bound to SVG objects using simple D3.js functions to generate rich text/graphic charts and diagrams. The data can be in various formats, most commonly JSON, comma-separated values (CSV) or geoJSON, but, if required, JavaScript functions can be written to read other data formats.


The central principle of D3.js design is to enable the programmer to first use a CSS-style selector to select a given set of Document Object Model (DOM) nodes, then use operators to manipulate them in a similar manner to jQuery.[9] For example, by using D3.js, one may select all HTML elements, and then change their text color, e.g. to lavender:

 d3.selectAll("p")                 // select all <p> elements
   .style("color", "lavender")     // set style "color" to value "lavender"
   .attr("class", "squares")       // set attribute "class" to value "squares"
   .attr("x", 50);                 // set attribute "x" (horizontal position) to value 50px

The selection can be based on tag (as in the above example), class, identifier, attribute, or place in the hierarchy. Once elements are selected, one can apply operations to them. This includes getting and setting attributes, display texts, and styles (as in the above example). Elements may also be added and removed. This process of modifying, creating and removing HTML elements can be made dependent on data, which is the basic concept of D3.js.


By declaring a transition, values for attributes and styles can be smoothly interpolated over a certain time. The following code will make all HTML elements on a page gradually change their text color to pink:

 d3.selectAll("p")             // select all <p> elements
   .transition("trans_1")      // transition with name "trans_1"
     .delay(0)                 // transition starting 0ms after trigger
     .duration(500)            // transitioning during 500ms
     .ease(d3.easeLinear)           // transition easing progression is linear...
   .style("color", "pink");    // ... to color:pink


For more advanced uses, loaded data drives the creation of elements. D3.js loads a given dataset, then, for each of its elements, creates an SVG object with associated properties (shape, colors, values) and behaviors (transitions, events).[10][11][12]

// Data
  var countriesData = [
     { name:"Ireland",  income:53000, life: 78, pop:6378, color: "black"},
     { name:"Norway",   income:73000, life: 87, pop:5084, color: "blue" },
     { name:"Tanzania", income:27000, life: 50, pop:3407, color: "grey" }
// Create SVG container
  var svg = d3.select("#hook").append("svg")
        .attr("width", 120)
        .attr("height", 120)
        .style("background-color", "#D0D0D0");
// Create SVG elements from data 
    svg.selectAll("circle")                  // create virtual circle template
      .data(countriesData)                   // bind data
    .enter                                 // for each row in data...
      .append("circle")                      // bind circle & data row such that... 
        .attr("id", function(d) { return d.name })            // set the circle's id according to the country name
        .attr("cx", function(d) { return d.income / 1000  })  // set the circle's horizontal position according to income 
        .attr("cy", function(d) { return d.life })            // set the circle's vertical position according to life expectancy 
        .attr("r",  function(d) { return d.pop / 1000 *2 })   // set the circle's radius according to country's population 
        .attr("fill", function(d) { return d.color });        // set the circle's color according to country's color

Generated SVG graphics are designed according to the provided data.

Appending nodes using data

Once a dataset is bound to a document, use of D3.js typically follows a pattern wherein an explicit .enter function, an implicit "update," and an explicit .exit function is invoked for each item in the bound dataset. Any methods chained after the .enter command will be called for each item in the dataset not already represented by a DOM node in the selection (the previous selectAll). Likewise, the implicit update function is called on all existing selected nodes for which there is a corresponding item in the dataset, and .exit is called on all existing selected nodes that do not have an item in the dataset to bind to them. The D3.js documentation provides several examples of how this works.[13]

API structure

D3.js API contains several hundred functions, and they can be grouped into following logical units:[14]

  • Selections
  • Transitions
  • Arrays
  • Math
  • Color
  • Scales
  • SVG
  • Time
  • Layouts
  • Geography
  • Geometry
  • Behaviors



D3.js array operations are built to complement existing array support in JavaScript (mutator methods: sort, reverse, splice, shift and unshift; accessor methods: concat, join, slice, indexOf and lastIndexOf; iteration methods: filter, every, forEach, map, some, reduce and reduceRight). D3.js extends this functionality with:

  • Functions for finding minimum, maximum, extent, sum, mean, median, and quantile of an array.
  • Functions for ordering, shuffling, permuting, merging, and bisecting arrays.
  • Functions for nesting arrays.
  • Functions for manipulating associative arrays.
  • Support for map and set collections.



  • Support for RGB, HSL, HCL, and L*a*b* color representation.
  • Brightening, darkening, and interpolation of colors.


  1. ^ "d3 Releases". Github.com. Retrieved 2018. 
  2. ^ "For Protovis Users", Mbostock.github.com, retrieved 2012 
  3. ^ Viau, Christophe (June 26, 2012), "What's behind our Business Infographics Designer? D3.js of course", Datameer's blog, retrieved 2012 
  4. ^ Myatt, Glenn J.; Johnson, Wayne P. (September 2011), "5.10 Further reading", Making Sense of Data III: A Practical Guide to Designing Interactive Data Visualizations, Hoboken, New Jersey: John Wiley & Sons, p. A-2, ISBN 978-0-470-53649-0, retrieved 2013 
  5. ^ "Release Notes", D3.js, retrieved 2012 
  6. ^ https://www.wappalyzer.com/technologies/d3
  7. ^ Academic example: Savva, Manolis; Kong, Nicholas; Chhajta, Arti; Li, Feifei; Agrawala, Maneesh; Heer, Jeffrey (2011), "ReVision: Automated Classification, Analysisand Redesign of Chart Images", ACM User Interface Software & Technology, retrieved 2013 
  8. ^ Bostock, Ogievetsky & Heer 2011
  9. ^ Bostock, Ogievetsky & Heer 2011, chap. 3
  10. ^ Bostock, Mike (February 5, 2012), Thinking with Joins 
  11. ^ "A Pen by Lopez Hugo". Codepen.io. Retrieved . 
  12. ^ "Edit fiddle". JSFiddle.net. Retrieved . 
  13. ^ "Three Little Circles". Mbostock.github.io. Retrieved . 
  14. ^ d3 (2016-06-30). "API Reference · d3/d3 Wiki · GitHub". Github.com. Retrieved . 

Further reading

Background on D3.js itself:

Using D3.js - beginner level:

Using D3.js - intermediate level:



External links

  This article uses material from the Wikipedia page available here. It is released under the Creative Commons Attribution-Share-Alike License 3.0.



Connect with defaultLogic
What We've Done
Led Digital Marketing Efforts of Top 500 e-Retailers.
Worked with Top Brands at Leading Agencies.
Successfully Managed Over $50 million in Digital Ad Spend.
Developed Strategies and Processes that Enabled Brands to Grow During an Economic Downturn.
Taught Advanced Internet Marketing Strategies at the graduate level.

Manage research, learning and skills at defaultlogic.com. Create an account using LinkedIn to manage and organize your omni-channel knowledge. defaultlogic.com is like a shopping cart for information -- helping you to save, discuss and share.

  Contact Us