This post describes how to build a very basic
hexbin chart
with d3.js. The hexbin chart is a representation of a 2d density. It
is made thanks to the
d3-contour plugin.
Visit
data-to-viz.com
for more theoretical info on 2d density charts. This example works
with d3.js v4
and v6
div
that will be modified by d3 later on. It
also load the
d3-hexbin plugin
x
and y
.
A 2d density plot basically represents the amount of data
point on each part of the grid.
d3.hexbin()
. You
can control the hexbin size with the
radius()
argument.
.hexagon()
<!DOCTYPE html>
<meta charset="utf-8">
<!-- Load d3.js -->
<script src="https://d3js.org/d3.v4.js"></script>
<!-- specific plugin -->
<script src="https://d3js.org/d3-hexbin.v0.2.min.js"></script>
<!-- Create a div where the graph will take place -->
<div id="my_dataviz"></div>
<!DOCTYPE html>
<meta charset="utf-8">
<!-- Load d3.js -->
<script src="https://d3js.org/d3.v6.js"></script>
<!-- Create a div where the graph will take place -->
<div id="my_dataviz"></div>
<script>
// set the dimensions and margins of the graph
var margin = {top: 10, right: 30, bottom: 30, left: 40},
width = 460 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// append the svg object to the body of the page
var svg = d3.select("#my_dataviz")
.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 + ")");
// read data
d3.csv("https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/data_for_density2d.csv", function(data) {
// Add X axis
var x = d3.scaleLinear()
.domain([5, 18])
.range([ 0, width ]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
// Add Y axis
var y = d3.scaleLinear()
.domain([5, 20])
.range([ height, 0 ]);
svg.append("g")
.call(d3.axisLeft(y));
// Reformat the data: d3.hexbin() needs a specific format
var inputForHexbinFun = []
data.forEach(function(d) {
inputForHexbinFun.push( [x(d.x), y(d.y)] ) // Note that we had the transform value of X and Y !
})
// Prepare a color palette
var color = d3.scaleLinear()
.domain([0, 600]) // Number of points in the bin?
.range(["transparent", "#69b3a2"])
// Compute the hexbin data
var hexbin = d3.hexbin()
.radius(9) // size of the bin in px
.extent([ [0, 0], [width, height] ])
// Plot the hexbins
svg.append("clipPath")
.attr("id", "clip")
.append("rect")
.attr("width", width)
.attr("height", height)
svg.append("g")
.attr("clip-path", "url(#clip)")
.selectAll("path")
.data( hexbin(inputForHexbinFun) )
.enter().append("path")
.attr("d", hexbin.hexagon())
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
.attr("fill", function(d) { return color(d.length); })
.attr("stroke", "black")
.attr("stroke-width", "0.1")
})
</script>
<script>
// set the dimensions and margins of the graph
const margin = {top: 10, right: 30, bottom: 30, left: 40},
width = 460 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// append the svg object to the body of the page
const svg = d3.select("#my_dataviz")
.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})`);
// read data
d3.csv("https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/data_for_density2d.csv").then( function(data) {
// Add X axis
const x = d3.scaleLinear()
.domain([5, 18])
.range([ 0, width ]);
svg.append("g")
.attr("transform", `translate(0, ${height})`)
.call(d3.axisBottom(x));
// Add Y axis
const y = d3.scaleLinear()
.domain([5, 20])
.range([ height, 0 ]);
svg.append("g")
.call(d3.axisLeft(y));
// Reformat the data: d3.hexbin() needs a specific format
const inputForHexbinFun = []
data.forEach(function(d) {
inputForHexbinFun.push( [x(d.x), y(d.y)] ) // Note that we had the transform value of X and Y !
})
// Prepare a color palette
const color = d3.scaleLinear()
.domain([0, 600]) // Number of points in the bin?
.range(["transparent", "#69b3a2"])
// Compute the hexbin data
const hexbin = d3.hexbin()
.radius(9) // size of the bin in px
.extent([ [0, 0], [width, height] ])
// Plot the hexbins
svg.append("clipPath")
.attr("id", "clip")
.append("rect")
.attr("width", width)
.attr("height", height)
svg.append("g")
.attr("clip-path", "url(#clip)")
.selectAll("path")
.data( hexbin(inputForHexbinFun) )
.join("path")
.attr("d", hexbin.hexagon())
.attr("transform", function(d) { return `translate(${d.x}, ${d.y})`})
.attr("fill", function(d) { return color(d.length); })
.attr("stroke", "black")
.attr("stroke-width", "0.1")
})
</script>