source: Dev/trunk/d3/src/scale/ordinal.js @ 76

Last change on this file since 76 was 76, checked in by fpvanagthoven, 14 years ago

d3

File size: 2.0 KB
Line 
1d3.scale.ordinal = function() {
2  var domain = [],
3      index = {},
4      range = [],
5      rangeBand = 0,
6      rerange = d3_noop;
7
8  function scale(x) {
9    var i = x in index ? index[x] : (index[x] = domain.push(x) - 1);
10    return range[i % range.length];
11  }
12
13  scale.domain = function(x) {
14    if (!arguments.length) return domain;
15    domain = x;
16    index = {};
17    var i = -1, j = -1, n = domain.length; while (++i < n) {
18      x = domain[i];
19      if (!(x in index)) index[x] = ++j;
20    }
21    rerange();
22    return scale;
23  };
24
25  scale.range = function(x) {
26    if (!arguments.length) return range;
27    range = x;
28    rerange = d3_noop;
29    return scale;
30  };
31
32  scale.rangePoints = function(x, padding) {
33    if (arguments.length < 2) padding = 0;
34    (rerange = function() {
35      var start = x[0],
36          stop = x[1],
37          step = (stop - start) / (domain.length - 1 + padding);
38      range = domain.length == 1
39          ? [(start + stop) / 2]
40          : d3.range(start + step * padding / 2, stop + step / 2, step);
41      rangeBand = 0;
42    })();
43    return scale;
44  };
45
46  scale.rangeBands = function(x, padding) {
47    if (arguments.length < 2) padding = 0;
48    (rerange = function() {
49      var start = x[0],
50          stop = x[1],
51          step = (stop - start) / (domain.length + padding);
52      range = d3.range(start + step * padding, stop, step);
53      rangeBand = step * (1 - padding);
54    })();
55    return scale;
56  };
57
58  scale.rangeRoundBands = function(x, padding) {
59    if (arguments.length < 2) padding = 0;
60    (rerange = function() {
61      var start = x[0],
62          stop = x[1],
63          diff = stop - start,
64          step = Math.floor(diff / (domain.length + padding)),
65          err = diff - (domain.length - padding) * step;
66      range = d3.range(start + Math.round(err / 2), stop, step);
67      rangeBand = Math.round(step * (1 - padding));
68    })();
69    return scale;
70  };
71
72  scale.rangeBand = function() {
73    return rangeBand;
74  };
75
76  return scale;
77};
Note: See TracBrowser for help on using the repository browser.