Fact-checked by Grok 2 weeks ago

D3.js

D3.js, short for Data-Driven Documents, is a free, open-source JavaScript library designed for producing dynamic, interactive data visualizations in web browsers by manipulating documents based on data. It employs a low-level approach grounded in web standards such as HTML, SVG, Canvas, and CSS, enabling developers to bind input data to document elements and apply dynamic transformations for custom, expressive graphics. Unlike traditional charting libraries, D3.js emphasizes flexibility and control, requiring programmatic construction of visualizations through its suite of over 30 discrete modules for tasks like scaling, shaping, and transitioning elements. Developed by Michael Bostock, Jeffrey Heer, and Vadim Ogievetsky at , D3.js was first released in 2011, succeeding earlier libraries like Protovis. The foundational concepts were outlined in the 2011 paper "D3: Data-Driven Documents," published in IEEE Transactions on Visualization and Computer Graphics, which introduced data joins for entering, updating, and exiting visual elements to support seamless animations and interactions. Major contributions came from Jason Davies (2011–2013) and Philippe Rivière (since 2016), with ongoing maintenance under the platform founded by Bostock. As of late 2024, the library's latest version is 7.8.5, distributed via and . D3.js has profoundly influenced web-based data visualization by prioritizing representation transparency and integration with browser developer tools, facilitating debugging and declarative programming. Its impact is evidenced by widespread adoption in journalism, academia, and industry for creating tailored, high-performance visuals, earning the 2021 IEEE VIS Test of Time Award and the 2022 Information is Beautiful Award for its lasting innovation in the field. While it demands more code than high-level alternatives, this modularity empowers complex, publication-quality graphics, such as force-directed layouts and geographic projections, often showcased in galleries on Observable.

Introduction

Overview

D3.js, also known as D3 (Data-Driven Documents), is a , open-source designed for producing dynamic, interactive data visualizations in web browsers by leveraging web standards such as (SVG), , and Cascading Style Sheets (CSS). At its core, D3.js embodies a philosophy of data-driven manipulation of the (DOM), where visual elements are programmatically generated and updated based on underlying data structures, allowing developers to create highly customized visualizations without relying on predefined chart types or rigid frameworks. This approach emphasizes modularity and flexibility, treating data binding and selections as foundational mechanisms for binding data to DOM elements and applying transformations. D3.js was initially released in 2011 by as a successor to the Protovis visualization toolkit, shifting focus from declarative scene descriptions to imperative, web-native manipulations. As of November 2025, the latest stable version is 7.9.0, released on March 12, 2024. These updates build on D3.js's reputation for customizability, enabling scalable handling of large datasets through efficient data joins and supporting smooth animations and user interactions for engaging web-based graphics.

Development History

D3.js originated as an open-source developed by in collaboration with Vadim Ogievetsky and Jeffrey Heer at , with its initial release occurring on February 18, 2011. Major contributions came from Jason Davies (2011–2013) and Philippe Rivière (since 2016). The project emerged to address key limitations in Protovis, a declarative visualization toolkit released in 2009 by the same team, which excelled at static charts but offered inadequate support for interactive and dynamic behaviors essential for modern web applications. By leveraging web standards such as the (DOM), (SVG), , and CSS, D3.js shifted the paradigm from proprietary tools like or toward web-native, data-responsive visualizations, enabling developers to create flexible, performant graphics amid the growing demands of and interactive web experiences. The library's early development focused on core mechanisms for data manipulation and rendering. Version 1.0, released in 2011, introduced foundational features like selections for targeting DOM elements and transitions for smooth animations, establishing D3's emphasis on imperative yet . Version 2.0 followed in August 2011, refining these with enhanced stability and broader examples. By version 3.0 in December 2012, D3 adopted a more modular structure internally, improving scalability and introducing refinements to scales, layouts, and behaviors that better supported complex visualizations. Subsequent releases emphasized modularity and modern JavaScript practices. Version 4.0, launched in June 2016, marked a pivotal evolution by decomposing the monolithic library into independent packages, allowing developers to only required components for smaller bundle sizes and easier maintenance. Version 5.0, released on March 22, 2018, integrated promise-based asynchronous data loading via native fetch and Promises, replacing callback patterns to align with contemporary web standards and simplify handling of external data sources. In 2018, Bostock transitioned D3's development ecosystem by launching the platform, a reactive notebook environment that natively integrates D3 for collaborative creation and sharing of interactive visualizations. Later versions prioritized optimization and compatibility. Version 6.0, released on August 26, 2020, fully embraced ES6 modules, enabling tree-shaking in bundlers to reduce overhead in production builds. Version 7.0 followed on June 11, 2021, dropping dual /ES6 support in favor of ES modules exclusively, while introducing performance enhancements such as optimized data joins and rendering efficiencies. Post-2021 updates continued refining core utilities; for instance, version 7.8.0 in December 2022 added configurable precision for path data generation and rounding options in shape generators like arcs and lines, improving output control for high-resolution displays. Version 7.8.5, released in 2023, fixed return values for statistical functions like d3.medianIndex and d3.quantileIndex when handling missing values. Version 7.9.0 followed in March 2024 with minor updates and bug fixes. As of November 2025, no further major releases have occurred. Throughout its , D3.js has maintained a BSD-3-Clause , fostering widespread adoption while hosted on under the d3/d3 repository, where community contributions drive ongoing refinements.

Core Architecture

Selections

In D3.js, selections serve as the primary mechanism for querying and manipulating DOM elements, representing wrapped arrays that encapsulate one or more document nodes for efficient operations. This structure allows developers to target specific parts of the webpage's DOM tree without altering unrelated elements, drawing inspiration from established libraries while emphasizing flexibility for visualization tasks. Selections are created through the d3.select function, which returns the first matching element based on a CSS selector, or d3.selectAll, which returns all matching elements in document order; both leverage the W3C Selectors for precise targeting. Once formed, selections support a chainable where methods can be invoked sequentially on the same object, enabling concise expressions for modifications. Key chainable methods include .style() for setting CSS properties, .attr() for , .classed() for adding or removing CSS classes, .text() for content, and .html() for inner markup. Event handling is facilitated by .on(), which attaches listeners to elements, while iteration is handled via .each() to execute a callback on each element or .call() to invoke a with the selection as its argument. Nesting and scoping enhance selections' utility by allowing hierarchical operations; for example, a selection on a parent like d3.select("body") can chain to selectAll("p") to target only paragraphs within that container, effectively entering subgroups without global rescans. Empty selections, which occur when no elements match the query, are managed gracefully by returning a valid but inert selection object that propagates through chains without throwing errors, ensuring robust behavior. Performance in selections is optimized by relying on native DOM methods for queries, which minimizes overhead compared to repeated full-document parses, and by design choices that limit computations to affected elements during chained operations. This efficiency stems from D3's explicit transformation model, where manipulations are applied selectively rather than globally. The following example illustrates basic selection and modification: selecting all <circle> elements in an and applying an attribute and style change.
javascript
d3.selectAll("circle").attr("r", 5).style("fill", "red");
This code targets existing circles, sets their radius to 5 pixels, and fills them red, demonstrating the chainable nature without requiring intermediate variable storage.

Data Binding

