Built with blockbuilder.org
forked from hyonschu's block: Tufte Minimal Line Plot
Built with blockbuilder.org
forked from hyonschu's block: Tufte Minimal Line Plot
<!DOCTYPE html> | |
<head> | |
<meta charset="utf-8"> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
<script src = 'https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js'></script> | |
<style> | |
.axis path, .yaxis path { fill: none; shape-rendering: auto; } | |
.axis text, .yaxis text, .notes{ font-family: "Times"; font-size: 12px; color: black;} | |
</style> | |
</head> | |
<body> | |
<script> | |
//data | |
var x = _.range(1967,1978); | |
var y = [287, 314, 371,386,386,394,388,380,390,400,390]; | |
// var y = [] | |
min = 287; | |
max = 400; | |
// | |
// for (i=0; i<x.length; i++) { | |
// y.push(Math.random()*7) | |
// } | |
// y = y.sort(d3.ascending) | |
// | |
// normalizing it between actual values (~287 - 400), not sure why y-values are so small... | |
// create new JSON file {year: x, values: y} | |
var dataset = []; | |
for (var i=0; i<x.length; i++) { | |
var obj = {'year': x[i], 'values': y[i]}; | |
dataset.push(obj) | |
} | |
// layout variables | |
var pad = 50; | |
var ww = 640; | |
var hh = 400; | |
// CREATE SVG CANVAS | |
var canvas = d3.select('body') | |
.append('svg').attr({'height': hh,'width': ww }) | |
// CREATE SCALES TO AUTO ADJUST USING D3.SCALE | |
var xscale = d3.scale.linear() | |
.range([pad,ww-pad]).domain([d3.min(x), d3.max(x)]) | |
var yscale = d3.scale.linear() | |
.range([hh-pad,pad]).domain([min,max]) | |
// DECLARE AXES | |
var xAx = d3.svg.axis() | |
.scale(xscale).orient('bottom') | |
.ticks(x.length).tickFormat(d3.format('d')) | |
var yAx = d3.svg.axis() | |
.scale(yscale).ticks(5) | |
.tickFormat(function(d) { return "$"+d ; }).orient('left') | |
// drawing the output | |
var lineFunc = d3.svg.line() | |
.x(function(d) {return xscale(d.year);}) | |
.y(function(d) {return yscale(d.values);}) | |
canvas.append('svg:path') | |
.attr('d', lineFunc(dataset)) | |
.attr('stroke', 'black') | |
.attr('stroke-width', 0.8) | |
.attr('fill', 'none'); | |
canvas.selectAll('circles') | |
.data(dataset).enter().append('circle') | |
.attr({ | |
'cx': function(d){ return xscale(d.year); }, | |
'cy': function(d){ return yscale(d.values); }, | |
'r': 5, | |
'stroke-width': 5, | |
'stroke': 'white' | |
}); | |
canvas.append("line") | |
.attr({'class': 'mean-line','x1': pad,'x2': ww-(pad/2), | |
'y1': yscale(max*0.95),'y2': yscale(max*0.95)}) | |
.attr({'stroke': 'black', | |
'stroke-width': 0.5, | |
'stroke-dasharray': '5,5'}) | |
canvas.append("line") | |
.attr({'class': 'mean-line','x1': pad,'x2': ww-(pad/2), | |
'y1': yscale(max),'y2': yscale(max)}) | |
.attr({'stroke': 'black', | |
'stroke-width': 0.5, | |
'stroke-dasharray': '5,5'}) | |
canvas.append("g") | |
.attr("class", "axis") | |
.attr("transform", "translate(0," + (hh - 40) + ")").call(xAx) | |
canvas.append("g") | |
.attr("class", "yaxis") | |
.attr("transform", "translate(" + 40 + ",0)").call(yAx) | |
canvas.append('line') | |
.data(dataset) | |
.attr({'class': 'mean-line', | |
'x1': function(d) { return xscale(d.year) }, | |
'x2': function(d) { return xscale(d.year)}, | |
'y1': d3.max(y)-8 ,'y2': d3.max(y)-18}) | |
.attr({ | |
'stroke': 'black', | |
'stroke-width': 1, | |
}) | |
</script> | |
<div class='notes'>Per capita budget expenditures in constant dollars</div> | |
</body> | |
</html> | |