toolkit/javascript/d3/src/scale/log.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 d3.scale.log = function() {
       
     2   return d3_scale_log(d3.scale.linear(), d3_scale_logp);
       
     3 };
       
     4 
       
     5 function d3_scale_log(linear, log) {
       
     6   var pow = log.pow;
       
     7 
       
     8   function scale(x) {
       
     9     return linear(log(x));
       
    10   }
       
    11 
       
    12   scale.invert = function(x) {
       
    13     return pow(linear.invert(x));
       
    14   };
       
    15 
       
    16   scale.domain = function(x) {
       
    17     if (!arguments.length) return linear.domain().map(pow);
       
    18     log = x[0] < 0 ? d3_scale_logn : d3_scale_logp;
       
    19     pow = log.pow;
       
    20     linear.domain(x.map(log));
       
    21     return scale;
       
    22   };
       
    23 
       
    24   scale.nice = function() {
       
    25     linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault));
       
    26     return scale;
       
    27   };
       
    28 
       
    29   scale.ticks = function() {
       
    30     var extent = d3_scaleExtent(linear.domain()),
       
    31         ticks = [];
       
    32     if (extent.every(isFinite)) {
       
    33       var i = Math.floor(extent[0]),
       
    34           j = Math.ceil(extent[1]),
       
    35           u = Math.round(pow(extent[0])),
       
    36           v = Math.round(pow(extent[1]));
       
    37       if (log === d3_scale_logn) {
       
    38         ticks.push(pow(i));
       
    39         for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k);
       
    40       } else {
       
    41         for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k);
       
    42         ticks.push(pow(i));
       
    43       }
       
    44       for (i = 0; ticks[i] < u; i++) {} // strip small values
       
    45       for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values
       
    46       ticks = ticks.slice(i, j);
       
    47     }
       
    48     return ticks;
       
    49   };
       
    50 
       
    51   scale.tickFormat = function(n, format) {
       
    52     if (arguments.length < 2) format = d3_scale_logFormat;
       
    53     if (arguments.length < 1) return format;
       
    54     var k = n / scale.ticks().length,
       
    55         f = log === d3_scale_logn ? (e = -1e-15, Math.floor) : (e = 1e-15, Math.ceil),
       
    56         e;
       
    57     return function(d) {
       
    58       return d / pow(f(log(d) + e)) < k ? format(d) : "";
       
    59     };
       
    60   };
       
    61 
       
    62   scale.copy = function() {
       
    63     return d3_scale_log(linear.copy(), log);
       
    64   };
       
    65 
       
    66   return d3_scale_linearRebind(scale, linear);
       
    67 };
       
    68 
       
    69 var d3_scale_logFormat = d3.format("e");
       
    70 
       
    71 function d3_scale_logp(x) {
       
    72   return Math.log(x) / Math.LN10;
       
    73 }
       
    74 
       
    75 function d3_scale_logn(x) {
       
    76   return -Math.log(-x) / Math.LN10;
       
    77 }
       
    78 
       
    79 d3_scale_logp.pow = function(x) {
       
    80   return Math.pow(10, x);
       
    81 };
       
    82 
       
    83 d3_scale_logn.pow = function(x) {
       
    84   return -Math.pow(10, -x);
       
    85 };