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: [14, 8, 15]
}]
};
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)
.attr("fill", "red")
.attr("dy", ".35em")
.text(function(d) { return d; });...