UNPKG

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

220 lines (170 loc) 6.96 kB
var utils = require('../Utils_clust'); var run_zoom = require('../zoom/run_zoom'); var ini_doubleclick = require('../zoom/ini_doubleclick'); var reset_zoom = require('../zoom/reset_zoom'); var resize_dendro = require('./resize_dendro'); var resize_super_labels = require('./resize_super_labels'); var resize_spillover = require('./resize_spillover'); var resize_borders = require('./resize_borders'); var resize_row_labels = require('./resize_row_labels'); var resize_highlights = require('./resize_highlights'); var resize_row_viz = require('./resize_row_viz'); var resize_col_labels = require('./resize_col_labels'); var resize_col_text = require('./resize_col_text'); var resize_col_triangle = require('./resize_col_triangle'); var resize_col_hlight = require('./resize_col_hlight'); var recalc_params_for_resize = require('./recalc_params_for_resize'); var resize_row_tiles = require('./resize_row_tiles'); var resize_label_bars = require('./resize_label_bars'); var label_constrain_and_trim = require('../labels/label_constrain_and_trim'); var make_dendro_triangles = require('../dendrogram/make_dendro_triangles'); var toggle_dendro_view = require('../dendrogram/toggle_dendro_view'); var show_visible_area = require('../zoom/show_visible_area'); var calc_viz_dimensions = require('../params/calc_viz_dimensions'); var position_play_button = require('../demo/position_play_button'); var make_row_cat_super_labels = require('../labels/make_row_cat_super_labels'); var ini_cat_reorder = require('../reorder/ini_cat_reorder'); var position_svg_dendro_slider = require('../dendrogram/position_svg_dendro_slider'); var ini_zoom_info = require('../zoom/ini_zoom_info'); var grid_lines_viz = require('../matrix/grid_lines_viz'); module.exports = function(cgm) { var params = cgm.params; var cont_dim = calc_viz_dimensions(params); d3.select(params.root+' .play_button'); // .style('opacity', 0.2); d3.select(params.root+' .sidebar_wrapper') .style('height', cont_dim.height+'px'); d3.select(params.viz.viz_wrapper) // .style('float', 'left') .style('margin-top', cont_dim.top + 'px') .style('width', cont_dim.width + 'px') .style('height', cont_dim.height + 'px'); params = recalc_params_for_resize(params); params.zoom_info = ini_zoom_info(); reset_zoom(params); var svg_group = d3.select(params.viz.viz_svg); // redefine x and y positions _.each(params.network_data.links, function(d){ d.x = params.viz.x_scale(d.target); d.y = params.viz.y_scale(d.source); }); // disable zoom while transitioning svg_group.on('.zoom', null); params.zoom_behavior .scaleExtent([1, params.viz.real_zoom * params.viz.zoom_switch]) .on('zoom', function(){ run_zoom(cgm); }); // reenable zoom after transition if (params.viz.do_zoom) { svg_group.call(params.zoom_behavior); } // prevent normal double click zoom etc ini_doubleclick(params); svg_group .attr('width', params.viz.svg_dim.width) .attr('height', params.viz.svg_dim.height); svg_group.select('.super_background') .style('width', params.viz.svg_dim.width) .style('height', params.viz.svg_dim.height); svg_group.select('.grey_background') .attr('width', params.viz.clust.dim.width) .attr('height', params.viz.clust.dim.height); setTimeout(position_play_button, 100, params); var row_nodes = params.network_data.row_nodes; var row_nodes_names = utils.pluck(row_nodes, 'name'); resize_row_tiles(params, svg_group); svg_group.selectAll('.highlighting_rect') .attr('width', params.viz.x_scale.rangeBand() * 0.80) .attr('height', params.viz.y_scale.rangeBand() * 0.80); resize_highlights(params); // resize row labels /////////////////////////// resize_row_labels(params, svg_group); resize_row_viz(params, svg_group); // change the size of the highlighting rects svg_group.selectAll('.row_label_group') .each(function() { var bbox = d3.select(this).select('text')[0][0].getBBox(); d3.select(this) .select('rect') .attr('x', bbox.x ) .attr('y', 0) .attr('width', bbox.width ) .attr('height', params.viz.rect_height) .style('fill', 'yellow') .style('opacity', function(d) { var inst_opacity = 0; // highlight target genes if (d.target === 1) { inst_opacity = 1; } return inst_opacity; }); }); // necessary to properly position row labels vertically svg_group.selectAll('.row_label_group') .select('text') .attr('y', params.viz.rect_height * 0.5 + params.labels.default_fs_row*0.35 ); if (utils.has( params.network_data.row_nodes[0], 'value')) { resize_label_bars(cgm, svg_group); } svg_group .selectAll('.row_cat_group') .attr('transform', function(d) { var inst_index = _.indexOf(row_nodes_names, d.name); return 'translate(0, ' + params.viz.y_scale(inst_index) + ')'; }); svg_group .selectAll('.row_cat_group') .select('path') .attr('d', function() { var origin_x = params.viz.cat_room.symbol_width - 1; var origin_y = 0; var mid_x = 1; var mid_y = params.viz.rect_height / 2; var final_x = params.viz.cat_room.symbol_width - 1; var final_y = params.viz.rect_height; var output_string = 'M ' + origin_x + ',' + origin_y + ' L ' + mid_x + ',' + mid_y + ', L ' + final_x + ',' + final_y + ' Z'; return output_string; }); var is_resize = true; if (params.viz.show_dendrogram){ make_dendro_triangles(cgm, 'row', is_resize); make_dendro_triangles(cgm, 'col', is_resize); resize_dendro(params, svg_group); toggle_dendro_view(cgm, 'row', 0); toggle_dendro_view(cgm, 'col', 0); } else { resize_dendro(params, svg_group); } resize_col_labels(params, svg_group); resize_col_text(params, svg_group); resize_col_triangle(params, svg_group); resize_col_hlight(params, svg_group); resize_super_labels(params, svg_group); resize_spillover(params.viz, svg_group); grid_lines_viz(params); resize_borders(params, svg_group); // reset zoom and translate params.zoom_behavior .scale(1) .translate([ params.viz.clust.margin.left, params.viz.clust.margin.top ]); label_constrain_and_trim(params); // reposition matrix d3.select(params.root+' .clust_container') .attr('transform', 'translate(' + params.viz.clust.margin.left + ',' + params.viz.clust.margin.top + ')'); show_visible_area(params); make_row_cat_super_labels(cgm); d3.select(params.viz.viz_svg).style('opacity',1); ini_cat_reorder(cgm); d3.select(cgm.params.root+ ' .row_slider_group') .style('opacity', 0); d3.select(cgm.params.root+ ' .col_slider_group') .style('opacity', 0); setTimeout(position_svg_dendro_slider, 500, cgm, 'row'); setTimeout(position_svg_dendro_slider, 500, cgm, 'col'); };