JSFiddle - React, Tailwind, and code Playground

HTML

<form>
  <label><input type="radio" name="mode" value="grouped"> Grouped</label>
  <label><input type="radio" name="mode" value="stacked" checked> Stacked</label>
</form>

CSS

body {
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  margin: auto;
  position: relative;
  width: 960px;
}

text {
  font: 10px sans-serif;
}

.axis path,
.axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}

form {
  position: absolute;
  right: 10px;
  top: 10px;
}

JavaScript

var n = 3, // number of layers
    m = 3, // number of samples per layer
    stack = d3.layout.stack(),
    // layers = stack(d3.range(n).map(function() { return bumpLayer(m, .1); })),
    layers = [
                [
                    {"x":0,"y":200,"y0":0},
                    {"x":1,"y":150,"y0":0},
                    {"x":2,"y":100,"y0":0}
                ],
                [
                    {"x":0,"y":100,"y0":1},
                    {"x":1,"y":80,"y0":1},
                    {"x":2,"y":70,"y0":1}
                ],
                [
                    {"x":0,"y":30,"y0":2},
                    {"x":1,"y":40,"y0":2},
                    {"x":2,"y":50,"y0":2}
                ]
            ];
    yGroupMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y; }); }),
    yStackMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y0 + d.y; }); });

console.log(layers);


var margin = {top: 40, right: 10, bottom: 20, left: 10},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var x = d3.scale.ordinal()
    .domain(d3.range(m))
    .rangeRoundBands([0, width], .08);

var y = d3.scale.linear()
    .domain([0, yStackMax])
    .range([height, 0]);

var color = d3.scale.linear()
    .domain([0, n - 1])
    .range(["#aad", "#556"]);

// var formatAxis = d3.format("  0");
// var axis = d3.svg.axis()
//         .scale(xScale)
//         .tickFormat(formatAxis)
//         .ticks(3)
//         .tickValues([100, 200, 300]) //specify an array here for values
//         .orient("bottom");

var xAxis = d3.svg.axis()
    .scale(x)
    .tickSize(2)
    .tickPadding(6)
    .tickFormat(function(d) { return "test" + d; })
    .orient("bottom");


var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," +...