This rather excessive and useless visualization is intended for a test case of dc.js issues #1032 and #1237.
Seriously, don't do this. Use scatter plots.
license: apache-2.0 | |
height: 900 | |
scrolling: yes |
<!DOCTYPE html> | |
<head> | |
<meta charset="utf-8"> | |
<link rel="stylesheet" type="text/css" href="https://dc-js.github.io/dc.js/css/dc.css" /> | |
<script src="https://dc-js.github.io/dc.js/js/d3.js"></script> | |
<script src="https://dc-js.github.io/dc.js/js/crossfilter.js"></script> | |
<script src="https://dc-js.github.io/dc.js/js/dc.js"></script> | |
<script src="https://rawgit.com/crossfilter/reductio/master/reductio.js"></script> | |
<script src="https://npmcdn.com/universe@latest/universe.js"></script> | |
<style> | |
body { | |
font-family: sans-serif; | |
} | |
.dc-chart circle.bubble { | |
fill-opacity: 0.8; | |
} | |
.dc-chart rect.heat-box { | |
fill-opacity: 0.8; | |
} | |
</style> | |
</head> | |
<body> | |
<h1>Straight Crossfilter</h1> | |
<div id="bubble-cf"> | |
<h3>Sepal Width vs Length</h3> | |
</div> | |
<div id="heatmap-cf"> | |
<h3>Petal Width vs Length</h3> | |
</div> | |
<hr style="clear: both"> | |
<h1>Crossfilter with Cloning</h1> | |
<div id="heatmap-clone"> | |
<h3>Petal vs Sepal Width</h3> | |
</div> | |
<div id="bubble-clone"> | |
<h3>Petal vs Sepal Length</h3> | |
</div> | |
<script src="iris-bubble-heat.js"></script> | |
</body> |
var bubbleCF = dc.bubbleChart('#bubble-cf'), | |
heatCF = dc.heatMap('#heatmap-cf'), | |
heatClone = dc.heatMap('#heatmap-clone'), | |
bubbleClone = dc.bubbleChart('#bubble-clone'); | |
d3.csv('iris.csv', function(error, iris) { | |
var fields = { | |
sl: 'sepal_length', | |
sw: 'sepal_width', | |
pl: 'petal_length', | |
pw: 'petal_width' | |
}; | |
var species = ['setosa', 'versicolor', 'virginica']; | |
iris.forEach(function(d) { | |
Object.keys(fields).forEach(function(ab) { | |
d[fields[ab]] = +d[fields[ab]]; | |
}); | |
}); | |
// autogenerate a key function for an extent | |
function key_function(extent) { | |
var div = extent[1]-extent[0] < 5 ? 2 : 1; | |
return function(k) { | |
return Math.floor(k*div)/div; | |
}; | |
} | |
var extents = {}; | |
var keyfuncs = {}; | |
Object.keys(fields).forEach(function(ab) { | |
extents[ab] = d3.extent(iris, function(d) { return d[fields[ab]]; }); | |
keyfuncs[ab] = key_function(extents[ab]); | |
}); | |
var cf = crossfilter(iris); | |
function duo_key(ab1, ab2) { | |
return function(d) { | |
return [keyfuncs[ab1](d[fields[ab1]]), keyfuncs[ab2](d[fields[ab2]])]; | |
}; | |
} | |
function key_part(i) { | |
return function(kv) { | |
return kv.key[i]; | |
}; | |
} | |
function reduce_species(group) { | |
group.reduce( | |
function(p, v) { | |
p[v.species]++; | |
p.total++; | |
return p; | |
}, function(p, v) { | |
p[v.species]--; | |
p.total--; | |
return p; | |
}, function() { | |
var init = {total: 0}; | |
species.forEach(function(s) { init[s] = 0; }); | |
return init; | |
} | |
); | |
} | |
function max_species(d) { | |
var max = 0, i = -1; | |
species.forEach(function(s, j) { | |
if(d.value[s] > max) { | |
max = d.value[s]; | |
i = j; | |
} | |
}); | |
return i >= 0 ? species[i] : null; | |
} | |
function initialize_bubble(bubbleChart, dim, group) { | |
bubbleChart | |
.width(400) | |
.height(400) | |
.x(d3.scale.linear()).xAxisPadding(0.5) | |
.y(d3.scale.linear()).yAxisPadding(0.5) | |
.elasticX(true) | |
.elasticY(true) | |
.label(d3.functor('')) | |
.keyAccessor(key_part(0)) | |
.valueAccessor(key_part(1)) | |
.radiusValueAccessor(function(kv) { return kv.value.total; }) | |
.colors(d3.scale.ordinal() | |
.domain(species.concat('none')) | |
.range(['#e41a1c','#377eb8','#4daf4a', '#bbb'])) | |
.colorAccessor(function(d) { | |
return max_species(d) || 'none'; | |
}); | |
} | |
function initialize_heatmap(heatMap) { | |
heatMap | |
.width(400) | |
.height(400) | |
.xBorderRadius(15).yBorderRadius(15) | |
.keyAccessor(key_part(0)) | |
.valueAccessor(key_part(1)) | |
.colors(d3.scale.ordinal() | |
.domain(species.concat('none')) | |
.range(['#e41a1c','#377eb8','#4daf4a', '#bbb'])) | |
.colorAccessor(function(d) { | |
return max_species(d) || 'none'; | |
}); | |
} | |
var sepalDim = cf.dimension(duo_key('sl', 'sw')), sepalGroup = sepalDim.group(), | |
petalDim = cf.dimension(duo_key('pl', 'pw')), petalGroup = petalDim.group(); | |
reduce_species(sepalGroup); | |
reduce_species(petalGroup); | |
initialize_bubble(bubbleCF.dimension(sepalDim).group(sepalGroup)); | |
initialize_heatmap(heatCF.dimension(petalDim).group(petalGroup)); | |
// return brand-new objects and keys every time | |
function clone_group(group) { | |
function clone_kvs(all) { | |
return all.map(function(kv) { | |
return { | |
key: kv.key.slice(0), | |
value: Object.assign({}, kv.value) | |
}; | |
}); | |
} | |
return { | |
all: function() { | |
return clone_kvs(group.all()); | |
}, | |
top: function(N) { | |
return clone_kvs(group.top(N)); | |
} | |
}; | |
} | |
var lengthDim = cf.dimension(duo_key('sl', 'pl')), lengthGroup = lengthDim.group(), | |
widthDim = cf.dimension(duo_key('sw', 'pw')), widthGroup = widthDim.group(); | |
reduce_species(widthGroup); | |
reduce_species(lengthGroup); | |
initialize_heatmap(heatClone.dimension(widthDim).group(clone_group(widthGroup))); | |
initialize_bubble(bubbleClone.dimension(lengthDim).group(clone_group(lengthGroup))); | |
dc.renderAll(); | |
}); |
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | setosa | |
4.9 | 3 | 1.4 | 0.2 | setosa | |
4.7 | 3.2 | 1.3 | 0.2 | setosa | |
4.6 | 3.1 | 1.5 | 0.2 | setosa | |
5 | 3.6 | 1.4 | 0.2 | setosa | |
5.4 | 3.9 | 1.7 | 0.4 | setosa | |
4.6 | 3.4 | 1.4 | 0.3 | setosa | |
5 | 3.4 | 1.5 | 0.2 | setosa | |
4.4 | 2.9 | 1.4 | 0.2 | setosa | |
4.9 | 3.1 | 1.5 | 0.1 | setosa | |
5.4 | 3.7 | 1.5 | 0.2 | setosa | |
4.8 | 3.4 | 1.6 | 0.2 | setosa | |
4.8 | 3 | 1.4 | 0.1 | setosa | |
4.3 | 3 | 1.1 | 0.1 | setosa | |
5.8 | 4 | 1.2 | 0.2 | setosa | |
5.7 | 4.4 | 1.5 | 0.4 | setosa | |
5.4 | 3.9 | 1.3 | 0.4 | setosa | |
5.1 | 3.5 | 1.4 | 0.3 | setosa | |
5.7 | 3.8 | 1.7 | 0.3 | setosa | |
5.1 | 3.8 | 1.5 | 0.3 | setosa | |
5.4 | 3.4 | 1.7 | 0.2 | setosa | |
5.1 | 3.7 | 1.5 | 0.4 | setosa | |
4.6 | 3.6 | 1 | 0.2 | setosa | |
5.1 | 3.3 | 1.7 | 0.5 | setosa | |
4.8 | 3.4 | 1.9 | 0.2 | setosa | |
5 | 3 | 1.6 | 0.2 | setosa | |
5 | 3.4 | 1.6 | 0.4 | setosa | |
5.2 | 3.5 | 1.5 | 0.2 | setosa | |
5.2 | 3.4 | 1.4 | 0.2 | setosa | |
4.7 | 3.2 | 1.6 | 0.2 | setosa | |
4.8 | 3.1 | 1.6 | 0.2 | setosa | |
5.4 | 3.4 | 1.5 | 0.4 | setosa | |
5.2 | 4.1 | 1.5 | 0.1 | setosa | |
5.5 | 4.2 | 1.4 | 0.2 | setosa | |
4.9 | 3.1 | 1.5 | 0.1 | setosa | |
5 | 3.2 | 1.2 | 0.2 | setosa | |
5.5 | 3.5 | 1.3 | 0.2 | setosa | |
4.9 | 3.1 | 1.5 | 0.1 | setosa | |
4.4 | 3 | 1.3 | 0.2 | setosa | |
5.1 | 3.4 | 1.5 | 0.2 | setosa | |
5 | 3.5 | 1.3 | 0.3 | setosa | |
4.5 | 2.3 | 1.3 | 0.3 | setosa | |
4.4 | 3.2 | 1.3 | 0.2 | setosa | |
5 | 3.5 | 1.6 | 0.6 | setosa | |
5.1 | 3.8 | 1.9 | 0.4 | setosa | |
4.8 | 3 | 1.4 | 0.3 | setosa | |
5.1 | 3.8 | 1.6 | 0.2 | setosa | |
4.6 | 3.2 | 1.4 | 0.2 | setosa | |
5.3 | 3.7 | 1.5 | 0.2 | setosa | |
5 | 3.3 | 1.4 | 0.2 | setosa | |
7 | 3.2 | 4.7 | 1.4 | versicolor | |
6.4 | 3.2 | 4.5 | 1.5 | versicolor | |
6.9 | 3.1 | 4.9 | 1.5 | versicolor | |
5.5 | 2.3 | 4 | 1.3 | versicolor | |
6.5 | 2.8 | 4.6 | 1.5 | versicolor | |
5.7 | 2.8 | 4.5 | 1.3 | versicolor | |
6.3 | 3.3 | 4.7 | 1.6 | versicolor | |
4.9 | 2.4 | 3.3 | 1 | versicolor | |
6.6 | 2.9 | 4.6 | 1.3 | versicolor | |
5.2 | 2.7 | 3.9 | 1.4 | versicolor | |
5 | 2 | 3.5 | 1 | versicolor | |
5.9 | 3 | 4.2 | 1.5 | versicolor | |
6 | 2.2 | 4 | 1 | versicolor | |
6.1 | 2.9 | 4.7 | 1.4 | versicolor | |
5.6 | 2.9 | 3.6 | 1.3 | versicolor | |
6.7 | 3.1 | 4.4 | 1.4 | versicolor | |
5.6 | 3 | 4.5 | 1.5 | versicolor | |
5.8 | 2.7 | 4.1 | 1 | versicolor | |
6.2 | 2.2 | 4.5 | 1.5 | versicolor | |
5.6 | 2.5 | 3.9 | 1.1 | versicolor | |
5.9 | 3.2 | 4.8 | 1.8 | versicolor | |
6.1 | 2.8 | 4 | 1.3 | versicolor | |
6.3 | 2.5 | 4.9 | 1.5 | versicolor | |
6.1 | 2.8 | 4.7 | 1.2 | versicolor | |
6.4 | 2.9 | 4.3 | 1.3 | versicolor | |
6.6 | 3 | 4.4 | 1.4 | versicolor | |
6.8 | 2.8 | 4.8 | 1.4 | versicolor | |
6.7 | 3 | 5 | 1.7 | versicolor | |
6 | 2.9 | 4.5 | 1.5 | versicolor | |
5.7 | 2.6 | 3.5 | 1 | versicolor | |
5.5 | 2.4 | 3.8 | 1.1 | versicolor | |
5.5 | 2.4 | 3.7 | 1 | versicolor | |
5.8 | 2.7 | 3.9 | 1.2 | versicolor | |
6 | 2.7 | 5.1 | 1.6 | versicolor | |
5.4 | 3 | 4.5 | 1.5 | versicolor | |
6 | 3.4 | 4.5 | 1.6 | versicolor | |
6.7 | 3.1 | 4.7 | 1.5 | versicolor | |
6.3 | 2.3 | 4.4 | 1.3 | versicolor | |
5.6 | 3 | 4.1 | 1.3 | versicolor | |
5.5 | 2.5 | 4 | 1.3 | versicolor | |
5.5 | 2.6 | 4.4 | 1.2 | versicolor | |
6.1 | 3 | 4.6 | 1.4 | versicolor | |
5.8 | 2.6 | 4 | 1.2 | versicolor | |
5 | 2.3 | 3.3 | 1 | versicolor | |
5.6 | 2.7 | 4.2 | 1.3 | versicolor | |
5.7 | 3 | 4.2 | 1.2 | versicolor | |
5.7 | 2.9 | 4.2 | 1.3 | versicolor | |
6.2 | 2.9 | 4.3 | 1.3 | versicolor | |
5.1 | 2.5 | 3 | 1.1 | versicolor | |
5.7 | 2.8 | 4.1 | 1.3 | versicolor | |
6.3 | 3.3 | 6 | 2.5 | virginica | |
5.8 | 2.7 | 5.1 | 1.9 | virginica | |
7.1 | 3 | 5.9 | 2.1 | virginica | |
6.3 | 2.9 | 5.6 | 1.8 | virginica | |
6.5 | 3 | 5.8 | 2.2 | virginica | |
7.6 | 3 | 6.6 | 2.1 | virginica | |
4.9 | 2.5 | 4.5 | 1.7 | virginica | |
7.3 | 2.9 | 6.3 | 1.8 | virginica | |
6.7 | 2.5 | 5.8 | 1.8 | virginica | |
7.2 | 3.6 | 6.1 | 2.5 | virginica | |
6.5 | 3.2 | 5.1 | 2 | virginica | |
6.4 | 2.7 | 5.3 | 1.9 | virginica | |
6.8 | 3 | 5.5 | 2.1 | virginica | |
5.7 | 2.5 | 5 | 2 | virginica | |
5.8 | 2.8 | 5.1 | 2.4 | virginica | |
6.4 | 3.2 | 5.3 | 2.3 | virginica | |
6.5 | 3 | 5.5 | 1.8 | virginica | |
7.7 | 3.8 | 6.7 | 2.2 | virginica | |
7.7 | 2.6 | 6.9 | 2.3 | virginica | |
6 | 2.2 | 5 | 1.5 | virginica | |
6.9 | 3.2 | 5.7 | 2.3 | virginica | |
5.6 | 2.8 | 4.9 | 2 | virginica | |
7.7 | 2.8 | 6.7 | 2 | virginica | |
6.3 | 2.7 | 4.9 | 1.8 | virginica | |
6.7 | 3.3 | 5.7 | 2.1 | virginica | |
7.2 | 3.2 | 6 | 1.8 | virginica | |
6.2 | 2.8 | 4.8 | 1.8 | virginica | |
6.1 | 3 | 4.9 | 1.8 | virginica | |
6.4 | 2.8 | 5.6 | 2.1 | virginica | |
7.2 | 3 | 5.8 | 1.6 | virginica | |
7.4 | 2.8 | 6.1 | 1.9 | virginica | |
7.9 | 3.8 | 6.4 | 2 | virginica | |
6.4 | 2.8 | 5.6 | 2.2 | virginica | |
6.3 | 2.8 | 5.1 | 1.5 | virginica | |
6.1 | 2.6 | 5.6 | 1.4 | virginica | |
7.7 | 3 | 6.1 | 2.3 | virginica | |
6.3 | 3.4 | 5.6 | 2.4 | virginica | |
6.4 | 3.1 | 5.5 | 1.8 | virginica | |
6 | 3 | 4.8 | 1.8 | virginica | |
6.9 | 3.1 | 5.4 | 2.1 | virginica | |
6.7 | 3.1 | 5.6 | 2.4 | virginica | |
6.9 | 3.1 | 5.1 | 2.3 | virginica | |
5.8 | 2.7 | 5.1 | 1.9 | virginica | |
6.8 | 3.2 | 5.9 | 2.3 | virginica | |
6.7 | 3.3 | 5.7 | 2.5 | virginica | |
6.7 | 3 | 5.2 | 2.3 | virginica | |
6.3 | 2.5 | 5 | 1.9 | virginica | |
6.5 | 3 | 5.2 | 2 | virginica | |
6.2 | 3.4 | 5.4 | 2.3 | virginica | |
5.9 | 3 | 5.1 | 1.8 | virginica |