D3 Horizontal Grouped Bar Chart JSON

HTML

<svg class="chart"></svg>

CSS

/*
.chart rect {
  fill: steelblue;
}
*/
.chart .legend {
  fill: black;
  font: 14px sans-serif;
  text-anchor: start;
  font-size: 12px;
}

.chart text {
  fill: black;
  font: 10px sans-serif;
  text-anchor: center;
}

.chart .label {
  fill: black;
  font: 14px sans-serif;
  text-anchor: end;
}

/* .bar:hover {
  fill: brown;
} */

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

JavaScript

var data = {
  labels: [
    'A', 'B', 'C'
  ],
  series: [
    {
      label: 'HTC',
      values: [{val:1}, {val:1}, {val:1}]
    },
    {
      label: 'Registry',
      values: [12, 43, 22]
    }]
};

var chartWidth       = 300,
    barHeight        = 40,
    groupHeight      = barHeight * data.series.length,
    gapBetweenGroups = 10,
    spaceForLabels   = 150,
    spaceForLegend   = 150;

// Zip the series data together (first values, second values, etc.)
var zippedData = [];
for (var i=0; i<data.labels.length; i++) {
  for (var j=0; j<data.series.length; j++) {
    zippedData.push(data.series[j].values[i]);
  }
}

console.log(zippedData);
// Color scale
var color = d3.scaleOrdinal()
            .range(["#16A085", "#33435C"]);
var chartHeight = barHeight * zippedData.length + gapBetweenGroups * data.labels.length;

var x = d3.scaleLinear()
    .domain([0, d3.max(zippedData)])
    .range([0, chartWidth]);

var y = d3.scaleLinear()
    .range([chartHeight + gapBetweenGroups, 0]);

var yAxis = d3.axisLeft()
    .scale(y)
    .tickFormat('')
    .tickSize(0);
    
var xAxis = d3.axisBottom(x).tickFormat(function(d){ 
return d;
});

// Specify the chart area and dimensions
var chart = d3.select(".chart")
    .attr("width", spaceForLabels + chartWidth + spaceForLegend)
    .attr("height", chartHeight +30);
    
   // console.log(chartHeight);

// Create bars
var bar = chart.selectAll("g")
    .data(zippedData)
    .enter().append("g")
    .attr("transform", function(d, i) {
      return "translate(" + spaceForLabels + "," + (i * barHeight + gapBetweenGroups * (0.5 + Math.floor(i/data.series.length))) + ")";
    });

// Create rectangles of the correct width
bar.append("rect")
    .attr("fill", function(d,i) { return color(i % data.series.length); })
    .attr("class", "bar")
    .attr("width", x)
    .attr("height", barHeight - 1);

/* // Add text label in bar
bar.append("text")
    .attr("x", function(d) { return x(d) - 3; })
    .attr("y", barHeight / 2)
   ...