Data binding in , also known as data joins, associates arbitrary with (DOM) elements to generate and modify visual representations dynamically. This process allows developers to bind input —such as arrays of numbers, strings, or objects—to selected DOM nodes, enabling data-driven transformations without relying on predefined templates. The mechanism forms the core of D3's approach to visualization, treating as the primary driver for DOM manipulation. The core process begins with the selection.data() method, which binds a specified array of data to the elements in a selection, creating key-value mappings between data items and DOM nodes. For instance, d3.selectAll("div").data(dataset) associates each element in the dataset array with a corresponding <div> element in the selection, storing the bound data in the node's __data__ property. The method returns an update selection representing successfully bound elements, and it can accept either a static array or a function that computes data per group, taking parameters like the datum d, index i, and group nodes. This binding operates on selections, which are groups of DOM elements queried via methods like d3.selectAll. Key functions determine how data matches elements during binding, with two primary modes: implicit keys, which pair data to elements by index (the default), and explicit keys specified via an optional key function in selection.data(data, key). Implicit keys suit simple, ordered datasets but can cause instability if data reorders, as they do not preserve associations across updates. Explicit keys, such as d => d.id, enable stable matching based on unique identifiers, ensuring consistent element-data pairings even with insertions or deletions, which is crucial for animations and minimizing DOM churn. For example, d3.selectAll("div").data(data, d => d ? d.name : this.id) uses the data's name property or the element's id as the key. The binding lifecycle manages associations across data changes: an initial call to data() creates the mappings, while subsequent invocations on the same selection compare new against existing bindings to identify updates, enters, and exits. When mismatches the number of elements—such as more items than nodes—the excess forms an enter set via selection.enter(), representing placeholders for new elements to ; conversely, surplus elements form an exit set via selection.exit(), typically removed to reflect absence. This lifecycle ensures efficient updates by only modifying necessary parts of the DOM. D3.js supports binding to nested or hierarchical data structures, such as arrays of arrays or tree-like objects, by using functions in data() to extract subgroups iteratively. For complex structures like matrices or hierarchies, a function like data(d => d.children) can bind child arrays to subgroups of elements, facilitating visualizations of trees or nested layouts. This approach scales to multi-level without , preserving relational integrity. Error handling in data binding primarily addresses mismatches through the enter and sets, preventing unbound data or orphaned elements from disrupting the . Best practices recommend selecting stable, unique keys (e.g., IDs over indices) to avoid unnecessary DOM recreations, which can degrade in dynamic applications; developers should also validate data arrays for consistency before binding to minimize issues. A representative example involves binding a fruit dataset to list items: consider const fruits = ["apple", "banana", "cherry"]; then d3.select("ul").selectAll("li").data(fruits).enter().append("li").text(d => d);. This creates <li> elements for each fruit, setting their text content to the bound datum; on update with new data like ["apple", "date"], the explicit key could ensure the "apple" <li> persists while removing "cherry" and adding "date".

Dynamic Behaviors

Transitions

Transitions in D3.js enable smooth animations for modifying selected elements, such as attributes, styles, or text content, over a specified . By invoking the .transition() method on a selection, developers schedule these changes to occur gradually rather than instantaneously, creating visually appealing updates in data visualizations. This approach leverages the browser's timing mechanisms to interpolate between starting and ending states, supporting a wide range of property types. The core mechanism involves calling .transition() on a D3 selection, which returns a transition object representing the scheduled . By default, transitions have a of 250 milliseconds and use cubic easing (d3.easeCubic) for acceleration and deceleration. Developers then chain methods like .attr() or .style() on this transition object to define the target values, with D3 automatically computing intermediate values using built-in interpolators. For instance, a can animate an element's position or opacity in response to data changes, ensuring fluid motion without manual frame-by-frame calculations. Key properties allow fine-grained control over transition behavior. The .duration([milliseconds]) method sets the animation length, accepting a constant value or a evaluated per ; it defaults to 250ms if omitted. Similarly, .delay([milliseconds]) postpones the start, defaulting to 0ms, while .ease([easingFunction]) specifies the timing curve, defaulting to d3.easeCubic for smooth in-out motion. For synchronization, .end() returns a that resolves when the transition completes on all selected elements, enabling asynchronous chaining or callbacks; direct callback registration via .on("end", callback) is supported, but are preferred for modern integration. These properties can be chained before or after modification methods, applying uniformly or per-element via functions. D3 handles interpolation automatically based on the property type, ensuring seamless transitions between values. For numeric attributes like radius or position, linear interpolation occurs via d3.interpolateNumber. Colors are interpolated in RGB space using d3.interpolateRgb (or HSL/Lab for perceptual uniformity via d3.interpolateHsl or d3.interpolateLab), transforming, for example, "red" to "blue" through intermediate hues. SVG paths support morphing between shapes with d3.interpolatePath, enabling smooth deformations. Custom interpolators are available through d3.interpolate(a, b), which works for arrays, objects, or strings with embedded numbers, and can be applied via tween methods like .attrTween() or .styleTween() for specialized behaviors, such as non-linear paths or complex data structures. Transitions support sequencing and synchronization through named instances and event handling. By passing a string name to .transition("name"), multiple transitions can be queued or interrupted exclusively per element, preventing overlaps; a subsequent .transition("next") on the same selection starts after the named predecessor ends, inheriting timing properties. This facilitates complex animations, like staggered reveals. End events are dispatched via .on("end", listener) for immediate reactions, while the .end() allows awaiting completion across selections, useful for coordinating with data updates or other DOM operations. Interrupts can be triggered manually with selection.interrupt("name") to halt ongoing animations abruptly. For performance, D3 schedules transitions using requestAnimationFrame to align with the browser's , minimizing jank and ensuring 60fps where possible. Animations are queued per element and name, avoiding concurrent execution that could cause overdraw or redundant computations; only the active renders at each frame, with others pending. This efficient queuing supports thousands of elements without significant overhead, though complex interpolations (e.g., path morphing) may require optimization for large datasets. A representative example animates the radius and position of SVG circles in response to bound data updates:
javascript
d3.selectAll("circle")
  .data(data)  // Assume data is an array of objects with value and x properties
  .transition()
  .duration(750)
  .ease(d3.easeCubic)
  .attr("r", d => d.value * 5)
  .attr("cx", d => d.x);
This code selects circles, binds , and smoothly scales their radius proportional to value while repositioning them along the x-axis over 750ms, demonstrating interpolation in action.

Enter-Update-Exit Pattern

