Hexbinning earthquakes (magnitude 3.0 or greater) in the Canterbury region of New Zealand during the month of September, 2010.
Earthquake data sourced from GeoNet.
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <script src="http://d3js.org/d3.v3.min.js"></script> | |
| <script src="http://d3js.org/d3.hexbin.v0.js"></script> | |
| <style type="text/css"> | |
| html, body { margin: 0; padding: 0; height: 100%; } | |
| select { | |
| display: inline; | |
| } | |
| .axis text { | |
| font: 10px sans-serif; | |
| } | |
| .axis path, | |
| .axis line { | |
| fill: none; | |
| stroke: #000; | |
| shape-rendering: crispEdges; | |
| } | |
| div#switcher { margin: 0em 2.5em 1em; } | |
| p { margin-top: 0; } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="quake" data-source="quakes_christchurch_20100901-20101001_mag-gt3.json"></div> | |
| <div id="switcher"> | |
| <p> | |
| Display | |
| <select id="y-select" disabled> | |
| <option value="magnitude">magnitude</option> | |
| <option value="depth">depth</option> | |
| <option value="phases">phases</option> | |
| </select> | |
| over time. | |
| </p> | |
| </div> | |
| <script type="text/javascript"> | |
| (function () { | |
| var features, key, current, x, y, | |
| labels = { | |
| 'magnitude': "Magnitude", | |
| 'depth': "Depth (km)", | |
| 'phases': "Phases" | |
| }, | |
| views = {}, | |
| container = document.getElementById('quake'); | |
| var rad = 16, | |
| margin = {top: 12, right: 3, bottom: 38, left: 45}, | |
| width = 960 - margin.left - margin.right, | |
| height = 450 - margin.top - margin.bottom; | |
| var svg = d3.select(container).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 y_select = d3.select("#y-select") | |
| .on("change", function (e) { | |
| var el = y_select.node(); | |
| key = el.options[el.selectedIndex].value; | |
| update(); | |
| }); | |
| svg.append("clipPath") | |
| .attr("id", "clip") | |
| .append("rect") | |
| .attr("class", "mesh") | |
| .attr("width", width - 1) | |
| .attr("height", height - .25) | |
| .attr("transform", "translate(1,0)"); | |
| var hexbin = d3.hexbin() | |
| .size([width, height]) | |
| .radius(rad) | |
| .x(function (d) { return x(get_date(d)); }); | |
| d3.json(container.dataset.source, function(collection) { | |
| var el = y_select.node(); | |
| features = collection.features; | |
| key = el.options[el.selectedIndex].value; | |
| init(); | |
| update(); | |
| el.removeAttribute("disabled"); | |
| }); | |
| function init() { | |
| x = d3.time.scale() | |
| .domain(d3.extent(features, get_date)) | |
| .range([0, width]); | |
| } | |
| function update() { | |
| if (!(key in views)) { | |
| views[key] = createView(); | |
| } | |
| enableView(views[key]); | |
| } | |
| function createView() { | |
| var view = svg.append("g") | |
| .attr("id", "view-" + key) | |
| .style("display", "none"); | |
| var y = d3.scale.linear() | |
| .domain(d3.extent(features, get_y)) | |
| .range([height, 0]); | |
| hexbin.y(function (d) { return y(get_y(d)); }); | |
| var bin = hexbin(features), | |
| color = d3.scale.linear() | |
| .domain(d3.extent(bin, function (d) { return d.length; })) | |
| .range([d3.lab("white").darker(.2), d3.lab("#A40000")]) | |
| .interpolate(d3.interpolateLab); | |
| view.append("g") | |
| .attr("class", "x axis") | |
| .attr("transform", "translate(0," + height + ")") | |
| .call(d3.svg.axis().scale(x).orient("bottom")) | |
| .append("text") | |
| .attr("class", "label") | |
| .attr("x", width) | |
| .attr("y", 35) | |
| .style("text-anchor", "end") | |
| .text("Earthquake origin time"); | |
| view.append("g") | |
| .attr("class", "y axis") | |
| .call(d3.svg.axis().scale(y).orient("left")) | |
| .append("text") | |
| .attr("class", "label") | |
| .attr("transform", "rotate(-90)") | |
| .attr("y", -40) | |
| .attr("dy", ".71em") | |
| .style("text-anchor", "end") | |
| .text(labels[key]); | |
| view.append("g") | |
| .attr("clip-path", "url(#clip)") | |
| .selectAll(".hexagon") | |
| .data(bin) | |
| .enter().append("path") | |
| .attr("class", "hexagon") | |
| .attr("d", hexbin.hexagon()) | |
| .attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; }) | |
| .attr("fill", function (d) { return color(d.length); }); | |
| return view; | |
| } | |
| function enableView(view) { | |
| if (current) { | |
| current.style("display", "none"); | |
| } | |
| view.style("display", "inline"); | |
| current = view; | |
| } | |
| function get_date(d) { | |
| return d3.time.format.iso.parse(d.properties.origintime); | |
| } | |
| function get_y(d) { | |
| return d.properties[key]; | |
| } | |
| }()); | |
| </script> | |
| </body> | |
| </html> |