Skip to content

Commit 19d478f

Browse files
committed
Add quantile scale.
1 parent 2cdaf6a commit 19d478f

9 files changed

Lines changed: 140 additions & 68 deletions

File tree

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ d3.scale.js: \
6464
src/scale/pow.js \
6565
src/scale/sqrt.js \
6666
src/scale/ordinal.js \
67-
src/scale/category.js
67+
src/scale/category.js \
68+
src/scale/quantile.js
6869

6970
d3.svg.js: \
7071
src/svg/svg.js \

d3.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
d3 = {version: "0.28.3"}; // semver
1+
d3 = {version: "0.28.4"}; // semver
22
if (!Date.now) Date.now = function() {
33
return +new Date();
44
};
@@ -1915,6 +1915,50 @@ var d3_category20c = [
19151915
"#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb",
19161916
"#636363", "#969696", "#bdbdbd", "#d9d9d9"
19171917
];
1918+
d3.scale.quantile = function() {
1919+
var domain = [],
1920+
range = [],
1921+
thresholds = [];
1922+
1923+
function rescale() {
1924+
var i = -1,
1925+
n = thresholds.length = range.length,
1926+
k = domain.length / n;
1927+
while (++i < n) thresholds[i] = domain[~~(i * k)];
1928+
}
1929+
1930+
function quantile(value) {
1931+
if (isNaN(value = +value)) return NaN;
1932+
var low = 0, high = thresholds.length - 1;
1933+
while (low <= high) {
1934+
var mid = (low + high) >> 1, midValue = thresholds[mid];
1935+
if (midValue < value) low = mid + 1;
1936+
else if (midValue > value) high = mid - 1;
1937+
else return mid;
1938+
}
1939+
return high < 0 ? 0 : high;
1940+
}
1941+
1942+
function scale(x) {
1943+
return range[quantile(x)];
1944+
}
1945+
1946+
scale.domain = function(x) {
1947+
if (!arguments.length) return domain;
1948+
domain = x.slice().sort(d3.ascending);
1949+
rescale();
1950+
return scale;
1951+
};
1952+
1953+
scale.range = function(x) {
1954+
if (!arguments.length) return range;
1955+
range = x;
1956+
rescale();
1957+
return scale;
1958+
};
1959+
1960+
return scale;
1961+
};
19181962
d3.svg = {};
19191963
d3["svg"]["arc"] = function() {
19201964
var innerRadius = d3_svg_arcInnerRadius,

d3.min.js

Lines changed: 38 additions & 37 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/calendar/dji.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
<script type="text/javascript" src="../../d3.csv.min.js"></script>
66
<script type="text/javascript" src="values.js"></script>
77
<script type="text/javascript" src="nest.js"></script>
8-
<script type="text/javascript" src="quantile.js"></script>
98
<style type="text/css">
109

1110
@import url("../../lib/colorbrewer/colorbrewer.css");
@@ -37,7 +36,9 @@
3736
.key(function(d) { return d.Date; })
3837
.rollup(function(d) { return (d[0].Close - d[0].Open) / d[0].Open; });
3938

40-
var color = quantile(values(data), 9);
39+
var color = d3.scale.quantile()
40+
.domain(values(data))
41+
.range(d3.range(9));
4142

4243
var w = 960,
4344
pw = 14,

examples/calendar/quantile.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

examples/calendar/vix.html

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
<script type="text/javascript" src="../../d3.csv.min.js"></script>
66
<script type="text/javascript" src="values.js"></script>
77
<script type="text/javascript" src="nest.js"></script>
8-
<script type="text/javascript" src="quantile.js"></script>
98
<style type="text/css">
109

1110
@import url("../../lib/colorbrewer/colorbrewer.css");
@@ -37,7 +36,9 @@
3736
.key(function(d) { return d.Date; })
3837
.rollup(function(d) { return d[0].Open; });
3938

40-
var color = quantile(values(data), 9);
39+
var color = d3.scale.quantile()
40+
.domain(values(data))
41+
.range(d3.range(9).reverse());
4142

4243
var w = 960,
4344
pw = 14,
@@ -64,7 +65,7 @@
6465
.enter("svg:rect")
6566
.attr("x", function(d) { return d.week * z; })
6667
.attr("y", function(d) { return d.day * z; })
67-
.attr("class", function(d) { return "day q" + (8-color(data[d.Date])) + "-9"; })
68+
.attr("class", function(d) { return "day q" + color(data[d.Date]) + "-9"; })
6869
.attr("width", z)
6970
.attr("height", z)
7071
.append("svg:title")

src/core/core.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
d3 = {version: "0.28.3"}; // semver
1+
d3 = {version: "0.28.4"}; // semver

src/externs.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ var d3 = {
1313
ease: 1,
1414
event: 1,
1515
format: 1,
16+
ascending: 1,
17+
descending: 1,
1618
rgb: {
1719
r: 1,
1820
g: 1,
@@ -99,6 +101,7 @@ d3.scale = {
99101
pow: {
100102
exponent: 1
101103
},
104+
quantile: 1,
102105
range: 1,
103106
sqrt: 1,
104107
ticks: 1,

src/scale/quantile.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
d3.scale.quantile = function() {
2+
var domain = [],
3+
range = [],
4+
thresholds = [];
5+
6+
function rescale() {
7+
var i = -1,
8+
n = thresholds.length = range.length,
9+
k = domain.length / n;
10+
while (++i < n) thresholds[i] = domain[~~(i * k)];
11+
}
12+
13+
function quantile(value) {
14+
if (isNaN(value = +value)) return NaN;
15+
var low = 0, high = thresholds.length - 1;
16+
while (low <= high) {
17+
var mid = (low + high) >> 1, midValue = thresholds[mid];
18+
if (midValue < value) low = mid + 1;
19+
else if (midValue > value) high = mid - 1;
20+
else return mid;
21+
}
22+
return high < 0 ? 0 : high;
23+
}
24+
25+
function scale(x) {
26+
return range[quantile(x)];
27+
}
28+
29+
scale.domain = function(x) {
30+
if (!arguments.length) return domain;
31+
domain = x.slice().sort(d3.ascending);
32+
rescale();
33+
return scale;
34+
};
35+
36+
scale.range = function(x) {
37+
if (!arguments.length) return range;
38+
range = x;
39+
rescale();
40+
return scale;
41+
};
42+
43+
return scale;
44+
};

0 commit comments

Comments
 (0)