Вход Регистрация
Файл: src/public/plugins/metrics-graphics/common/y_axis.js
Строк: 242
<?php
function y_rug (args) {
  
'use strict';
  
args.rug_buffer_size = args.chart_type === 'point'
    
? args.buffer / 2
    
: args.buffer * 2 / 3;

  var 
rug = mg_make_rug(args, 'mg-y-rug');

  
rug.attr('x1', args.left + 1)
    .
attr('x2', args.left + args.rug_buffer_size)
    .
attr('y1', args.scalefns.yf)
    .
attr('y2', args.scalefns.yf);

  
mg_add_color_accessor_to_rug(rug, args, 'mg-y-rug-mono');
}

MG.y_rug = y_rug;

function 
mg_change_y_extents_for_bars (args, my) {
  if (
args.chart_type === 'bar') {
    
my.min = 0;
    
my.max = d3.max(args.data[0], function (d) {
      var 
trio = [];
      
trio.push(d[args.y_accessor]);

      if (
args.baseline_accessor !== null) {
        
trio.push(d[args.baseline_accessor]);
      }

      if (
args.predictor_accessor !== null) {
        
trio.push(d[args.predictor_accessor]);
      }

      return 
Math.max.apply(null, trio);
    });
  }
  return 
my;
}

function 
mg_compute_yax_format (args) {
  var 
yax_format = args.yax_format;
  if (!
yax_format) {
    if (
args.format === 'count') {
      
// increase decimals if we have small values, useful for realtime data
      
if (args.processed.max_y < 0.0001) {
        
args.decimals = 6;
      } else if (
args.processed.max_y < 0.1) {
        
args.decimals = 4;
      }

      
yax_format = function (f) {
        if (
f < 1.0) {
          
// Don't scale tiny values.
          
return args.yax_units + d3.round(f, args.decimals);
        } else {
          var 
pf = d3.formatPrefix(f);
          return 
args.yax_units + pf.scale(f) + pf.symbol;
        }
      };
    } else { 
// percentage
      
yax_format = function (d_) {
        var 
n = d3.format('.2p');
        return 
n(d_);
      };
    }
  }
  return 
yax_format;
}

function 
mg_bar_add_zero_line (args) {
  var 
svg = mg_get_svg_child_of(args.target);
  var 
extents = args.scales.X.domain();
  if (
0 >= extents[0] && extents[1] >= 0) {
    var 
r = args.scales.Y.range();
    var 
g = args.categorical_groups.length ? args.scales.YGROUP(args.categorical_groups[args.categorical_groups.length-1]) : args.scales.YGROUP()
    
svg.append('svg:line')
    .
attr('x1', args.scales.X(0))
    .
attr('x2', args.scales.X(0))
    .
attr('y1', r[0] + mg_get_plot_top(args))
    .
attr('y2', r[r.length-1] + g )//+ args.scales.YGROUP.rangeBand())
    
.attr('stroke', 'black')
    .
attr('opacity', .2);
  }
}

function 
set_min_max_y (args) {
  
// flatten data
  // remove weird data, if log.
  
var data = mg_flatten_array(args.data);

  if (
args.y_scale_type === 'log') {
    
data = data.filter(function (d) {
      return 
d[args.y_accessor] > 0;
    });
  }

  if (
args.baselines) {
    
data = data.concat(args.baselines);
  }

  var 
extents = d3.extent(data, function (d) {
    return 
d[args.y_accessor];
  });

  var 
my = {};
  
my.min = extents[0];
  
my.max = extents[1];
  
// the default case is for the y-axis to start at 0, unless we explicitly want it
  // to start at an arbitrary number or from the data's minimum value
  
if (my.min >= 0 && !args.min_y && !args.min_y_from_data) {
    
my.min = 0;
  }

  
mg_change_y_extents_for_bars(args, my);
  
my.min = (args.min_y !== null)
    ? 
args.min_y
    
: my.min;

  
my.max = (args.max_y !== null)
    ? 
args.max_y
    
: (my.max < 0)
      ? 
my.max + (my.max - my.max * args.inflator)
      : 
my.max * args.inflator;

  if (
args.y_scale_type !== 'log' && my.min < 0) {
    
my.min = my.min - (my.min - my.min * args.inflator);
  }

  if (!
args.min_y && args.min_y_from_data) {

      var 
buff = (my.max - my.min) *.01;
      
my.min = extents[0] - buff;
      
my.max = extents[1] + buff;
  }
  
args.processed.min_y = my.min;
  
args.processed.max_y = my.max;
}

function 
mg_y_domain_range (args, scale) {
  
scale.domain([args.processed.min_y, args.processed.max_y])
    .
range([mg_get_plot_bottom(args), args.top]);
  return 
scale;
}

function 
mg_define_y_scales (args) {
  var 
scale = args.y_scale_type === 'log' ? d3.scale.log() : d3.scale.linear();
  if (
args.y_scale_type === 'log') {
    if (
args.chart_type === 'histogram') {
      
// log histogram plots should start just below 1
      // so that bins with single counts are visible
      
args.processed.min_y = 0.2;
    } else {
      if (
args.processed.min_y <= 0) {
        
args.processed.min_y = 1;
      }
    }
  }
  
args.scales.Y = mg_y_domain_range(args, scale);
  
args.scales.Y.clamp(args.y_scale_type === 'log');

  
// used for ticks and such, and designed to be paired with log or linear
  
args.scales.Y_axis = mg_y_domain_range(args, d3.scale.linear());
}

