|
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 }; |