Skip to content

Instantly share code, notes, and snippets.

@itsprdp
Created February 18, 2015 07:35
Show Gist options
  • Save itsprdp/fb8b33a45d28e43d0990 to your computer and use it in GitHub Desktop.
Save itsprdp/fb8b33a45d28e43d0990 to your computer and use it in GitHub Desktop.
Grouped bar chart with d3
<!DOCTYPE html>
<meta charset="utf-8">
<style>
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.bar {
fill: steelblue;
}
.x.axis path {
display: none;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var x0 = d3.scale.ordinal()
.rangeRoundBands([0, width], .4);
var x1 = d3.scale.ordinal();
var y = d3.scale.linear().range([height, 0]);
var color = d3.scale.ordinal()
.range(["#98abc5", "#d0743c", "#ff8c00"]);
var xAxis = d3.svg.axis()
.scale(x0)
.orient("bottom")
.ticks(5);
var yAxis = d3.svg.axis()
.scale(y)
.orient("right")
.tickFormat(function(d) { return parseInt(d) });
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 + "," + margin.top + ")");
var data = {"aggregate":{"bookings":9,"bookings_rev":2495.0,"net_stays":9,"net_stays_rev":2495.0},"daily":{"2015-01-28":{"bookings":2,"bookings_rev":448.0,"net_stays":4,"net_stays_rev":0},"2015-01-30":{"bookings":1,"bookings_rev":169.0,"net_stays":3,"net_stays_rev":0},"2015-02-02":{"bookings":2,"bookings_rev":726.0,"net_stays":5,"net_stays_rev":0},"2015-02-04":{"bookings":4,"bookings_rev":1152.0,"net_stays":8,"net_stays_rev":0},"2015-02-05":{"bookings":2,"bookings_rev":0,"net_stays":1,"net_stays_rev":538.0},"2015-02-09":{"bookings":0,"bookings_rev":0,"net_stays":1,"net_stays_rev":189.0},"2015-02-13":{"bookings":0,"bookings_rev":0,"net_stays":1,"net_stays_rev":199.0},"2015-02-24":{"bookings":0,"bookings_rev":0,"net_stays":1,"net_stays_rev":188.0},"2015-03-01":{"bookings":0,"bookings_rev":0,"net_stays":2,"net_stays_rev":448.0},"2015-03-10":{"bookings":0,"bookings_rev":0,"net_stays":1,"net_stays_rev":169.0},"2015-03-16":{"bookings":0,"bookings_rev":0,"net_stays":2,"net_stays_rev":764.0}}};
var dataset = [];
var keyNames = ['bookings','net_stays'];
for(i = 0; i < Object.keys(data.daily).length; i++ ) {
var date = Object.keys(data.daily)[i];
dataset[i] = {
date: date,
values: [
{name: 'Bookings', value: data.daily[date][keyNames[0]]},
{name: 'Net Stays', value: data.daily[date][keyNames[1]]}
]
};
}
x0.domain(dataset.map(function(d) { return d.date; }));
x1.domain(['Bookings','Net Stays']).rangeRoundBands([0, x0.rangeBand()]);
y.domain([0, d3.max(dataset, function(d) { return d3.max(d.values, function(d) { return d.value; }); })]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Number of Bookings vs Net Stays");
var state = svg.selectAll(".date")
.data(dataset)
.enter().append("g")
.attr("class", "g")
.attr("transform", function(d) { return "translate(" + x0(d.date) + ",0)"; });
state.selectAll("rect")
.data(function(d) { return d.values; })
.enter().append("rect")
.attr("width", x1.rangeBand())
.attr("x", function(d) { return x1(d.name); })
.attr("y", function(d) { return y(d.value); })
.attr("height", function(d) { return height - y(d.value); })
.style("fill", function(d) { return color(d.name); });
var legend = svg.selectAll(".legend")
.data(['Bookings','Net Stays'].slice().reverse())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment