d3
Version:
A small, free JavaScript library for manipulating documents based on data.
69 lines (60 loc) • 1.78 kB
JavaScript
d3.scale.ordinal = function() {
var domain = [],
index = {},
range = [],
rangeBand = 0;
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;
}
return scale;
};
scale.range = function(x) {
if (!arguments.length) return range;
range = x;
return scale;
};
scale.rangePoints = function(x, padding) {
if (arguments.length < 2) padding = 0;
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;
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;
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;
};