'use strict'; var w = window.innerWidth; var h = window.innerHeight; // store generated data var data = []; var svg = d3.select('body').append('svg').attr('width', w).attr('height', h); var rect = svg.selectAll('rect'); var force = d3.layout.force().size([w, h]).on('tick', function () { rect.attr('x', function (d) { return d.x; }).attr('y', function (d) { return d.y; }); }); var render = function render(data) { rect = rect.data(data, function (d) { return d.id; }); rect.enter().append('rect').attr({ fill: function fill(d) { return d.color; }, width: 18, height: 18 }).call(force.drag); rect.exit().transition().attr('r', 0).remove(); force.nodes(data).start(); }; // generate some data function update() { var n = 0; var c = ['red', 'green', 'blue']; return function () { data.push({ id: n, color: c[n % 3] }); render(data); n++; }; } // update every second // note: calling as update()(); (higher order function) setInterval(update(), 500);