Built with blockbuilder.org
forked from vikkya's block: time series bar chart (horizontal)
license: mit |
Built with blockbuilder.org
forked from vikkya's block: time series bar chart (horizontal)
[ { | |
"time": "17:00:00", | |
"time_2": "19:00:00", | |
"total": "H" | |
}] |
<!DOCTYPE html> | |
<head> | |
<meta charset="utf-8"> | |
<script src="https://d3js.org/d3.v4.min.js"></script> | |
<style> | |
</style> | |
</head> | |
<body> | |
<div id="viz"></div> | |
<script> | |
var margin = { | |
top: 10, | |
right: 10, | |
bottom: 10, | |
left: 10 | |
}, | |
width = 130 - margin.left - margin.right, | |
height = 10 - margin.top - margin.bottom; | |
var today = new Date(); | |
today.setHours(0, 0, 0, 0); | |
todayMillis = today.getTime(); | |
var svg = d3.select("#viz").append("svg").attr("viewBox", `0 0 ${(width + margin.left + margin.right)} ${(height + margin.top + margin.bottom)}`) | |
.attr("width", "100%") | |
.attr("height", "100%"); | |
var g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
d3.json("data.json", function(err, data){ | |
data.forEach(function(d) { | |
var parts = d.time.split(/:/); | |
var timePeriodMillis = (parseInt(parts[0], 10) * 60 * 60 * 1000) + | |
(parseInt(parts[1], 10) * 60 * 1000) + | |
(parseInt(parts[2], 10) * 1000); | |
d.time = new Date(); | |
d.time.setTime(todayMillis + timePeriodMillis); | |
var parts_2 = d.time_2.split(/:/); | |
var timePeriodMillis_2 = (parseInt(parts_2[0], 10) * 60 * 60 * 1000) + | |
(parseInt(parts_2[1], 10) * 60 * 1000) + | |
(parseInt(parts_2[2], 10) * 1000); | |
d.time_2 = new Date(); | |
d.time_2.setTime(todayMillis + timePeriodMillis_2); | |
}); | |
var x = d3.scaleTime() | |
.range([0, width]); | |
var y = d3.scaleBand().rangeRound([height, 0]).padding(0.5); | |
var xAxis = d3.axisBottom() | |
.scale(x) | |
var yAxis = d3.axisLeft() | |
.scale(y) | |
var max_date = d3.extent([d3.max(data, function(d){return d.time}), d3.max(data, function(d){return d.time_2})]) | |
console.log(max_date) | |
x.domain([today, max_date[1]]) | |
y.domain(data.map(function(d){ return d.total})) | |
g.selectAll('.chart_1') | |
.data(data) | |
.enter().append('rect') | |
.attr('class', 'bar') | |
.attr("fill", "#cccccc") | |
.attr('y', function (d) { | |
return y(d.total) | |
}) | |
.attr('width', "100%") | |
.attr('height', y.bandwidth()); | |
g.selectAll('.chart') | |
.data(data) | |
.enter().append('circle') | |
.attr('class', 'bar') | |
.attr("fill", "blue") | |
.attr('cy', function (d) { | |
return y(d.total) | |
}) | |
.attr("cx", function(d){ return x(d.time)}) | |
.attr("r", 2.5) | |
g.selectAll('.lines') | |
.data(data) | |
.enter().append('line') | |
.attr('class', 'line_1') | |
.attr("stroke", "red") | |
.attr("x1", function(d){ return x(d.time_2)}) | |
.attr('y1', function(d){ return y(d.total) + y.bandwidth()}) | |
.attr("x2", function(d){ return x(d.time_2)}) | |
.attr('y2', function(d){ return y(d.total) - 10}); | |
}) | |
</script> | |
</body> |