The enter-update-exit in D3.js provides a structured approach to managing dynamic changes in data-driven visualizations, ensuring efficient creation, modification, and removal of DOM elements corresponding to bound . After binding to a selection using selection.data(), the pattern accesses three distinct phases: the enter selection for newly added data points without existing elements, the update selection for elements already bound to , and the exit selection for elements whose is no longer present. This , introduced in early versions of D3 and refined in D3 v4 with the selection.join() method, minimizes unnecessary DOM manipulations by reusing elements where possible and supports smooth animations through phased operations. In the enter , D3 identifies data items that lack corresponding DOM elements and creates new ones, typically by appending them to the parent container. For instance, to add circles for new data points, one might use selection.enter().append("circle").attr("cy", 0).attr("r", d => d.value), initializing attributes like position or to prevent visual flashing during rendering. This ensures that incoming data is immediately represented in the without disrupting existing . The phase handles modifications to existing elements based on the new or changed , applying attributes, styles, or to reflect the current state. Common operations include updating positions or values, such as selection.attr("r", d => d.[size](/page/Size)).attr("cx", (d, i) => i * 10), which adjusts radii and x-coordinates for matched . To ensure consistency, the enter and update selections are often merged using enter.merge([update](/page/Update)) before applying shared attributes, promoting and uniform behavior across phases. During the exit phase, elements bound to that has been removed are identified and typically transitioned out before removal to maintain visual continuity. For example, selection.[exit](/page/Exit)().transition().style("opacity", 0).remove() fades out and deletes excess elements after a brief . This prevents abrupt disappearance and allows for elegant handling of reductions, such as shrinking a over time. Best practices for implementing the enter-update-exit pattern emphasize using a key function in data() to establish stable identities between data and elements, such as data(dataset, d => d.id), which improves matching accuracy during updates and reduces unnecessary creations or removals. Transitions can be applied within each phase for smooth animations, chaining them across enter, update, and exit to create fluid visuals. For large datasets, consider techniques to render only visible elements, avoiding bottlenecks by limiting DOM size. A representative example is updating a when data is added or removed. Suppose the initial data is [10, 20, 30] bound to <rect> elements in an :
javascript
const svg = d3.select("svg");
const bars = svg.selectAll("rect").data([10, 20, 30], d => d);

// Enter: Append new bars for additional data, say [10, 20, 30, 40]
const barsEnter = bars.enter().append("rect")
    .attr("y", d => 100 - d)
    .attr("height", d => d)
    .attr("width", 20)
    .attr("fill", "steelblue");

// [Update](/page/Update): Adjust existing bars
const barsUpdate = barsEnter.merge(bars)
    .attr("x", (d, i) => i * 25);

// Exit: Remove old bars if data shrinks, e.g., to [10, 20]
const barsExit = bars.exit()
    .transition()
    .duration(750)
    .attr("width", 0)
    .remove();
This code creates new bars for added values, repositions all bars based on the updated array length, and animates the removal of excess bars, demonstrating the pattern's for interactive visualizations.

Modular Components

Built-in Modules

D3.js adopted a starting with version 4.0 in 2016, transforming from a monolithic library into a collection of 30 independent packages that can be imported selectively. This architecture allows developers to include only the necessary components, enabling tree-shaking in bundlers like or to minimize bundle sizes and improve performance. For instance, packages such as d3-array provide statistical functions like sorting and aggregation, while d3-scale handles mappings from data domains to visual ranges. The core module, d3-selection, serves as the foundation for DOM manipulation and data joining, enabling users to select elements and bind data to them for dynamic updates. Other essential modules extend this capability for specific needs. The d3-scale module offers a variety of scales, including linear, logarithmic, and ordinal types, to encode abstract data into visual properties; for example, a can be created and configured as follows:
javascript
import {scaleLinear} from "d3-scale";
const x = scaleLinear().domain([0, 100]).range([0, 500]);
This maps input values from 0 to 100 onto output pixels from 0 to 500. Complementing scales, d3-axis generates axes with ticks and labels for readable reference lines. The d3-shape module provides primitives for generating paths, such as lines, areas, and arcs; key functions include d3.line() for polylines and d3.pie() for partitioning data into angular sectors. For hierarchical and network visualizations, d3-hierarchy computes layouts like tree diagrams and circle packs from nested data structures, while d3-force simulates physical forces for layouts, such as repulsion and linking. Geographic visualizations are supported by d3-geo, which includes projections like Mercator and functions for rendering shapes on maps. Additional modules like d3-contour generate density contours using algorithms, d3-path serializes canvas paths to for precise rendering, and d3-interpolate facilitates smooth transitions between values, including custom color schemes. Modules are imported individually via ES6 syntax or , ensuring compatibility across versions by aligning dependencies; for example, all modules in the D3 v7 series share a common release cadence. Developers must verify parity to avoid mismatches, as documented in the official . Bundle size management is a key benefit of this : the core d3-selection module weighs approximately 4.1 when gzipped. The full D3 bundle ( 7.9.0) is about 90.7 gzipped. Selective imports are recommended to keep payloads lean, particularly for applications where load times impact .
ModulePrimary FunctionExample Use Case
d3-selectionDOM selection and data bindingSelecting SVG elements for updates
d3-scaleData-to-visual encodingMapping dataset values to pixel positions
d3-axisAxis generationCreating x- and y-axes with ticks
d3-shapePath primitivesDrawing lines, areas, or pie charts
d3-hierarchyHierarchical layoutsTree or pack diagrams from data
d3-forceForce simulationsInteractive network graphs
d3-geoMap projectionsRendering world maps with custom projections

Integration with Web Standards

D3.js integrates seamlessly with core web standards to enable data-driven visualizations without relying on proprietary technologies or plugins. By directly manipulating the (DOM), D3 appends and modifies native , , and elements, ensuring broad compatibility across modern browsers while maintaining flexibility for custom interactivity. This standards-based approach, established since D3's inception in 2011, avoids dependencies like , positioning it as a fully web-native library that leverages 6 (ES6) and later features. For vector graphics rendering, D3.js primarily utilizes elements, generating scalable visuals through methods that create and manipulate <svg> containers, paths via the d attribute for curves and shapes, and gradients for color fills. Developers can append elements dynamically using selections, such as d3.select("body").append("svg"), which binds data to graphical primitives without introducing non-standard formats. This direct integration allows for resolution-independent graphics that scale across devices, as is a W3C recommendation supported natively by all major browsers. When handling large datasets where SVG's DOM overhead impacts performance, D3.js supports fallback to HTML5 Canvas for raster-based rendering, often combined with d3-selection for data binding while implementing custom drawing logic. Canvas enables efficient pixel manipulation for thousands of elements, reducing memory usage compared to individual SVG nodes, though it requires manual handling of redraws during interactions. For even more demanding scenarios, such as 3D visualizations, D3 can interface with through external modules, using its data processing capabilities to prepare geometries for GPU-accelerated rendering. D3.js incorporates CSS for styling visualizations dynamically, applying properties like colors, fonts, and layouts via the selection.style() method, which sets inline styles or leverages external stylesheets for themes such as responsive designs. While D3 provides JavaScript-based transitions for data-driven animations, it can trigger where suitable, blending declarative styling with programmatic control to optimize for browser rendering engines. This hybrid approach ensures efficient updates without overhead. Interactivity in D3.js relies on native handling, binding listeners to elements using selection.on(typenames, listener), where typenames include standard like click, mouseover, touchstart, and Pointer Events for precise input tracking. This supports mobile devices through touch and pointer coordinates via utilities like d3.pointer(), enabling responsive behaviors such as zooming or panning without custom event polyfills. All conform to the browser's native dispatch mechanism, ensuring compatibility with accessibility tools and device capabilities. To enhance accessibility, D3.js facilitates the addition of attributes through selection.attr(), such as setting role="img" on SVG groups or aria-label for descriptive text, aligning visualizations with guidelines. Best practices include pairing roles with <title> elements for announcements and ensuring focusable elements receive proper aria-describedby links to textual summaries, promoting usability for users with visual impairments. These attributes are applied data-driven, allowing dynamic updates to maintain semantic structure. D3.js requires ES6+ for full functionality, including modules and arrow functions, but supports polyfills like Babel for older browsers such as Internet Explorer 11. Its web-native design eliminates dependencies, relying solely on , CSS3, and APIs available since 2011, with backward compatibility maintained through modular imports.

Practical Usage

Basic Implementation

To begin using D3.js, developers can include the library in a project either via a (CDN) for quick prototyping or through a for modular development. For CDN inclusion, add the following tag to an file: <script src="https://cdn.jsdelivr.net/npm/d3@7"></script>, which loads the UMD bundle suitable for vanilla environments. Alternatively, for projects using Node.js-based workflows, install D3.js via with the command npm install d3, allowing imports like import * as d3 from "d3"; in modern modules. A boilerplate to host visualizations typically includes an empty <svg> element as a container, such as:
html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>D3.js Example</title>
    <script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
</head>
<body>
    <svg width="400" height="200"></svg>
    <script>
        // [JavaScript](/page/JavaScript) code here
    </script>
</body>
</html>
This structure provides a for SVG-based rendering, which is the primary medium for D3.js visualizations. D3.js operates primarily in client-side environments within web browsers, where it manipulates the (DOM) directly, though server-side usage in is possible but uncommon, often requiring libraries like JSDOM to simulate a browser context for tasks such as static generation. For modular applications, bundlers like can process D3.js imports, enabling tree-shaking to include only necessary modules and optimizing bundle size. A foundational example is creating a simple , which demonstrates core concepts like selections, data binding, and attribute setting. Start by selecting the SVG container and binding sample data, such as an of values [4, 8, 15, 16, 23, 42]. Append <rect> elements for each data point using D3's join method, and set attributes dynamically:
javascript
const svg = d3.select("svg");
const data = [4, 8, 15, 16, 23, 42];
const height = 200;
const barWidth = 40;

const x = d3.scaleBand()
    .domain(d3.range(data.length))
    .range([0, 400])
    .padding(0.1);

const y = d3.scaleLinear()
    .domain([0, d3.max(data)])
    .range([height, 0]);

svg.selectAll("rect")
    .data(data)
    .join("rect")
    .attr("x", (d, i) => x(i))
    .attr("y", d => y(d))
    .attr("width", x.bandwidth())
    .attr("height", d => height - y(d))
    .attr("fill", "steelblue");
Here, scales map values to coordinates: the x-scale positions bars horizontally, while the y-scale inverts heights for bottom-aligned bars, providing a brief to D3's utilities without deep . This static renders immediately upon script execution, illustrating how drives visual elements. For debugging, developers can inspect selections and bound data directly in the browser console, such as by evaluating d3.selectAll("rect").data() to verify array associations or d3.selectAll("rect").nodes() to check rendered elements. Common errors include unbound data, where selections lack .data() calls, leading to no elements being appended—resolving this involves ensuring join operations like .data(data).join("rect") precede attribute settings. To achieve responsive design, set the SVG's viewBox attribute to define a that scales independently of the container size, such as svg.attr("viewBox", "0 0 400 200").style("max-width", "100%").style("height", "auto"), allowing the visualization to adapt to changes. Additionally, attach a resize event listener to the to recompute scales and reposition elements dynamically:
javascript
[window](/page/Window).addEventListener("resize", () => {
    // Update width, scales, and rebind attributes
});
This ensures the chart reflows on device rotation or window resizing without distortion. A minimal viable code snippet for loading external data and rendering combines JSON fetching with the bar chart logic above. Assume a local data.json file containing [{"value": 4}, {"value": 8}, {"value": 15}, {"value": 16}, {"value": 23}, {"value": 42}]:
javascript
d3.json("data.json").then(data => {
    const svg = d3.select("svg");
    const height = 200;
    const width = 400;

    const x = d3.scaleBand()
        .domain(d3.range(data.length))
        .range([0, width])
        .padding(0.1);

    const y = d3.scaleLinear()
        .domain([0, d3.max(data, d => d.value)])
        .range([height, 0]);

    svg.selectAll("rect")
        .data(data)
        .join("rect")
        .attr("x", (d, i) => x(i))
        .attr("y", d => y(d.value))
        .attr("width", x.bandwidth())
        .attr("height", d => height - y(d.value))
        .attr("fill", "steelblue");
});
This asynchronous load populates the chart once data arrives, forming the basis for more dynamic updates using patterns like enter-update-exit.

Advanced Visualization Techniques

Advanced visualization techniques in D3.js leverage multiple modules to create interactive, multi-layered representations of complex datasets, enabling users to explore relationships, spatial distributions, and structures in depth. These methods integrate simulations, projections, layouts, and event handlers to produce dynamic graphics that respond to user input while maintaining responsiveness. By combining these features, developers can build visualizations such as network diagrams, interactive maps, and hierarchical explorations that reveal patterns not apparent in static charts. Force-directed graphs utilize the d3-force module to simulate physical forces on nodes and links, arranging them into intuitive node-link diagrams that highlight in networks. The is initialized with an of nodes and links, applying forces like attraction between connected nodes via d3.forceLink and repulsion via d3.forceManyBody, then advanced through repeated calls to the simulation's .tick() method to update positions iteratively. Drag handlers, implemented with d3.drag, allow users to reposition nodes interactively, triggering simulation.alphaTarget to resume movement and revealing dynamic cluster formations. This approach is particularly effective for visualizing social networks or dependency graphs, where node positions emerge organically from data relationships. Geographic maps in D3.js employ the d3-geo module to transform spherical coordinates into planar representations, supporting projections such as for web-standard Mercator views that preserve angles for . Path generators, created with d3.geoPath().projection(projection), render features like country outlines as paths, enabling scalable vector rendering of boundaries and coastlines. Choropleth coloring applies quantitative scales, such as d3.scaleSequential, to fill regions based on data values like , using color schemes from d3-scale-chromatic to encode intensity visually. These techniques facilitate thematic mapping, where users can overlay multiple data layers to analyze spatial correlations. Hierarchical views draw on the d3-hierarchy module to compute layouts for tree-like data, transforming flat structures into nested nodes with computed properties like depth and value. Treemaps use d3.treemap().size([width, height])(root) to partition space into rectangles sized proportionally to node values, ideal for displaying file system usage or budget allocations through nested rectangles. Circle packs, via d3.pack()(root), arrange circles hierarchically without overlap, providing a compact alternative for visualizing proportions in datasets like species distributions. Sunburst charts extend the partition layout with radial positioning, using d3.partition().size([2 * Math.PI, radius])(root) to create arc segments that radiate from the center, allowing drill-down interactions to expand inner rings. These layouts emphasize enclosure principles, where parent-child relationships are spatially nested. Interactivity enhances these visualizations through modules like d3-zoom for pan and zoom behaviors, applied via .call(zoom) on container elements to scale and translate content under mouse or touch input. Brushing with d3-brush enables region selection, where d3.brushX() or d3.brush() defines extents for filtering linked views, such as highlighting related nodes in a upon axis selection. Tooltips are implemented using event listeners like .on("mouseover", function(event, d) { /* show info */ }), often with d3-tip or custom divs to display node details on hover, fostering exploratory analysis without cluttering the view. These behaviors, chained across elements, create cohesive interfaces where actions in one component update others seamlessly. Performance optimization is crucial for handling large-scale data, such as 10,000+ nodes, where rendering can degrade due to DOM overhead; switching to contexts via elements accelerates drawing by rasterizing paths and shapes directly, often yielding 10-100x speedups for static or semi-dynamic scenes. techniques limit rendered elements to the , using d3's enter-update-exit with clipping or offscreen computations to defer updates for unseen items. Debouncing events, implemented with functions like .debounce or custom timers, throttles frequent triggers such as mouse moves or simulation ticks to 16ms intervals, preventing excessive redraws and ensuring 60fps interactions even under heavy load. These strategies, combined with Web Workers for force simulations, maintain fluidity in complex scenes. An illustrative example is an interactive network graph that integrates , , and transitions:
javascript
const simulation = d3.[force](/page/Force)Simulation(nodes)
  .force("link", d3.[force](/page/Force)Link(links).id(d => d.id))
  .force("charge", d3.[force](/page/Force)ManyBody())
  .force("center", d3.[force](/page/Force)Center(width / 2, height / 2));

const link = [svg](/page/SVG).append("g")
  .selectAll("line")
  .data(links)
  .join("line")
  .attr("stroke", "#999");

const [node](/page/Node) = [svg](/page/SVG).append("g")
  .selectAll("circle")
  .data(nodes)
  .join("circle")
  .attr("r", 5)
  .call(d3.[drag](/page/Drag)()
    .on("start", dragstarted)
    .on("drag", dragged)
    .on("end", dragended));

node.append("title").text(d => d.id);

simulation.on("tick", () => {
  link.attr("x1", d => d.source.x)
      .attr("y1", d => d.source.y)
      .attr("x2", d => d.target.x)
      .attr("y2", d => d.target.y);
  [node](/page/Node).attr("cx", d => d.x).attr("cy", d => d.y);
});

[function](/page/Function) dragstarted(event, d) {
  if (!event.active) simulation.alphaTarget(0.3).restart();
  d.fx = d.x; d.fy = d.y;
}

[function](/page/Function) dragged(event, d) {
  d.fx = event.x; d.fy = event.y;
}

[function](/page/Function) dragended(event, d) {
  if (!event.active) simulation.alphaTarget(0);
  d.fx = null; d.fy = null;
}
This code creates draggable nodes that transition smoothly during simulation ticks, demonstrating how forces, events, and updates coalesce for engaging exploration.

Ecosystem and Community

Development and Maintenance

D3.js is primarily maintained by , its creator since 2011, with development overseen by , Inc., where Bostock serves as CTO. The project operates without a formal organizational structure beyond this leadership, relying on a collaborative network of over 130 contributors who submit changes through pull requests. This open-source model fosters incremental improvements while ensuring the library remains tied to Observable's platform for data analysis and visualization tools. The release cycle adheres to semantic versioning, with major versions introducing breaking changes and minor or patch releases addressing bugs and enhancements on a roughly quarterly basis. For instance, version 7.9.0 (March 2025) introduced features like d3.ascending and configurable path precision, building on 2024 updates such as 7.8.5 fixing statistical functions like d3.medianIndex for handling missing values, while 7.8.1 resolved contour generation errors for invalid inputs. Breaking changes, such as the deprecation of d3.symbolX in favor of d3.symbolTimes in version 7.8.0, are announced with notices to maintain developer awareness. The version policy prioritizes in minor updates, using warnings for planned removals to minimize disruption. Contributions follow standard GitHub practices, with pull requests encouraged for bug fixes and new features, alongside discussions in the issue tracker for feature requests and problem reports. Testing is integrated via Tape.js for unit tests, and documentation updates are submitted in Markdown format to ensure consistency with the library's API references. Funding supports ongoing maintenance through Observable's sponsorships and investments, which back Bostock's work, though D3 itself does not have a dedicated public donation channel like Open Collective. As of November 2025, future directions emphasize enhanced compatibility with modern web technologies, including improved declarations available via @types/d3 (v7.4.3) for better in development workflows. Integration with frameworks like is a key focus, with most D3 modules designed to work seamlessly without DOM conflicts, enabling hybrid applications for interactive visualizations. Exploration of for performance-intensive computations, such as force simulations, is underway through community extensions, aiming to augment D3's core JavaScript-based approach.

Resources and Contributions

The official documentation for D3.js is hosted at d3js.org, providing a comprehensive reference that details the library's modular components and methods for data manipulation and . This site also features a of examples, integrated with notebooks for interactive demonstrations, enabling users to explore and modify visualizations directly in the ; the searchable has been available since Observable's launch in 2018. Key learning resources include the book Interactive Data Visualization for the Web by Scott Murray, first published in 2013 with a second edition in 2017, which introduces D3.js fundamentals through practical examples for beginners in . Online tutorials abound, such as freeCodeCamp's comprehensive guide covering data binding, scales, and transitions, and various articles on Towards Data Science that demonstrate real-world applications like interactive charts. Third-party extensions enhance D3.js's capabilities, including d3fc for building financial charts with components like series and annotations, and nvd3 for high-level wrappers that simplify common chart types such as and line graphs. Plugins also facilitate integration with frameworks; for instance, D3.js pairs with through reactive components that handle data updates and DOM manipulations seamlessly. Community forums provide robust support for D3.js users, with the Stack Overflow tag accumulating thousands of questions on topics from selection methods to force simulations. Reddit's r/d3js subreddit serves as a discussion hub for sharing code snippets and troubleshooting, while the forum at talk.observablehq.com hosts threads on best practices and library nuances. Annual meetups and workshops, such as those organized by the D3 Online group and NYC D3.js chapter, foster in-person or virtual collaboration on advanced techniques. Contributions to the D3.js ecosystem extend beyond core development, with users submitting visualizations to the official gallery via Observable notebooks that can be forked and featured upon review. Sharing reusable code through blog posts on platforms like Medium or GitHub forks encourages community adoption, following best practices such as modular design and clear documentation to ensure compatibility with D3's web standards. Prototyping tools include the legacy Blockbuilder platform, which allowed browser-based editing of D3.js snippets until its shutdown in 2021, now largely replaced by Observable for real-time collaboration and embedding. Code quality is maintained via linters like eslint-plugin-d3, which enforces conventions for D3-specific patterns such as selections and transitions.

Impact and Applications

Notable Projects

