54c0f5ff8eb8f94adf07748746ffbbd22c29e161 ceisenhart Mon Feb 1 09:49:21 2016 -0800 Adding in new features, fixing bugs and removing code that was written for debug purposes refs #16341 diff --git src/hg/js/d3.dendrograms.js src/hg/js/d3.dendrograms.js index a99f7c4..f7cadb1 100644 --- src/hg/js/d3.dendrograms.js +++ src/hg/js/d3.dendrograms.js @@ -122,108 +122,176 @@ diagonal.projection = function(x) { if (!arguments.length) return projection; projection = x; return diagonal; }; diagonal.path = function(x) { if (!arguments.length) return path; path = x; return diagonal; }; return diagonal; }; - d3.dendrogram.leafColors = function(val, layer, shift, selector){ - colors = d3.scale.category20(); + d3.dendrogram.leafColors = function(val, layer, shift,title, selector){ var vis = d3.select(selector).select("svg"); var first = 1; var node = vis.selectAll("g."+ layer + "Leaf"); + colors = d3.scale.category20(); + if (layer == "middle"){colors = d3.scale.category20b();} + if (layer == "outer"){colors = d3.scale.category20c();} + node.selectAll("circle") .style("fill", function(d){ // This block links the extra leaf json fields to a specific value (count). This value // is provided when the buttons are written in the main function. if (d.name != " "){ var count = 0; for (var key in d) { if (d.hasOwnProperty(key)){ if (key != "x" && key!="y" && key!= "name" && key!="kids" && key!="length" && key!="colorGroup" && key!="parent" && key!="depth" && key!="rootDist"){ if (count == val){ count += 1; return colors(d[key]); } } count += 1; } } } else{return 'none';} }) .attr("transform","translate(" + shift + "," + 0 + ")"); var legend=vis.selectAll('g.' + layer + 'Legend').remove(); - updateLegend(colors.domain(), layer, vis, shift); + updateLegend(colors.domain(), layer, vis, title, shift); colors=d3.scale.category20(); }; d3.dendrogram.nodeColors = function(val, selector){ var vis = d3.select(selector).selectAll("svg"); var node=vis.selectAll("g.internalNode").selectAll("circle") .style("fill",function(d){ if (d.name === " "){ if (val==1) return d3.rgb(d.colorGroup); if (val==2) return d3.rgb(d.whiteToBlack); if (val==3) return d3.rgb(d.whiteToBlackSqrt); if (val==4) return d3.rgb(d.whiteToBlackQuad); } }); }; - updateLegend = function(val, layer, vis, shift){ + updateLegend = function(val, layer, vis, title, shift){ var legend=vis.selectAll('g.'+layer+'Legend').data(val); - + var temp = 200; + var horz, vert; + var first = 1; legend.enter() .append('g') .attr('class',layer+ 'Legend') .attr('transform', function (d, i){ var height=legendRectSize + legendSpacing; var offset= height * colors.domain().length / 2; - var horz, vert; if (layer=="inner"){ - horz=(-2 * legendRectSize) + radius; - vert=-(i * height - offset) + (radius*(1/2)); + horz=(-2 * legendRectSize) + (2*radius) + 45 ; + vert=(i * height - offset) + (radius*(1/2)) + 100; + if (first){ + vis.selectAll("text.innerLegendTitle").remove(); + vis.append("text") + .attr('class','innerLegendTitle') + .style("font-size","20px") + .style("font-weight","bold") + .attr("transform", "translate(" + (horz-45) + "," + (vert-45)+ ")") + .attr('x', legendRectSize + legendSpacing) + .attr('y', legendRectSize - legendSpacing) + .text(title); + vis.selectAll("text.outerLegendTitleInner").remove(); + vis.append("text") + .attr('class','outerLegendTitleInner') + .style("font-size","20px") + .style("font-weight","bold") + .attr("transform", "translate(" + (horz-45) + "," + (vert-65)+ ")") + .attr('x', legendRectSize + legendSpacing) + .attr('y', legendRectSize - legendSpacing) + .text("Inner"); + first =0; + } } if (layer=="middle"){ - horz=(-2 * legendRectSize) + radius + 75; - vert=-(i * height - offset) + (radius*(1/2)); + horz=(-2 * legendRectSize) + (2 * radius) + 232 ; + vert=(i * height - offset) + (radius*(1/2)) + 100; + if (first){ + vis.selectAll("text.middleLegendTitle").remove(); + vis.append("text") + .attr('class','middleLegendTitle') + .style("font-size","20px") + .style("font-weight","bold") + .attr("transform", "translate(" + (horz-45) + "," + (vert-45)+ ")") + .attr('x', legendRectSize + legendSpacing) + .attr('y', legendRectSize - legendSpacing) + .text(title); + vis.selectAll("text.outerLegendTitleMiddle").remove(); + vis.append("text") + .attr('class','outerLegendTitleMiddle') + .style("font-size","20px") + .style("font-weight","bold") + .attr("transform", "translate(" + (horz-45) + "," + (vert-65)+ ")") + .attr('x', legendRectSize + legendSpacing) + .attr('y', legendRectSize - legendSpacing) + .text("Middle"); + first =0; + } } if (layer=="outer"){ - horz=(-2 * legendRectSize) + radius + 150; - vert=-(i * height - offset)+ (radius*(1/2)); + horz=(-2 * legendRectSize) + (2 * radius) + 420; + vert=(i * height - offset)+ (radius*(1/2)) + 100; + if (first){ + vis.selectAll("text.outerLegendTitle").remove(); + vis.append("text") + .attr('class','outerLegendTitle') + .style("font-size","20px") + .style("font-weight","bold") + .attr("transform", "translate(" + (horz-45) + "," + (vert-45)+ ")") + .attr('x', legendRectSize + legendSpacing) + .attr('y', legendRectSize - legendSpacing) + .text(title); + vis.selectAll("text.outerLegendTitleLabel").remove(); + vis.append("text") + .attr('class','outerLegendTitleLabel') + .style("font-size","20px") + .style("font-weight","bold") + .attr("transform", "translate(" + (horz-45) + "," + (vert-65)+ ")") + .attr('x', legendRectSize + legendSpacing) + .attr('y', legendRectSize - legendSpacing) + .text("Outer"); + first =0; + } } return 'translate(' + horz + ',' + vert + ')'; }); legend.append('rect') .attr('width', legendRectSize) .attr('height', legendRectSize) .style('fill', colors) .style('stroke', colors); legend.append('text') + .style("font-size","14px") .attr('x', legendRectSize + legendSpacing) .attr('y', legendRectSize - legendSpacing) .text(function (d){return d;}); }; scaleBranchLengths = function (nodes, w) { // Visit all nodes and adjust y pos width distance metric var visitPreOrder = function(root, callback) { callback(root); if (root.children) { for (var i = parseInt(root.children.length) - 1; i >= 0; i--){ visitPreOrder(root.children[i], callback); } } }; @@ -231,136 +299,160 @@ visitPreOrder(nodes[0], function(node) { node.rootDist = (node.parent ? node.parent.rootDist : 0) + (parseInt(node.length) || 0); }); var rootDists = nodes.map(function(n) { return n.rootDist; }); var yscale = d3.scale.linear() .domain([0, d3.max(rootDists)]) .range([0, w]); visitPreOrder(nodes[0], function(node) { node.y = yscale(node.rootDist); }); return yscale; }; addLeafButton = function (title, count, layer, shift, dropdownSelector, graph) { - d3.select(dropdownSelector).append("li").html(""); + var leafButton = ""; + d3.select(dropdownSelector).append("li") + .html(leafButton); }; addNodeButton = function (dropdownSelector, val, graph, title) { d3.select(dropdownSelector).append("li").html(""); }; makeDropdownSkeleton = function (treeType){ + var dropdown = d3.select("#dropdown").append("ul").attr("style","list-style-type:none;display:inline-flex"); + d3.select("#dropdown").attr("style","position:fixed;z-index:2"); if (treeType == "Dendro"){ var interiorNodeDropdown = dropdown.append("li").attr("class","dropdown"); interiorNodeDropdown.append("button").attr("class","btn btn-default dropdown-toggle") - .attr("type", "button").attr("data-toggle","dropdown").html("Inner nodes").append("span").attr("class","caret"); + .attr("type", "button").attr("data-toggle","dropdown").html("Inner "+treeType+" nodes").append("span").attr("class","caret"); interiorNodeDropdown.append("ul").attr("class","dropdown-menu").html("