D3 Horizontal Bar Chart

D3 Horizontal Bar Chart

by Rishabh Sharma

HTML

<script src="https://d3js.org/d3.v4.js"></script>
<svg width="400" height="300"></svg>

CSS

.axis path,
.axis line {
  fill: none;
  stroke: #D4D8DA;
  stroke-width: 1px;
  shape-rendering: crispEdges;
}

.x path {
  display: none;
}



.labels {
  font-family: sans-serif;
  font-size: 12px;
  fill: white;
}

JavaScript

var data = [{
  "area": "4 ",
  "value": 90
}, {
  "area": "3",
  "value": 35
}, {
  "area": "2",
  "value": 75
}, {
  "area": "1",
  "value": 95
}, ];

var colors = [
  '#1F87C4',
  '#2AC6FF',
  '#58ECBA',
  '#F9DB63'
];

var svg = d3.select("svg"),
  margin = {
    top: 20,
    right: 20,
    bottom: 30,
    left: 80
  },
  width = +svg.attr("width") - margin.left - margin.right,
  height = +svg.attr("height") - margin.top - margin.bottom;

var x = d3.scaleLinear().range([0, width]);
var y = d3.scaleBand().range([height, 0]);

var g = svg.append("g")
  .attr("transform", "translate(" + margin.left + "," + margin.top + ")");


/* data.sort(function(a, b) {
  return a.value - b.value;
}); */

x.domain([0, d3.max(data, function(d) {
  return d.value;
})]);
y.domain(data.map(function(d) {
  return d.area;
})).padding(0.1);

/* g.append("g")
    .attr("class", "x axis")
   	.attr("transform", "translate(0," + height + ")")
  	.call(d3.axisBottom(x).ticks(5).tickFormat(function(d) { return parseInt(d / 1000); }).tickSizeInner([-height])); */

g.append("g")
  .attr("class", "y axis")
  .call(d3.axisLeft(y));

g.selectAll(".bar")
  .data(data)
  .enter().append("rect")
  .attr("class", "bar")
  .attr("x", 0)
  .attr("height", y.bandwidth())
  .attr("y", function(d) {
    return y(d.area);
  })
  .attr("width", function(d) {
    return x(d.value);
  })
  .attr('fill', function(d, i) {
    return colors[i];
  })
  .attr('rx', 10);
  
var labels = g.append('g')
	.attr('class', 'text-group');

labels.selectAll('text')
  .data(data)
  .enter().append('text')
  .attr('class', 'labels')
  .attr("x", function(d) {
  	return x(d.value) - 40;
  })
  .attr("y", function(d) {
    return y(d.area) + 30;
  })
  .text(function(d) {
    return d.value
  })