Just some random circles.
Click to make them disappear! Or add more!
function randomCircleChart() { | |
var margin = {top: 20, right: 20, bottom: 20, left: 20}, | |
width = 960, | |
height = 500, | |
xValue = function(d) { return d.x; }, | |
yValue = function(d) { return d.y; }, | |
rValue = function(d) { return d.r; }, | |
xScale = d3.scale.linear(), | |
yScale = d3.scale.linear(), | |
rScale = d3.scale.linear().range([5, 20]), | |
color = function(i) { return 'steelblue'; }, | |
parent; | |
function chart(selection) { | |
selection.each(function(data) { | |
// update xScale | |
xScale | |
.domain([0, 1]) | |
.range([0, width - margin.left - margin.right]); | |
// update y-scale | |
yScale | |
.domain([0, 1]) | |
.range([height - margin.top - margin.bottom - d3.max(rScale.range()), 0]); | |
// update r-scale | |
rScale | |
.domain([0, 1]); | |
var svg = d3.select(this).append('svg'); | |
var g = svg.append('g'); | |
// otherwise, create skeletal chart | |
svg .attr('width', width) | |
.attr('height', height); | |
g.attr('transform', 'translate(' + [margin.left, margin.top ] + ')'); | |
var circle = g.selectAll('circle') | |
.data(data) | |
.enter().append('circle') | |
.call(updateSelection); | |
parent = g; | |
}); | |
} | |
function updateSelection(selection) { | |
selection | |
.attr('cx', function(d, i) { return xScale(xValue(d)); }) | |
.attr('cy', function(d, i) { return yScale(yValue(d)); }) | |
.attr('r', function(d, i) { return rScale(rValue(d)); }) | |
.style('fill', function(d, i) { return color(i); }) | |
.style('fill-opacity', 1.0) | |
.on('click', function(d, i) { | |
d3.select(this) | |
.on('click', function() {}) | |
.transition() | |
.duration(1250) | |
.style('fill-opacity', 0) | |
.attr('r', function(d, i) { return rScale(rValue(d)) * 4; }) | |
.remove(); | |
}); | |
} | |
chart.addCircle = function(d) { | |
var circle = parent.selectAll('circle'); | |
var _ = circle.data(); | |
_.push(d); | |
circle.data(_); | |
circle | |
.data(_) | |
.enter().append('circle') | |
.call(updateSelection); | |
}; | |
chart.width = function(_) { | |
if (!arguments.length) return width; | |
width = _; | |
return chart; | |
}; | |
chart.height = function(_) { | |
if (!arguments.length) return height; | |
height = _; | |
return chart; | |
}; | |
chart.color = function(_) { | |
if (!arguments.length) return color; | |
color = _; | |
return chart; | |
}; | |
return chart; | |
} | |
function randomCircle() { | |
return {x: Math.random(), y: Math.random(), r: Math.random()}; | |
} | |
var chart = randomCircleChart() | |
.color(d3.scale.category20()); | |
d3.select('#circles') | |
.datum([]) | |
.call(chart); | |
for (var i = 0; i < 15; i++) { | |
chart.addCircle(randomCircle()); | |
} | |
d3.select('#add-random-circle') | |
.on('click', function() { chart.addCircle(randomCircle()); }); |
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style>/* CSS */</style> | |
<body> | |
<button id="add-random-circle">Add a circle!</button> | |
<div id="circles"> | |
</div> | |
<script src="//d3js.org/d3.v3.js"></script> | |
<script src="circles.js"></script> |