1 | d3.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 | }; |
---|