dc.graph
Version:
Graph visualizations integrated with crossfilter and dc.js
67 lines (63 loc) • 2.23 kB
JavaScript
dc_graph.draw_clusters = function() {
function apply_bounds(rect) {
rect.attr({
x: function(c) {
return c.cola.bounds.left;
},
y: function(c) {
return c.cola.bounds.top;
},
width: function(c) {
return c.cola.bounds.right - c.cola.bounds.left;
},
height: function(c) {
return c.cola.bounds.bottom - c.cola.bounds.top;
}
});
}
function draw(diagram) {
if(!diagram.clusterGroup())
return;
var clayer = diagram.g().selectAll('g.cluster-layer').data([0]);
clayer.enter().insert('g', ':first-child')
.attr('class', 'cluster-layer');
var clusters = diagram.clusterGroup().all().map(function(kv) {
return _mode.parent().getWholeCluster(kv.key);
}).filter(function(c) {
return c && c.cola.bounds;
});
var rects = clayer.selectAll('rect.cluster')
.data(clusters, function(c) { return c.orig.key; });
rects.exit().remove();
rects.enter().append('rect')
.attr({
class: 'cluster',
opacity: 0,
stroke: _mode.clusterStroke.eval,
'stroke-width': _mode.clusterStrokeWidth.eval,
fill: function(c) {
return _mode.clusterFill.eval(c) || 'none';
}
})
.call(apply_bounds);
rects.transition()
.duration(_mode.parent().stagedDuration())
.attr('opacity', _mode.clusterOpacity.eval)
.call(apply_bounds);
}
function remove(diagram, node, edge, ehover) {
}
var _mode = dc_graph.mode('draw-clusters', {
laterDraw: true,
draw: draw,
remove: remove
});
_mode.clusterOpacity = property(0.25);
_mode.clusterStroke = property('black');
_mode.clusterStrokeWidth = property(1);
_mode.clusterFill = property(null);
_mode.clusterLabel = property(null);
_mode.clusterLabelFill = property('black');
_mode.clusterLabelAlignment = property(['bottom','right']);
return _mode;
};