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
124 lines (91 loc) • 4.04 kB
JavaScript
var constrain_font_size = require('./constrain_font_size');
var zooming_has_stopped = require('./zooming_has_stopped');
var show_visible_area = require('./show_visible_area');
var resize_label_val_bars = require('./resize_label_val_bars');
var num_visible_labels = require('./num_visible_labels');
var zoom_crop_triangles = require('./zoom_crop_triangles');
module.exports = function run_transformation(params){
var zoom_info = params.zoom_info;
// apply transformation and reset translate vector
// translate clustergram
d3.select(params.root+' .clust_group')
.attr('transform', 'translate(' + [zoom_info.trans_x, zoom_info.trans_y] + ') scale(' +
zoom_info.zoom_x + ',' + zoom_info.zoom_y + ')');
// labels
/////////////////////////////
d3.select(params.root+' .row_label_zoom_container')
.attr('transform', 'translate(' + [0, zoom_info.trans_y] + ') scale(' + zoom_info.zoom_y +
')');
// move down col labels as zooming occurs, subtract trans_x - 20 almost works
d3.select(params.root+' .col_zoom_container')
.attr('transform', 'translate(' + [zoom_info.trans_x, 0] + ') scale(' + zoom_info.zoom_x +
')');
d3.select(params.root+' .row_cat_container')
.attr('transform', 'translate(' + [0, zoom_info.trans_y] + ') scale( 1,' +
zoom_info.zoom_y + ')');
d3.select(params.root+' .row_dendro_container')
.attr('transform', 'translate(' + [params.viz.uni_margin/2, zoom_info.trans_y] + ') '+
'scale( 1,' + zoom_info.zoom_y + ')');
// dendrogram icons
// rows
///////////
// transform icon group (contains all icons)
d3.select(params.root+' .row_dendro_icons_group')
.attr('transform', function(){
var inst_y = zoom_info.trans_y;
var inst_translate = 'translate(' + [0, inst_y] + ') ';
var inst_zoom = 'scale(1, ' + zoom_info.zoom_y + ')';
var transform_string = inst_translate + inst_zoom;
return transform_string;
});
// cols
///////////
// transform icon group (contains all icons)
d3.select(params.root+' .col_dendro_icons_group')
.attr('transform', function(){
var inst_x = zoom_info.trans_x;
var inst_translate = 'translate('+ [inst_x, 0] + ')';
var inst_zoom = 'scale('+ zoom_info.zoom_x + ', 1)';
var transform_string = inst_translate + inst_zoom;
return transform_string;
});
zoom_crop_triangles(params, zoom_info, 'row');
zoom_crop_triangles(params, zoom_info, 'col');
// transform col_class
d3.select(params.root+' .col_cat_container')
.attr('transform', 'translate('+[zoom_info.trans_x, 0]+') scale(' +zoom_info.zoom_x+ ',1)');
d3.select(params.root+' .col_dendro_container')
.attr('transform', 'translate('+[zoom_info.trans_x, params.viz.uni_margin/2]+') scale(' +zoom_info.zoom_x+ ',1)');
constrain_font_size(params);
resize_label_val_bars(params, zoom_info);
d3.select(params.root+' .viz_svg')
.attr('is_zoom', function(){
var inst_zoom = Number(d3.select(params.root+' .viz_svg').attr('is_zoom'));
d3.select(params.root+' .viz_svg').attr('stopped_zoom',1);
return inst_zoom + 1;
});
var not_zooming = function(){
d3.select(params.root+' .viz_svg')
.attr('is_zoom',function(){
var inst_zoom = Number(d3.select(params.root+' .viz_svg').attr('is_zoom'));
return inst_zoom - 1;
});
};
setTimeout(not_zooming, 100);
setTimeout(zooming_has_stopped, 1000, params);
_.each(['row','col'], function(inst_rc){
var inst_num_visible = num_visible_labels(params, inst_rc);
d3.selectAll('.horz_lines').select('line').style('display','none');
d3.selectAll('.vert_lines').select('line').style('display','none');
// previously 250
if (inst_num_visible > 75){
d3.selectAll(params.root+' .'+inst_rc+'_label_group')
.select('text')
.style('display','none');
d3.selectAll(params.root+' .'+inst_rc+'_cat_group')
.select('path')
.style('display','none');
}
});
show_visible_area(params, zoom_info);
};