Skip to content

Instantly share code, notes, and snippets.

@JMStewart
Last active August 29, 2015 14:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JMStewart/7405e0fa2c7bf642865e to your computer and use it in GitHub Desktop.
Save JMStewart/7405e0fa2c7bf642865e to your computer and use it in GitHub Desktop.
Canvas + D3 Force

This is an example of redering a d3.js force directed graph onto an HTML5 canvas.

Compare to Pure D3 Force and ReactJS + D3 Force.

Also compare an alternative method using custom-namespaced DOM elements here.

<!DOCTYPE html>
<html>
<head>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
<script>
var size = 1000;
var height = 500;
var width = 960;
var charge = -0.3;
var data = d3.range(size).map(function(){
return {r: Math.floor(Math.random() * 8 + 2)};
});
var start = new Date();
var time = 0;
var ticks = 0;
var force = d3.layout.force()
.size([width, height])
.nodes(data)
.charge(function(d){
return d.r * d.r * charge;
})
.start();
var nodes = force.nodes();
var canvas = d3.select('body')
.append('canvas')
.attr({
height: height,
width: width
});
var context = canvas.node().getContext("2d");
force.on('tick', function(){
var renderStart = new Date();
context.clearRect(0, 0, width, height);
context.fillStyle = "steelblue";
context.beginPath();
nodes.forEach(function(d) {
context.moveTo(d.x, d.y);
context.arc(d.x, d.y, d.r, 0, 2 * Math.PI);
});
context.fill();
time += (new Date() - renderStart);
ticks++;
});
force.on('end', function(){
var totalTime = new Date() - start;
console.log('Total Time:', totalTime);
console.log('Render Time:', time);
console.log('Ticks:', ticks);
console.log('Average Time:', totalTime / ticks);
});
</script>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment