Heightmap with Hexagonal Binning
Each cell takes the mean value as its color.
Heightmap with Hexagonal Binning
Each cell takes the mean value as its color.
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <style> | |
| html, body { | |
| background: #000; | |
| } | |
| svg, canvas { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| } | |
| canvas { | |
| display: none; | |
| } | |
| </style> | |
| <body> | |
| <script src="http://d3js.org/d3.v3.min.js"></script> | |
| <script src="http://d3js.org/d3.hexbin.v0.min.js"></script> | |
| <script> | |
| var width = 960, | |
| height = 500; | |
| var hexbin = d3.hexbin() | |
| .size([width, height]) | |
| .radius(5); | |
| var color = d3.scale.linear() | |
| .domain([14, 15, 35, 132]) | |
| .range(["#333", "#d7191c", "#ffffbf", "#2c7bb6"]) | |
| .interpolate(d3.interpolateHcl); | |
| var canvas = d3.select("body").append("canvas") | |
| .attr("width", width) | |
| .attr("height", height); | |
| var context = canvas.node().getContext("2d"); | |
| var points = []; | |
| var hexagons = []; | |
| getImage("readme.png", function(image) { | |
| context.drawImage(image, 0, 0, width, height); | |
| image = context.getImageData(0, 0, width, height); | |
| // Rescale the colors. | |
| for (var c, i = 0, n = width * height * 4, d = image.data; i < n; i += 4) { | |
| points.push([i/4%width, Math.floor(i/4/width), d[i]]); | |
| } | |
| hexagons = hexbin(points); | |
| hexagons.forEach(function(d) { | |
| d.mean = d3.mean(d, function(p) { return p[2]; }); | |
| }); | |
| var svg = d3.select("body").append("svg") | |
| .attr("width", width) | |
| .attr("height", height); | |
| var hexagon = svg.append("g") | |
| .attr("class", "hexagons") | |
| .selectAll("path") | |
| .data(hexagons) | |
| .enter().append("path") | |
| .attr("d", hexbin.hexagon(4.5)) | |
| .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }) | |
| .style("fill", function(d) { return color(d.mean); }); | |
| }); | |
| function getImage(path, callback) { | |
| var image = new Image; | |
| image.onload = function() { callback(image); }; | |
| image.src = path; | |
| } | |
| </script> |