This post describes how to build a very basic
2d density with shading
with d3.js. The hexbin chart is a representation of a 2d density, very
close from a contour plot but with
shading between layers. 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.
contourDensity()
function.
.geoPath()
<!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-contour.v1.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, 20])
.range([ margin.left, width - margin.right ]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
// Add Y axis
var y = d3.scaleLinear()
.domain([5, 25])
.range([ height - margin.bottom, margin.top ]);
svg.append("g")
.call(d3.axisLeft(y));
// Prepare a color palette
var color = d3.scaleLinear()
.domain([0, 1]) // Points per square pixel.
.range(["white", "#69b3a2"])
// compute the density data
var densityData = d3.contourDensity()
.x(function(d) { return x(d.x); })
.y(function(d) { return y(d.y); })
.size([width, height])
.bandwidth(20)
(data)
// show the shape!
svg.insert("g", "g")
.selectAll("path")
.data(densityData)
.enter().append("path")
.attr("d", d3.geoPath())
.attr("fill", function(d) { return color(d.value); })
})
</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, 20])
.range([ margin.left, width - margin.right ]);
svg.append("g")
.attr("transform", `translate(0, ${height})`)
.call(d3.axisBottom(x));
// Add Y axis
const y = d3.scaleLinear()
.domain([5, 25])
.range([ height - margin.bottom, margin.top ]);
svg.append("g")
.call(d3.axisLeft(y));
// Prepare a color palette
const color = d3.scaleLinear()
.domain([0, 1]) // Points per square pixel.
.range(["white", "#69b3a2"])
// compute the density data
const densityData = d3.contourDensity()
.x(function(d) { return x(d.x); })
.y(function(d) { return y(d.y); })
.size([width, height])
.bandwidth(20)
(data)
// show the shape!
svg.insert("g", "g")
.selectAll("path")
.data(densityData)
.enter().append("path")
.attr("d", d3.geoPath())
.attr("fill", function(d) { return color(d.value); })
})
</script>