D3.js has been instrumental in media visualizations, particularly in . The New York Times has employed D3.js for interactive graphics such as the 2012 presidential election maps, including "512 Paths to the ," which allowed users to explore voting patterns through dynamic choropleth visualizations and animated transitions. Similarly, has utilized D3.js in dashboards for data-driven stories, such as the 2016 analysis tools that visualized results with force-directed graphs and interactive timelines. In scientific applications, D3.js facilitates complex data exploration. In biology, D3.js has been used to render genomic trees in peer-reviewed papers, such as phylogenetic visualizations in studies on viral evolution, where hierarchical layouts display genetic relationships. Furthermore, integration with Jupyter notebooks has made D3.js a staple in research workflows, allowing scientists to embed scalable vector graphics directly within Python-based analyses for reproducible visualizations. Commercial entities have adopted D3.js for operational insights. Uber's movement visualizations, including global ride density maps, rely on D3.js for real-time rendering of geospatial data, helping to illustrate urban mobility patterns. Airbnb employs D3.js in dynamic maps that highlight listing distributions and price trends, enhancing user interfaces for property searches worldwide. At Bloomberg, financial dashboards incorporate D3.js to animate market data streams, such as stock price fluctuations and economic indicators, supporting trader decision-making. Open-source showcases demonstrate D3.js's versatility. On , public notebooks featuring force-directed graphs have garnered over 1 million views, exemplifying community-driven explorations of data. The D3 includes examples like animated racing bars, which visualize data changes over time through bar chart races, inspiring countless adaptations. The library's impact is evident in its widespread adoption, with D3.js referenced in over 110,000 academic papers as of November 2025 per metrics, underscoring its role in shifting industries toward web-based visualizations since its 2011 release. However, projects often encounter challenges with large datasets, such as rendering delays for millions of nodes; solutions include custom modules like d3fc for financial charts or integrations to handle high-volume data efficiently.

Comparisons to Alternatives

D3.js provides low-level control for creating highly customized visualizations, contrasting with high-level libraries like and , which prioritize simplicity for standard charts such as bar graphs or line plots. Chart.js enables rapid development of responsive, pre-built charts with minimal code, making it ideal for straightforward applications, whereas D3.js requires more explicit manipulation of SVG elements and data bindings, resulting in a steeper but greater potential for bespoke designs. Similarly, Plotly offers interactive, publication-ready plots out of the box, built partly on D3.js internals, but abstracts away the DOM-level details that D3.js exposes directly, trading ease of use for less flexibility in non-standard visualizations. In comparison to declarative frameworks like and Vega-Lite, D3.js employs an imperative approach, where developers write step-by-step code to bind data to DOM elements and apply transformations. Vega-Lite, by contrast, uses specifications to declaratively define marks, scales, and encodings, facilitating quicker prototyping and reusable specs for common chart types, though it may limit expressivity for highly unique interactions that D3.js handles through direct event handling and animations. This makes D3.js preferable for scenarios demanding fine-grained control, such as complex force-directed graphs or real-time updates, while excels in generating efficient, shareable visualizations via rendering. Integrating D3.js with modern UI frameworks like or Vue presents challenges due to D3.js's direct DOM manipulation conflicting with reconciliation, potentially leading to issues or redundant updates. Wrappers such as react-d3-library address this by encapsulating D3.js components within React's lifecycle, allowing declarative usage while mitigating overhead, though pure D3.js implementations avoid framework dependencies entirely for lighter bundles. D3.js's core strengths lie in its unparalleled flexibility for crafting novel visualizations using web standards like and CSS, ensuring no as it relies solely on native APIs rather than formats. However, this modularity comes with weaknesses, including verbose code for basic tasks and the absence of built-in themes or accessibility features, requiring developers to implement these manually. As of 2024, D3.js maintains dominance in custom and news visualizations, where demands tailored designs, with news outlets frequently employing it for dynamic maps and election graphics; its overall in visualization tools stands at approximately 8.6%, reflecting sustained use despite the rise of simpler alternatives for prototypes. Meanwhile, libraries like Observable Plot are gaining traction for rapid exploratory work, signaling a shift where D3.js is increasingly for advanced, performance-critical applications. Migration paths from D3.js's predecessor, Protovis, are straightforward, as D3.js was designed as its successor with enhanced for dynamic updates and animations, allowing direct of static scenes to interactive ones via data joins. For modern efficiency, combining D3.js with frameworks like leverages Svelte's compile-time reactivity for optimized renders, pairing seamlessly with D3.js data joins to reduce runtime overhead in complex UIs.