function 
mg_add_y_label (g, args) {
  if (
args.y_label) {
    
g.append('text')
      .
attr('class', 'label')
      .
attr('x', function () {
        return -
1 * (mg_get_plot_top(args) +
        ((
mg_get_plot_bottom(args)) - (mg_get_plot_top(args))) / 2);
      })
      .
attr('y', function () {
        return 
args.left / 2;
      })
      .
attr('dy', '0.4em')
      .
attr('text-anchor', 'middle')
      .
text(function (d) {
        return 
args.y_label;
      })
      .
attr('transform', function (d) {
        return 
'rotate(-90)';
      });
  }
}

function 
mg_add_y_axis_rim (g, args) {
  var 
tick_length = args.processed.y_ticks.length;
  if (!
args.x_extended_ticks && !args.y_extended_ticks && tick_length) {
    var 
y1scale, y2scale;

    if (
args.axes_not_compact && args.chart_type !== 'bar') {
      
y1scale = args.height - args.bottom;
      
y2scale = args.top;
    } else if (
tick_length) {
      
y1scale = args.scales.Y(args.processed.y_ticks[0]).toFixed(2);
      
y2scale = args.scales.Y(args.processed.y_ticks[tick_length - 1]).toFixed(2);
    } else {
      
y1scale = 0;
      
y2scale = 0;
    }

    
g.append('line')
      .
attr('x1', args.left)
      .
attr('x2', args.left)
      .
attr('y1', y1scale)
      .
attr('y2', y2scale);
  }
}

function 
mg_add_y_axis_tick_lines (g, args) {
  
g.selectAll('.mg-yax-ticks')
    .
data(args.processed.y_ticks).enter()
    .
append('line')
    .
classed('mg-extended-y-ticks', args.y_extended_ticks)
    .
attr('x1', args.left)
    .
attr('x2', function () {
      return (
args.y_extended_ticks)
        ? 
args.width - args.right
        
: args.left - args.yax_tick_length;
    })
    .
attr('y1', function (d) { return args.scales.Y(d).toFixed(2); })
    .
attr('y2', function (d) { return args.scales.Y(d).toFixed(2); });
}

function 
mg_add_y_axis_tick_labels (g, args) {
  var 
yax_format = mg_compute_yax_format(args);
  
g.selectAll('.mg-yax-labels')
    .
data(args.processed.y_ticks).enter()
    .
append('text')
    .
attr('x', args.left - args.yax_tick_length * 3 / 2)
    .
attr('dx', -3)
    .
attr('y', function (d) {
      return 
args.scales.Y(d).toFixed(2);
    })
    .
attr('dy', '.35em')
    .
attr('text-anchor', 'end')
    .
text(function (d) {
      var 
o = yax_format(d);
      return 
o;
    });
}

function 
y_axis (args) {
  if (!
args.processed) {
    
args.processed = {};
  }

  var 
svg = mg_get_svg_child_of(args.target);

  
set_min_max_y(args);
  
MG.call_hook('y_axis.process_min_max', args, args.processed.min_y, args.processed.max_y);

  
//mg_define_y_scales(args);
  //mg_add_scale_function(args, 'yf', 'Y', args.y_accessor);

  
mg_selectAll_and_remove(svg, '.mg-y-axis');

  if (!
args.y_axis) { return this; }

  var 
g = mg_add_g(svg, 'mg-y-axis');
  
mg_add_y_label(g, args);
  
mg_process_scale_ticks(args, 'y');
  
mg_add_y_axis_rim(g, args);
  
mg_add_y_axis_tick_lines(g, args);
  
mg_add_y_axis_tick_labels(g, args);

  if (
args.y_rug) { y_rug(args); }

  return 
this;
}

MG.y_axis = y_axis;

function 
mg_add_categorical_labels (args) {
  var 
svg = mg_get_svg_child_of(args.target);
  
mg_selectAll_and_remove(svg, '.mg-y-axis');
  var 
g = mg_add_g(svg, 'mg-y-axis');
  var 
group_g;
  (
args.categorical_groups.length ? args.categorical_groups : ['1']).forEach(function(group){
    
group_g = mg_add_g(g, 'mg-group-' + mg_normalize(group))

    if (
args.ygroup_accessor !== undefined) {
      
mg_add_group_label(group_g, group, args);
    }
    else {
      var 
labels = mg_add_graphic_labels(group_g, group, args);
      
mg_rotate_labels(labels, args.rotate_y_labels);
    }
  });
}

function 
mg_add_graphic_labels (g, group, args) {
  return 
g.selectAll('text').data(args.categorical_variables).enter().append('svg:text')
      .
attr('x', args.left - args.buffer)
      .
attr('y', function (d) {
        return 
args.scales.YGROUP(group) + args.scales.Y(d) + args.scales.Y.rangeBand() / 2;
      })
      .
attr('dy', '.35em')
      .
attr('text-anchor', 'end')
      .
text(String);
}

function 
mg_add_group_label (g, group, args) {
    
g.append('svg:text')
      .
classed('mg-barplot-group-label', true)
      .
attr('x', args.left - args.buffer)
      .
attr('y', args.scales.YGROUP(group) + args.scales.YGROUP.rangeBand()/2)
      .
attr('dy', '.35em')
      .
attr('text-anchor', 'end')
      .
text(group);
}

function 
y_axis_categorical (args) {
  if (!
args.y_axis) { return this; }
  
mg_add_categorical_labels(args);

  if (
args.show_bar_zero) mg_bar_add_zero_line(args);

  return 
this;
}

MG.y_axis_categorical = y_axis_categorical;
?>
Онлайн: 2
Реклама