Skip to content

Instantly share code, notes, and snippets.

@boertel
Last active June 27, 2016 22:18
Show Gist options
  • Save boertel/82b28fd34602599160a8 to your computer and use it in GitHub Desktop.
Save boertel/82b28fd34602599160a8 to your computer and use it in GitHub Desktop.
Cluster
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
.underlay {
fill: #ababab;
}
.line {
fill: #747e80;
}
svg {
background-color: #e8e8e8;
font-family: Helvetica;
text-transform: capitalize;
fill: #747e80;
}
text {
font-size: 0.8em;
}
.bar.bar-1 {
fill: #453a82;
}
.bar.bar-2 {
fill: #dc286d;
}
.bar.bar-3 {
fill: #0686c2;
}
</style>
</head>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
// http://bl.ocks.org/mbostock/2368837
// http://bost.ocks.org/mike/nest/
// Generate random data
var numberOfGraphs = 6;
function random(n) {
n = n || 100;
return Math.floor(Math.random() * n);
}
var dataset = []
for (var i = 0; i < numberOfGraphs; i += 1) {
dataset.push({
key: 'group ' + i,
value: {
1: (random(2) === 0) ? -random() : random(),
2: (random(2) === 0) ? -random() : random(),
3: (random(2) === 0) ? -random() : random(),
}
})
}
dataset.forEach(function (d) { d.value = d3.entries(d.value); });
var data = dataset;
var margin = {top: 25, right: 25, bottom: 20, left: 20},
width = (numberOfGraphs * 120) + 10 - margin.left - margin.right,
height = 270 - margin.top - margin.bottom;
var svg = d3.select('body').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 + ')')
var padding = 2,
barWidth = 30;
domain = d3.extent(d3.merge(data.map(function (d) {
return d.value.map(function (e) { return e.value; });
})));
var y = d3.scale.linear()
.domain(domain).nice()
.range([height, 0])
var group = svg.selectAll('.group')
.data(data)
.enter()
.append('g')
.attr('class', 'group')
.attr('transform', function (d, i) { return 'translate(' + i * 120 + ', 0)'; })
group.append('g')
.attr('class', 'title')
.append('text')
.attr('dx', '2em')
.text(function (d) { return d.key; })
var bars = group.append('g')
.attr('class', 'bars')
.attr('transform', 'translate(0, 10)')
var bar = bars.selectAll('g.bar')
.data(function (d) { return d.value; })
.enter()
.append('g')
.attr('class', function (d) { return 'bar bar-' + d.key; })
bar.append('rect')
.attr('class', 'underlay')
.attr('x', 0)
.attr('width', barWidth)
.attr('height', height)
.attr('transform', function (d, i) {
return 'translate(' + ((i * barWidth) + (i * padding)) + ', 0)';
})
bar.append('rect')
.attr('class', function (d) { return 'bar ' + (d.value < 0 ? 'negative' : 'positive'); })
.attr('x', 0)
.attr('y', y(0))
.attr('width', barWidth)
.attr('height', 0)
.attr('transform', function (d, i) {
return 'translate(' + ((i * barWidth) + (i * padding)) + ', 0)';
})
.transition()
.delay(250)
.duration(800)
.attr('height', function (d) { return Math.abs(y(d.value) - y(0)); })
.attr('y', function (d) { return y(Math.max(0, d.value)); })
.ease('elastic')
svg.append('rect')
.attr('class', 'line')
.attr('x', -6)
.attr('height', 4)
.attr('y', y(1) + 10)
.attr('width', width + 22)
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment