clustergrammer
Version:
This is a clustergram implemented in D3.js. I started from the example http://bost.ocks.org/mike/miserables/ and added the following features
158 lines (129 loc) • 4.55 kB
JavaScript
var generate_matrix = require('./matrix');
var make_row_label_container = require('./labels/make_row_label_container');
var make_col_label_container = require('./labels/make_col_label_container');
var generate_super_labels = require('./labels/super_labels');
var spillover = require('./spillover/main_spillover');
var initialize_resizing = require('./initialize_resizing');
var ini_doubleclick = require('./zoom/ini_doubleclick');
var make_col_cat = require('./dendrogram/make_col_cat');
var make_row_cat = require('./dendrogram/make_row_cat');
var trim_text = require('./zoom/trim_text');
var make_row_dendro = require('./dendrogram/make_row_dendro');
var make_col_dendro = require('./dendrogram/make_col_dendro');
var make_svg_dendro_sliders = require('./dendrogram/make_svg_dendro_sliders');
var make_row_dendro_spillover = require('./spillover/make_row_dendro_spillover');
module.exports = function make_viz(cgm) {
var params = cgm.params;
d3.select(params.viz.viz_wrapper+' svg')
.remove();
var svg_group = d3.select(params.viz.viz_wrapper)
.append('svg')
.attr('class', 'viz_svg')
.attr('id', 'svg_'+params.root.replace('#',''))
.attr('width', params.viz.svg_dim.width)
.attr('height', params.viz.svg_dim.height)
.attr('is_zoom',0)
.attr('stopped_zoom',1);
svg_group
.append('rect')
.attr('class', 'super_background')
.style('width', params.viz.svg_dim.width)
.style('height', params.viz.svg_dim.height)
.style('fill', 'white');
generate_matrix(params, svg_group);
make_row_label_container(cgm);
if (params.viz.show_dendrogram){
make_row_dendro(cgm);
make_col_dendro(cgm);
make_row_dendro_spillover(cgm);
}
make_col_label_container(cgm);
// initial trim text
if (params.viz.ds_level === -1){
_.each(['row','col'], function(inst_rc){
var inst_fs = Number(d3.select('.'+inst_rc+'_label_group')
.select('text')
.style('font-size').replace('px',''));
var min_trim_fs = 8;
if (inst_fs > min_trim_fs){
d3.selectAll(params.root+' .'+inst_rc+'_label_group' )
.each(function() {
trim_text(params, this, inst_rc);
});
}
});
}
// make category colorbars
make_row_cat(cgm);
if (params.viz.show_categories.col) {
make_col_cat(cgm);
}
spillover(cgm);
if (params.labels.super_labels) {
generate_super_labels(params);
}
if (params.viz.show_dendrogram){
// sliders should go above super labels
make_svg_dendro_sliders(cgm);
}
function border_colors() {
var inst_color = params.viz.super_border_color;
if (params.viz.is_expand || params.show_viz_border == false) {
inst_color = 'white';
}
return inst_color;
}
// left border
d3.select(params.viz.viz_svg)
.append('rect')
.classed('left_border',true)
.classed('borders',true)
.attr('fill', border_colors)
.attr('width', params.viz.grey_border_width)
.attr('height', params.viz.svg_dim.height)
.attr('transform', 'translate(0,0)');
// right border
d3.select(params.viz.viz_svg)
.append('rect')
.classed('right_border',true)
.classed('borders',true)
.attr('fill', border_colors)
.attr('width', params.viz.grey_border_width)
.attr('height', params.viz.svg_dim.height)
.attr('transform', function () {
var inst_offset = params.viz.svg_dim.width - params.viz.grey_border_width;
return 'translate(' + inst_offset + ',0)';
});
// top border
d3.select(params.viz.viz_svg)
.append('rect')
.classed('top_border',true)
.classed('borders',true)
.attr('fill', border_colors)
.attr('width', params.viz.svg_dim.width)
.attr('height', params.viz.grey_border_width)
.attr('transform', function () {
var inst_offset = 0;
return 'translate(' + inst_offset + ',0)';
});
// bottom border
d3.select(params.viz.viz_svg)
.append('rect')
.classed('bottom_border',true)
.classed('borders',true)
.attr('fill', border_colors)
.attr('width', params.viz.svg_dim.width)
.attr('height', params.viz.grey_border_width)
.attr('transform', function () {
var inst_offset = params.viz.svg_dim.height - params.viz.grey_border_width;
return 'translate(0,' + inst_offset + ')';
});
initialize_resizing(cgm);
ini_doubleclick(cgm);
if (params.viz.do_zoom) {
d3.select(params.viz.zoom_element)
.call(params.zoom_behavior);
}
d3.select(params.viz.zoom_element)
.on('dblclick.zoom', null);
};