How to make a horizontal stacked bar chart with d3.js?

Member

by lily , in category: Javascript , a year ago

How to make a horizontal stacked bar chart with d3.js?

Facebook Twitter LinkedIn Telegram Whatsapp

1 answer

by aniya.jaskolski , a year ago

@lily 

To make a horizontal stacked bar chart with d3.js, follow these steps:

  1. Prepare the data: Create an array of objects with the data you want to visualize. Each object in the array represents a category, and should include keys for the category name and values for each stack in the bar chart.
1
2
3
4
5
6
var data = [
  { category: "Category 1", stack1: 20, stack2: 30, stack3: 10 },
  { category: "Category 2", stack1: 40, stack2: 15, stack3: 25 },
  { category: "Category 3", stack1: 10, stack2: 5, stack3: 30 },
  // ...
];


  1. Set up the SVG container: Create an SVG container to hold the bar chart and set its width and height.
1
2
3
4
5
6
7
var svgWidth = 500;
var svgHeight = 300;

var svg = d3.select("body")
  .append("svg")
  .attr("width", svgWidth)
  .attr("height", svgHeight);


  1. Define the scales: Determine the scales for the x-axis and y-axis.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
var xScale = d3.scaleLinear()
  .domain([0, d3.max(data, function(d) {
    return d3.sum(Object.values(d));
  })])
  .range([0, svgWidth]);

var yScale = d3.scaleBand()
  .domain(data.map(function(d) {
    return d.category;
  }))
  .range([0, svgHeight])
  .padding(0.1);


  1. Create the bars: Bind the data to the bars and append rectangles to represent each stack in the bar chart.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
var bars = svg.selectAll("rect")
  .data(data)
  .enter()
  .append("rect")
  .attr("x", 0)
  .attr("y", function(d) {
    return yScale(d.category);
  })
  .attr("width", function(d) {
    return xScale(d3.sum(Object.values(d)));
  })
  .attr("height", yScale.bandwidth())
  .attr("fill", function(d) {
    // Set individual stack colors here
  });


  1. Add labels: Add labels to the bars to display the values of each stack.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
var labels = svg.selectAll("text")
  .data(data)
  .enter()
  .append("text")
  .text(function(d) {
    return Object.values(d).slice(1).join(", ");
  })
  .attr("x", function(d) {
    return xScale(d3.sum(Object.values(d))) + 5;
  })
  .attr("y", function(d) {
    return yScale(d.category) + yScale.bandwidth() / 2;
  })
  .attr("dy", "0.35em");


Remember to customize the colors, styles, and other attributes according to your needs.

Related Threads:

How to make a bar chart for time duration with d3.js?
How to make a multi-series bar chart in d3.js?
How to add a dataset to the stacked bar in chart.js?
How to add horizontal lines on bar charts in d3.js?
How to customize horizontal bar in chart.js?
How to create horizontal scrolling chart in d3.js?