toolkit/javascript/d3/src/scale/ordinal.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 d3.scale.ordinal = function() {
       
     2   return d3_scale_ordinal([], {t: "range", x: []});
       
     3 };
       
     4 
       
     5 function d3_scale_ordinal(domain, ranger) {
       
     6   var index,
       
     7       range,
       
     8       rangeBand;
       
     9 
       
    10   function scale(x) {
       
    11     return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length];
       
    12   }
       
    13 
       
    14   function steps(start, step) {
       
    15     return d3.range(domain.length).map(function(i) { return start + step * i; });
       
    16   }
       
    17 
       
    18   scale.domain = function(x) {
       
    19     if (!arguments.length) return domain;
       
    20     domain = [];
       
    21     index = {};
       
    22     var i = -1, n = x.length, xi;
       
    23     while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi);
       
    24     return scale[ranger.t](ranger.x, ranger.p);
       
    25   };
       
    26 
       
    27   scale.range = function(x) {
       
    28     if (!arguments.length) return range;
       
    29     range = x;
       
    30     rangeBand = 0;
       
    31     ranger = {t: "range", x: x};
       
    32     return scale;
       
    33   };
       
    34 
       
    35   scale.rangePoints = function(x, padding) {
       
    36     if (arguments.length < 2) padding = 0;
       
    37     var start = x[0],
       
    38         stop = x[1],
       
    39         step = (stop - start) / (domain.length - 1 + padding);
       
    40     range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);
       
    41     rangeBand = 0;
       
    42     ranger = {t: "rangePoints", x: x, p: padding};
       
    43     return scale;
       
    44   };
       
    45 
       
    46   scale.rangeBands = function(x, padding) {
       
    47     if (arguments.length < 2) padding = 0;
       
    48     var start = x[0],
       
    49         stop = x[1],
       
    50         step = (stop - start) / (domain.length + padding);
       
    51     range = steps(start + step * padding, step);
       
    52     rangeBand = step * (1 - padding);
       
    53     ranger = {t: "rangeBands", x: x, p: padding};
       
    54     return scale;
       
    55   };
       
    56 
       
    57   scale.rangeRoundBands = function(x, padding) {
       
    58     if (arguments.length < 2) padding = 0;
       
    59     var start = x[0],
       
    60         stop = x[1],
       
    61         step = Math.floor((stop - start) / (domain.length + padding));
       
    62     range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);
       
    63     rangeBand = Math.round(step * (1 - padding));
       
    64     ranger = {t: "rangeRoundBands", x: x, p: padding};
       
    65     return scale;
       
    66   };
       
    67 
       
    68   scale.rangeBand = function() {
       
    69     return rangeBand;
       
    70   };
       
    71 
       
    72   scale.copy = function() {
       
    73     return d3_scale_ordinal(domain, ranger);
       
    74   };
       
    75 
       
    76   return scale.domain(domain);
       
    77 };