|
@@ -19,9 +19,9 @@ Drupal.behaviors.tripalFeature_adminSummaryChart = {
|
|
|
|
|
|
// Set-up the dimensions for our chart canvas.
|
|
|
// Note: these are adjusted below so think of these are your minimum size.
|
|
|
- var margin = {top: 20, right: 20, bottom: 140, left: 100},
|
|
|
+ var margin = {top: 20, right: 20, bottom: 20, left: 20},
|
|
|
width = 960 - margin.left - margin.right,
|
|
|
- height = 500 - margin.top - margin.bottom;
|
|
|
+ height = 300 - margin.top - margin.bottom;
|
|
|
|
|
|
var color = d3.scale.ordinal()
|
|
|
.range(["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"]);
|
|
@@ -54,13 +54,30 @@ Drupal.behaviors.tripalFeature_adminSummaryChart = {
|
|
|
|
|
|
// Adjust our bottom margin based on the length of type names in the data.
|
|
|
// Assume 4px/character based on the slope of the label.
|
|
|
- margin.bottom = maxTypeLength * 4;
|
|
|
+ xAxisHeight = maxTypeLength * 3;
|
|
|
+ margin.bottom = xAxisHeight + 25;
|
|
|
|
|
|
// Adjust the width of the chart based on the number or bars (types)
|
|
|
// and the length of the bar totals which need to fit on the top of the bar.
|
|
|
// Assume 9px/character since it's not rotated.
|
|
|
width = numBars * (maxTotalLength * 9);
|
|
|
|
|
|
+ // Also if we need to put the legend along the top we need to
|
|
|
+ // increase the top margin.
|
|
|
+ if (Drupal.settings.tripalFeature.admin.legendPosition == 'top') {
|
|
|
+ // Draw a top legend in the margin.
|
|
|
+ var columnWidth = d3.max(Drupal.settings.tripalFeature.admin.organisms, function(d,i) {return d.length;}) * 8;
|
|
|
+ var maxNumColumns = Math.round(width / columnWidth);
|
|
|
+ var numRows = Math.ceil(Drupal.settings.tripalFeature.admin.organisms.length / maxNumColumns);
|
|
|
+ var idealNumColumns = Math.round(Drupal.settings.tripalFeature.admin.organisms.length / numRows);
|
|
|
+ var legendMargin = {
|
|
|
+ left: (width - (idealNumColumns * columnWidth))/2,
|
|
|
+ right: (width - (idealNumColumns * columnWidth))/2
|
|
|
+ };
|
|
|
+
|
|
|
+ margin.top = margin.top + (numRows * 20);
|
|
|
+ }
|
|
|
+
|
|
|
// Set-up the scales of the chart.
|
|
|
var x0 = d3.scale.ordinal()
|
|
|
.rangeRoundBands([0, width], .1);
|
|
@@ -105,7 +122,7 @@ Drupal.behaviors.tripalFeature_adminSummaryChart = {
|
|
|
// Label the x-axis.
|
|
|
xaxis.append('g')
|
|
|
.attr('class', 'axis-label')
|
|
|
- .attr('transform', 'translate(' + width/2 + ',' + (margin.bottom - 20) + ')')
|
|
|
+ .attr('transform', 'translate(' + width/2 + ',' + xAxisHeight + ')')
|
|
|
.append('text')
|
|
|
.attr('font-size', '16px')
|
|
|
.attr('dy', '.71em')
|
|
@@ -162,24 +179,66 @@ Drupal.behaviors.tripalFeature_adminSummaryChart = {
|
|
|
.attr("y", function(d) { return y(d.total_features) -5; })
|
|
|
.text(function(d) { return formatNum(d.total_features); });
|
|
|
|
|
|
- // Finally add in a simple legend.
|
|
|
- var legend = svg.selectAll(".legend")
|
|
|
- .data(Drupal.settings.tripalFeature.admin.organisms.slice().reverse())
|
|
|
- .enter().append("g")
|
|
|
- .attr("class", "legend")
|
|
|
- .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
|
|
|
- legend.append("rect")
|
|
|
- .attr("x", width - 18)
|
|
|
- .attr("width", 18)
|
|
|
- .attr("height", 18)
|
|
|
- .style("fill", color);
|
|
|
- legend.append("text")
|
|
|
- .attr("x", width - 24)
|
|
|
- .attr("y", 9)
|
|
|
- .attr("dy", ".35em")
|
|
|
- .style("text-anchor", "end")
|
|
|
- .attr('font-style','italic')
|
|
|
- .text(function(d) { return d; });
|
|
|
+ // Legend
|
|
|
+ //---------
|
|
|
+ // NOTE: we would prefer to have the legend overlapping the chart on the
|
|
|
+ // right side but this could be a problem if you have a similar count
|
|
|
+ // for all features (legend overlaps bars) or a large number of types
|
|
|
+ // (legend gets pushed out of the viewable screen area). In these cases
|
|
|
+ // switch to a bottom legend.
|
|
|
+ if (Drupal.settings.tripalFeature.admin.legendPosition == 'top') {
|
|
|
+ // Draw a bottom legend in the margin.
|
|
|
+ var legend = svg.append('g')
|
|
|
+ .classed('legend', true)
|
|
|
+ .attr('transform', 'translate(' + (legendMargin.left - 20) + ',-' + margin.top + ')');
|
|
|
+
|
|
|
+ var legendItem = legend.selectAll('g')
|
|
|
+ .data(Drupal.settings.tripalFeature.admin.organisms.slice().reverse())
|
|
|
+ .enter().append("g")
|
|
|
+ .attr("class", "legend-item")
|
|
|
+ .attr("transform", function(d,i) {
|
|
|
+ xOff = (i % idealNumColumns) * columnWidth;
|
|
|
+ yOff = Math.floor(i / idealNumColumns) * 25;
|
|
|
+ return "translate(" + xOff + "," + yOff + ")"
|
|
|
+ });
|
|
|
+ legendItem.append("rect")
|
|
|
+ //.attr("x", width - 18)
|
|
|
+ .attr("width", 18)
|
|
|
+ .attr("height", 18)
|
|
|
+ .style("fill", color);
|
|
|
+ legendItem.append("text")
|
|
|
+ .attr("x", 24)
|
|
|
+ .attr("y", 9)
|
|
|
+ .attr("dy", ".35em")
|
|
|
+ .style("text-anchor", "start")
|
|
|
+ .attr('font-style','italic')
|
|
|
+ .text(function(d) { return d; });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // Draw a right inset legend.
|
|
|
+ var legend = svg.append('g')
|
|
|
+ .classed('legend', true)
|
|
|
+ .attr('transform', 'translate(0,-' + margin.top + ')');
|
|
|
+
|
|
|
+ var legendItem = legend.selectAll('g')
|
|
|
+ .data(Drupal.settings.tripalFeature.admin.organisms.slice().reverse())
|
|
|
+ .enter().append("g")
|
|
|
+ .attr("class", "legend")
|
|
|
+ .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
|
|
|
+ legendItem.append("rect")
|
|
|
+ .attr("x", width - 18)
|
|
|
+ .attr("width", 18)
|
|
|
+ .attr("height", 18)
|
|
|
+ .style("fill", color);
|
|
|
+ legendItem.append("text")
|
|
|
+ .attr("x", width - 24)
|
|
|
+ .attr("y", 9)
|
|
|
+ .attr("dy", ".35em")
|
|
|
+ .style("text-anchor", "end")
|
|
|
+ .attr('font-style','italic')
|
|
|
+ .text(function(d) { return d; });
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
// Add a small blurb mentioning this is from an mview and you should update ;).
|
|
|
d3.selectAll('#tripal-feature-admin-summary-figure-desc')
|