1
d3.scale.ordinal = function() {
2
return d3_scale_ordinal([], {t: "range", x: []});
5
function d3_scale_ordinal(domain, ranger) {
11
return range[((index.get(x) || index.set(x, domain.push(x))) - 1) % range.length];
14
function steps(start, step) {
15
return d3.range(domain.length).map(function(i) { return start + step * i; });
18
scale.domain = function(x) {
19
if (!arguments.length) return domain;
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);
27
scale.range = function(x) {
28
if (!arguments.length) return range;
31
ranger = {t: "range", x: x};
35
scale.rangePoints = function(x, padding) {
36
if (arguments.length < 2) padding = 0;
39
step = (stop - start) / (domain.length - 1 + padding);
40
range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);
42
ranger = {t: "rangePoints", x: x, p: padding};
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};
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};
73
scale.rangeBand = function() {
77
scale.rangeExtent = function() {
78
return d3_scaleExtent(ranger.x);
81
scale.copy = function() {
82
return d3_scale_ordinal(domain, ranger);
85
return scale.domain(domain);