JSFiddle - React, Tailwind, and code Playground
by cesutherland
HTML
<script src="https://raw.github.com/documentcloud/underscore/1.4.4/underscore.js"></script>
CSS
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.layer-0 .bar {
fill: steelblue;
}
.layer-1 .bar {
fill: #306DA2;
}
.x.axis path {
display: none;
}
JavaScript
function drawIt (data) {
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 450 - margin.left - margin.right,
height = 320 - margin.top - margin.bottom,
months = data[0].length,
start = new Date(data[0][0].key),
end = new Date(data[0][data[0].length - 1].key);
var x = d3.time.scale()
.domain([start, new Date(end).setUTCDate(end.getUTCDate() + 1)])
.range([0, width - margin.left - margin.right])
var y = d3.scale.linear()
.range([height, 0]);
var format = d3.time.format('%m');
var xAxis = d3.svg.axis()
.scale(x)
.ticks(d3.time.months, 1)
.tickFormat(function (d) {
if (d.getUTCMonth() === 0) {
return d.getUTCFullYear();
} else {
return format(d);
}
})
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
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 + ")");
y.domain([0, d3.max(data, function(series) { return d3.max(series, function(d) { return d.value; }); })]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(" + margin.left + "," + 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("Downloads");
var layer = svg.selectAll(".layer")
.data(data)
.enter().append("g")
.attr("class", function (d, i) {
return 'layer layer-' + i;
});
layer.selectAll(".bar")
.data(function (d) { return d; })
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(new Date(d.key)) - width / (months + 2) / 2 + margin.left; })
...