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