~bac/juju-gui/trunkcopy

« back to all changes in this revision

Viewing changes to lib/d3/src/scale/ordinal.js

  • Committer: kapil.foss at gmail
  • Date: 2012-07-13 18:45:59 UTC
  • Revision ID: kapil.foss@gmail.com-20120713184559-2xl7be17egsrz0c9
reshape

Show diffs side-by-side

added added

removed removed

Lines of Context:
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.get(x) || index.set(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 = new d3_Map;
22
 
    var i = -1, n = x.length, xi;
23
 
    while (++i < n) if (!index.has(xi = x[i])) index.set(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 reverse = x[1] < x[0],
49
 
        start = x[reverse - 0],
50
 
        stop = x[1 - reverse],
51
 
        step = (stop - start) / (domain.length + padding);
52
 
    range = steps(start + step * padding, step);
53
 
    if (reverse) range.reverse();
54
 
    rangeBand = step * (1 - padding);
55
 
    ranger = {t: "rangeBands", x: x, p: padding};
56
 
    return scale;
57
 
  };
58
 
 
59
 
  scale.rangeRoundBands = function(x, padding) {
60
 
    if (arguments.length < 2) padding = 0;
61
 
    var reverse = x[1] < x[0],
62
 
        start = x[reverse - 0],
63
 
        stop = x[1 - reverse],
64
 
        step = Math.floor((stop - start) / (domain.length + padding)),
65
 
        error = stop - start - (domain.length - padding) * step;
66
 
    range = steps(start + Math.round(error / 2), step);
67
 
    if (reverse) range.reverse();
68
 
    rangeBand = Math.round(step * (1 - padding));
69
 
    ranger = {t: "rangeRoundBands", x: x, p: padding};
70
 
    return scale;
71
 
  };
72
 
 
73
 
  scale.rangeBand = function() {
74
 
    return rangeBand;
75
 
  };
76
 
 
77
 
  scale.rangeExtent = function() {
78
 
    return d3_scaleExtent(ranger.x);
79
 
  };
80
 
 
81
 
  scale.copy = function() {
82
 
    return d3_scale_ordinal(domain, ranger);
83
 
  };
84
 
 
85
 
  return scale.domain(domain);
86
 
}