References

  1. [1]
    What is D3? | D3 by Observable - D3.js
    D3 (or D3.js) is a free, open-source JavaScript library for visualizing data. Its low-level approach built on web standards offers unparalleled flexibility.
  2. [2]
    D3: Data-Driven Documents - UW Interactive Data Lab
    D3: Data-Driven Documents. Michael Bostock, Vadim Ogievetsky, Jeffrey Heer ... @article{2011-d3, title = {D3: Data-Driven Documents}, author = {Bostock ...
  3. [3]
    Releases · d3/d3 - GitHub
    Nov 5, 2024 · v7.8.5 Fix the return value of d3.medianIndex and d3.quantileIndex when the data contains missing values.
  4. [4]
    D3 Data-Driven Documents - ACM Digital Library
    With D3, designers selectively bind input data to arbitrary document elements, applying dynamic transforms to both generate and modify content. We show how ...
  5. [5]
    [PDF] D3: Data-Driven Documents
    D3: Data-Driven Documents. Michael Bostock, Vadim Ogievetsky, and Jeffrey Heer. Fig. 1. Interactive visualizations built with D3, running inside Google Chrome.
  6. [6]
    D3.js adoption guide: Overview, examples, and alternatives
    Jan 19, 2024 · D3.js is a powerful JavaScript library for creating tailored data visualizations. Let's see why you should use D3.js in your next project.<|control11|><|separator|>
  7. [7]
    Release v7.9.0 · d3/d3
    - **Release Date**: 12 Mar (no year specified)
  8. [8]
    Stanford Vis Group | D3: Data-Driven Documents
    ### Extracted and Summarized Content from http://vis.stanford.edu/papers/d3
  9. [9]
    Mike Bostock: D3 and the Future of Data Visualization - Chartio
    Dec 7, 2011 · The goal of D3 is to embrace and build on standard, universal representations of graphics, rather than reinvent them each time. During my work ...
  10. [10]
    D3.js - Wikipedia
    D3.js (also known as D3, short for Data-Driven Documents) is a JavaScript library for producing dynamic, interactive data visualizations in web browsers.
  11. [11]
    D3 3.0 released | Hacker News
    Dec 21, 2012 · D3 is beautiful and accessible, but more importantly I think it re-frames our approach to visualizing data, rather than jamming data into pre- ...
  12. [12]
    D3.js · Delft Students on Software Architecture - delftswa
    The owner and maintainer of the D3.js library is Michael Bostock [7], whose vision it was to utilize DOM manipulation for creating visualizations. His work on ...D3. Js · Architecture · Inner Workings<|separator|>
  13. [13]
    D3 Announces 5.0 Release of SVG, Canvas, and HTML Library for ...
    Apr 12, 2018 · The D3 team has announced their 5.0 release, which embraces several newer asynchronous patterns such as promises and fetch, and updates key ...Missing: v5. | Show results with:v5.
  14. [14]
    D3.js 5.0 is out - techstacks.io
    Released March 22, 2018. D3 5.0 introduces only a few non-backwards-compatible changes. D3 now uses Promises instead of asynchronous callbacks.Missing: major | Show results with:major
  15. [15]
  16. [16]
    node_modules/d3/CHANGES.md · main · Ludwig Lorenz / BisonWatch
    Changes in D3 6.0. Released August 26, 2020. This document covers only major changes. For minor and patch changes, please see the release notes.<|separator|>
  17. [17]
    D3 v7.0.0 Release - GitClear
    D3: v7.0.0 Release. Release date: June 11, 2021. Previous version: v6.7.0 (released April 16, 2021). Magnitude: 310 Diff Delta. Contributors:.Missing: performance | Show results with:performance
  18. [18]
    D3 7.0 to boost compatibility with Node.js by going all-in ... - devclass
    Jun 15, 2021 · Popular data visualisation library D3 7.0 is now available, improving compatibility with JavaScript runtime environment Node.js.Missing: improvements | Show results with:improvements
  19. [19]
    d3/d3-collection: Handy data structures for elements keyed by string.
    Nov 11, 2018 · BSD-3-Clause license. d3-collection. Deprecation notice: Use JavaScript's built-in Map, Set and Object classes instead of d3-collection's ...
  20. [20]
    d3/d3-request: A convenient alternative to XMLHttpRequest. - GitHub
    A convenient alternative to XMLHttpRequest. License. BSD-3-Clause license · 108 stars 54 forks Branches Tags Activity · Star · Notifications You must be signed ...
  21. [21]
    [PDF] D 3: Data-Driven Documents
    Abstract—Data-Driven Documents (D3) is a novel representation-transparent approach to visualization for the web. Rather than hide the underlying scenegraph ...
  22. [22]
    d3-selection | D3 by Observable
    ### Summary of D3 Selections (d3-selection)
  23. [23]
    Joining data | D3 by Observable - D3.js
    Binds the specified array of data with the selected elements, returning a new selection that represents the update selection: the elements successfully bound ...selection.data(data, key) · selection.enter() · selection.exit()
  24. [24]
    d3-transition | D3 by Observable - D3.js
    A transition is a selection-like interface for animating changes to the DOM. Instead of applying changes instantaneously, transitions smoothly interpolate ...Control flow · Timing · Modifying elements · Selecting elementsMissing: jQuery | Show results with:jQuery
  25. [25]
    Timing | D3 by Observable - D3.js
    A good easing function should return 0 if t = 0 and 1 if t = 1. If an easing function is not specified, it defaults to easeCubic. If a value is not specified, ...
  26. [26]
    Control flow | D3 by Observable - D3.js
    You may configure the transition using methods such as transition.delay, transition.duration, transition.attr and transition.style.Missing: default | Show results with:default
  27. [27]
    d3-interpolate | D3 by Observable
    ### Summary of Interpolation Types in D3 Transitions
  28. [28]
    Modifying elements | D3 by Observable - D3.js
    After selecting elements and creating a transition with selection.transition, use the transition's transformation methods to affect document content.
  29. [29]
    Selecting elements | D3 by Observable - D3.js
    Transitions are derived from selections via selection.transition. You can also create a transition on the document root element using d3.transition.
  30. [30]
    d3-timer | D3 by Observable - D3.js
    This module provides an efficient queue capable of managing thousands of concurrent animations, while guaranteeing consistent, synchronized timing.
  31. [31]
    General Update Pattern / D3 | Observable
    ### Summary of Enter-Update-Exit Pattern from ObservableHQ
  32. [32]
    Optimizing D3 Chart Performance for Large Data Sets - Reintech
    Mar 9, 2024 · Implement Virtualization: Only render elements that are visible to users. This technique is particularly effective for scrollable charts or ...
  33. [33]
    D3 by Observable | The JavaScript library for bespoke data ...
    D3. The JavaScript library for bespoke data visualization. Create custom dynamic visualizations with unparalleled flexibility. Get started · What is D3?What is D3? · Getting started · D3-hierarchy · D3-shape
  34. [34]
    GitHub - d3/d3: Bring data to life with SVG, Canvas and HTML.
    D3 (or D3.js) is a free, open-source JavaScript library for visualizing data. Its low-level approach built on web standards offers unparalleled flexibility.
  35. [35]
    Getting started | D3 by Observable - D3.js
    An open-source JavaScript library for custom dynamic visualizations with unparalleled flexibility and expressiveness · Observable Plot. An open-source ...
  36. [36]
  37. [37]
    d3/CHANGES.md at main · d3/d3
    Insufficient relevant content. The provided text is a partial GitHub page snippet and does not contain the full `CHANGES.md` file or specific details about D3.js versions v2, v3, v4, v5, v6, v7, or recent updates in 2024-2025. It only includes navigation, feedback, and footer elements without substantive release information.
  38. [38]
    d3-selection v3.0.0 ❘ Bundlephobia
    - **Gzipped Bundle Size**: 4.1 kB
  39. [39]
    Modifying elements | D3 by Observable
    After selecting elements, use the selection to modify the elements. For example, to set the class and color style of all paragraph elements in the current ...selection.style(name, value... · selection.append(type) · selection.insert(type, before)
  40. [40]
    Using canvas with d3.js, an introduction
    Canvas is an alternative to svg allowing to decrease the DOM load and increase your chart speed. Learn how to use it with d3.js.Just One Shape · Drawing Rectangles · Rectangles Are Drawn Using 3...
  41. [41]
    Handling events | D3 by Observable - D3.js
    Handling events ​. For interaction, selections allow listening for and dispatching of events. selection.on(typenames, listener, options) ​.Missing: jQuery | Show results with:jQuery
  42. [42]
    ARIA Authoring Practices Guide | APG | WAI - W3C
    This guide describes how to apply accessibility semantics to common design patterns and widgets. It provides design patterns and functional examplesPatterns · Practices · Landmark Regions · Providing Accessible Names...<|separator|>
  43. [43]
    D3 6.0 migration guide / D3 | Observable
    ### Summary of ES6 Adoption, Browser Compatibility, and Polyfills for Older Browsers
  44. [44]
    Let’s Make a Bar Chart, Part 1 / D3 | Observable
    ### Summary of Bar Chart Code Example from https://observablehq.com/@d3/lets-make-a-bar-chart
  45. [45]
    Barplot - The D3 Graph Gallery
    How to build a barchart with Javascript and D3.js: from the most basic example to highly customized examples.
  46. [46]
    Top 10 Common Issues in D3.js Visualizations and Proven Solutions
    Oct 29, 2025 · Consider monitoring the console for binding errors with helpful debugging methods like console logging. Analyzing discrepancies helps identify ...<|control11|><|separator|>
  47. [47]
    Responsive charts with d3.js - The D3 Graph Gallery
    Charts deserve to be responsive: their size must adapt to the device size. This post describes several approaches allowing to get this feature for d3.js charts.Missing: design viewBox<|control11|><|separator|>
  48. [48]
    d3-force | D3 by Observable - D3.js
    This module implements a velocity Verlet numerical integrator for simulating physical forces on particles. Force simulations can be used to visualize ...Force simulations · Link force · Collide force · Center forceMissing: WebGL | Show results with:WebGL<|control11|><|separator|>
  49. [49]
    d3-geo | D3 by Observable - D3.js
    D3 uses spherical GeoJSON to represent geographic features in JavaScript. D3 supports a wide variety of common and unusual map projections.Projections · Conic projections · Cylindrical projections · Azimuthal projections
  50. [50]
    d3-hierarchy | D3 by Observable - D3.js
    This module implements several popular techniques for visualizing hierarchical data. Node-link diagrams show topology using discrete marks for nodes and links.Hierarchies · Tree · Cluster · Partition
  51. [51]
    d3-zoom | D3 by Observable - D3.js
    Panning and zooming let the user focus on a region of interest by restricting the view. It uses direct manipulation: click-and-drag to pan (translate), spin ...
  52. [52]
    d3-brush | D3 by Observable - D3.js
    The d3-brush module allows interactive selection of a region using a pointing gesture, like clicking and dragging, to select elements or zoom in.
  53. [53]
    d3/d3-force: Force-directed graph layout using velocity ... - GitHub
    This module implements a velocity Verlet numerical integrator for simulating physical forces on particles. Force simulations can be used to visualize networks ...
  54. [54]
    Mike Bostock - Wikipedia
    Michael Bostock is an American computer scientist and data visualization specialist. He is one of the co-creators of Observable and a key developer of D3.js.
  55. [55]
    Powering the D3 Community - Observable
    Feb 17, 2021 · D3 has always been and will continue to be an exemplary open source library and thriving community, thanks to the dedicated leadership of Mike ...Missing: funding donations
  56. [56]
    D3.js 3 documentation - DevDocs
    May 3, 2017 · D3.js includes core (selections, transitions, data), scales, SVG, time, layouts, geography, geometry, and behaviors.
  57. [57]
    Contribute to d3/d3 - GitHub
    Contribute to d3/d3. Make your first contribution to this repository by tackling one of the issues listed below. This repo doesn't have any good first issues ...Missing: guidelines | Show results with:guidelines
  58. [58]
    Observable launches with $10.5M in funding to make sense of the ...
    Nov 20, 2020 · Observable Chief Technology Officer Mike Bostock created D3.js, the popular open-source library for data visualization, and was previously a ...Missing: donations | Show results with:donations
  59. [59]
    Migrating D3 Force Layout to WebAssembly - Scott Logic Blog
    Oct 30, 2017 · In this blog post I'll take a look at a real-world application of WebAssembly (WASM), the re-implementation of D3 force layout.Missing: integration | Show results with:integration
  60. [60]
    API index | D3 by Observable - D3.js
    D3 is a collection of modules that are designed to work together; you can use the modules independently, or you can use them together as part of the default ...Missing: 2024 | Show results with:2024
  61. [61]
  62. [62]
    Interactive Data Visualization for the Web [Book] - O'Reilly
    Author Scott Murray teaches you the fundamental concepts and methods of D3, a JavaScript library that lets you express data visually in a web browser. Along the ...
  63. [63]
    D3.js Tutorial – Data Visualization for Beginners - freeCodeCamp
    Nov 24, 2021 · We'll talk about what D3.js is, how it works, and we'll create some basic visualizations to add transitions, interactions, and zooming. Table of ...
  64. [64]
  65. [65]
    D3FC
    D3FC provides higher-level components for building interactive charts with D3, using a compositional approach, and also provides low-level components in some ...
  66. [66]
    NVD3.js
    NVD3.js is a collection of reusable, customizable charts for d3.js, used for powerful analytics in the financial industry.Examples · Live Code Examples Powered... · Blog Archive
  67. [67]
    Data visualization with Vue.js and D3 - LogRocket Blog
    Jul 6, 2022 · In this article we're going to use D3.js and Vue.js to create a line chart, so you can see how useful D3 and Vue can be when building data visualizations.
  68. [68]
  69. [69]
    r/d3js - Reddit
    Sep 21, 2025 · I'm building a web platform for browsing maps using D3.js. The maps are made up of map templates and map data, both in GeoJSON format (two files ...NewD3 is going to be made ...
  70. [70]
    D3 Online - Meetup
    A global gathering place for anyone interested in learning and building with d3.js. We will hold online events across timezones to bring together our worldwide ...Missing: workshops | Show results with:workshops
  71. [71]
    NYC D3.js - Meetup
    This is a group for anyone interested in anything D3.js related. All skill levels are welcome. This group was started so that members could meet and learn ...Missing: workshops | Show results with:workshops
  72. [72]
    Blockbuilder | blockbuilder
    Aug 29, 2021 · Blockbuilder was a tool to create, fork, and edit d3.js code snippets in the browser, but it is now shut down.Missing: legacy | Show results with:legacy
  73. [73]
    User Guide - eslint-plugin-d3
    Dec 8, 2019 · If you want to run eslint from command line, make sure you include the .d3 extension using the --ext option or a glob pattern because ESLint ...
  74. [74]
    Comparison between d3.js and chart.js (only for charts) [closed]
    Dec 7, 2014 · d3.js is not a "charting" library. It is a library for creating and manipulating SVG/HTML. It provides tools to help you visualize and ...
  75. [75]
    Charting the waters (pt. 2): a comparison of JavaScript ... - Medium
    Jan 24, 2019 · Chart. js and D3 offer responsive charts out of the box (for D3, specify a viewBox instead of width and height for the svg container). Dygraphs ...
  76. [76]
    How and why I used Plotly (instead of D3) to visualize my ...
    May 4, 2018 · The main difference between D3 and Plotly is that Plotly is specifically a charting library. Let's build a bar chart to get to know how Plotly works.Missing: comparison | Show results with:comparison
  77. [77]
    Vega and D3
    Vega - A Visualization Grammar. Vega is a visualization grammar, a declarative format for creating, saving, and sharing interactive visualization designs.
  78. [78]
    Bringing Together React, D3, And Their Ecosystem
    Feb 21, 2018 · React and D3.js are great tools to help us deal with the DOM and its challenges. They can surely work together, and we are empowered to choose where to draw ...React And D3. Js # · Approaches # · React-D3. Js Libraries #<|control11|><|separator|>
  79. [79]
    D3.js vs React D3 Library | What are the differences? - StackShare
    D3.js and React D3 Library are both open source tools. D3.js with 85.8K GitHub stars and 21K forks on GitHub appears to be more popular than ...
  80. [80]
    The Trouble with D3 - Medium
    Jun 11, 2018 · For these folks, d3 offers great power and flexibility, but first they must learn some foundational technical skills to operate in this ...
  81. [81]
    D3.js for Interactive Data Visualizations: Web-Based Insights
    Among the most powerful tools for web-based data visualizations is D3.js (Data-Driven Documents), a JavaScript library that allows developers to create dynamic ...
  82. [82]
    D3js vs Plotly: Data Visualization Comparison - 6Sense
    Comparing the market share of D3js and Plotly​​ D3js has a 8.58% market share in the Data Visualization category, while Plotly has a 1.27% market share in the ...
  83. [83]
    Unlock 2024's Best JavaScript Libraries for Data Visualization - vizGPT
    Jun 7, 2025 · Top 5 Data Visualization JavaScript Libraries in 2024 · 1. D3.js · 2. Vega and Vega-Lite · 3. ECharts · 4. AntV G2 · 5. Observable Plot.
  84. [84]
    For Protovis Users - d3.js - Mike Bostock
    The next big difference is that D3 code describes transformations of scenes (scene changes), whereas Protovis describes representations (the scenes themselves).