- chart reading data from json earthquakes feed
- it's scary
forked from darrenjaworski's block: OK Earthquakes IX
| license: mit |
forked from darrenjaworski's block: OK Earthquakes IX
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta http-equiv="x-ua-compatible" content="ie=edge"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"></script> | |
| <style> | |
| html { | |
| font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; | |
| } | |
| body { | |
| margin: 0; | |
| } | |
| .chart { | |
| width: 100%; | |
| } | |
| .axis path, | |
| .axis line { | |
| fill: none; | |
| stroke: #000; | |
| shape-rendering: crispEdges; | |
| } | |
| text { | |
| font-size: 18px; | |
| } | |
| .x.axis path { | |
| display: none; | |
| } | |
| #width { | |
| max-width: 70em; | |
| margin: auto; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="width"> | |
| <div class="chart"></div> | |
| </div> | |
| <script> | |
| var margin = { | |
| top: 20, | |
| right: 40, | |
| bottom: 50, | |
| left: 60 | |
| }, | |
| width = document.getElementById("width").offsetWidth - margin.left - margin.right, | |
| height = (document.getElementById("width").offsetWidth * .5) - margin.top - margin.bottom; | |
| var color = d3.scale.ordinal() | |
| .range(["#deebf7", "#c6dbef", "#9ecae1", "#6baed6", "#4292c6", "#2171b5", "#08519c", "#08306b"]); | |
| var x = d3.scale.ordinal() | |
| .rangeRoundBands([0, width], .1); | |
| var y = d3.scale.linear() | |
| .range([height, 0]); | |
| var xAxis = d3.svg.axis() | |
| .scale(x) | |
| .orient("bottom"); | |
| var yAxis = d3.svg.axis() | |
| .scale(y) | |
| .orient("left"); | |
| var svg = d3.select(".chart").append("svg") | |
| .attr("class", "eqchart") | |
| .attr("width", width + margin.left + margin.right) | |
| .attr("height", height + margin.top + margin.bottom) | |
| .append("g") | |
| .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
| d3.json('https://api.sigmacomputing.io/dl/api/v1/max/blockbuilder-sources/exports/usgs_earthquakes?filetype=json', ready); | |
| function ready(error, quakes) { | |
| if (error) { | |
| return console.warn(error); | |
| } | |
| var re = new RegExp('Oklahoma'); | |
| quakes.features = quakes.features.filter(function(d){ | |
| return re.test(d.properties.place); | |
| }); | |
| totalPerYear = d3.nest() | |
| .key(function(d) { return new Date(d.properties.time).getFullYear(); }) | |
| .rollup(function(leaves) { | |
| var brokenMag = d3.nest() | |
| .key(function(d) { return Math.round(d.properties.mag); }) | |
| .rollup( function(innerLeaves) { return innerLeaves.length; }) | |
| .entries(leaves); | |
| return { "total": leaves.length, "brokenMag": brokenMag }; }) | |
| .entries(quakes.features); | |
| yMax = d3.max(totalPerYear, function(d) { return d.values.total; }); | |
| magDomain = d3.extent(quakes.features, function(d){ return d.properties.mag; }); | |
| xExtent = totalPerYear.map(function(d) { return d.key; }); | |
| x.domain(xExtent); | |
| y.domain([0, yMax]); | |
| var colorDomain = []; | |
| var index = 0; | |
| for ( integer = Math.round( magDomain[0] ); integer < Math.round( magDomain[1] ) + 1; integer++ ) { | |
| colorDomain[index] = integer.toString(); | |
| index += 1; | |
| }; | |
| color.domain(colorDomain); | |
| svg.append("g") | |
| .attr("class", "x axis") | |
| .attr("transform", "translate(0," + height + ")") | |
| .call(xAxis) | |
| .selectAll("text") | |
| .style("text-anchor", "end") | |
| .style("font-weight", "bold") | |
| .attr("dx", "-.5em") | |
| .attr("dy", ".5em") | |
| .attr("transform", "rotate(-45)" ); | |
| 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("Earthquake Count"); | |
| totalPerYear.forEach(function(d) { | |
| var y0 = 0; | |
| d.year = d.values.brokenMag.map( function(name, i) { return { name: name, y0: y0, y1: y0 += +name.values }; }); | |
| }) | |
| var year = svg.selectAll(".year") | |
| .data(totalPerYear) | |
| .enter() | |
| .append("g") | |
| .attr("class", "g") | |
| .attr("transform", function(d) { return "translate(" + x(d.key) + ",0)"; }); | |
| year.selectAll("rect") | |
| .data(function(d) { return d.year; }) | |
| .enter().append("rect") | |
| .attr("width", x.rangeBand()) | |
| .attr("y", function(d) { return y(d.y1); }) | |
| .attr("height", function(d) { return y(d.y0) - y(d.y1); }) | |
| .style("fill", function(d) { return color(d.name.key); }); | |
| var legend = svg.selectAll(".legend") | |
| .data(color.domain().slice().reverse()) | |
| .enter().append("g") | |
| .attr("class", "legend") | |
| .attr("transform", function(d, i) { return "translate(40," + 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> |