Skip to content

Commit 7c533d2

Browse files
committed
Add kernel density estimation.
Kernel density estimation is provided via `d3.stats.kde` and the kernel is configurable; several common kernels are provided in `d3.stats.kernel`.
1 parent 0679598 commit 7c533d2

13 files changed

Lines changed: 334 additions & 101 deletions

File tree

Makefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ all: \
66
d3.min.js \
77
d3.behavior.js \
88
d3.behavior.min.js \
9+
d3.stats.js \
10+
d3.stats.min.js \
911
d3.chart.js \
1012
d3.chart.min.js \
1113
d3.layout.js \
@@ -91,6 +93,13 @@ d3.behavior.js: \
9193
src/behavior/zoom.js \
9294
src/end.js
9395

96+
d3.stats.js: \
97+
src/start.js \
98+
src/stats/stats.js \
99+
src/stats/kernel.js \
100+
src/stats/kde.js \
101+
src/end.js
102+
94103
d3.chart.js: \
95104
src/start.js \
96105
src/chart/chart.js \

d3.stats.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
(function(){d3.stats = {};
2+
// See <http://en.wikipedia.org/wiki/Kernel_(statistics)>.
3+
d3.stats.kernel = {
4+
uniform: function(u) {
5+
if (u <= 1 && u >= -1) return .5;
6+
return 0;
7+
},
8+
triangular: function(u) {
9+
if (u <= 1 && u >= -1) return 1 - Math.abs(u);
10+
return 0;
11+
},
12+
epanechnikov: function(u) {
13+
if (u <= 1 && u >= -1) return .75 * (1 - u * u);
14+
return 0;
15+
},
16+
quartic: function(u) {
17+
if (u <= 1 && u >= -1) {
18+
var tmp = 1 - u * u;
19+
return (15 / 16) * tmp * tmp;
20+
}
21+
return 0;
22+
},
23+
triweight: function(u) {
24+
if (u <= 1 && u >= -1) {
25+
var tmp = 1 - u * u;
26+
return (35 / 32) * tmp * tmp * tmp;
27+
}
28+
return 0;
29+
},
30+
gaussian: function(u) {
31+
return 1 / Math.sqrt(2 * Math.PI) * Math.exp(-.5 * u * u);
32+
},
33+
cosine: function(u) {
34+
if (u <= 1 && u >= -1) return Math.PI / 4 * Math.cos(Math.PI / 2 * u);
35+
return 0;
36+
}
37+
};
38+
// http://exploringdata.net/den_trac.htm
39+
d3.stats.kde = function() {
40+
var kernel = d3.stats.kernel.epanechnikov,
41+
sample = [],
42+
scale = 1;
43+
44+
function kde(points) {
45+
return points.map(function(x) {
46+
var i = -1,
47+
y = 0,
48+
n = sample.length;
49+
while (++i < n) {
50+
y += kernel((x - sample[i]) / scale);
51+
}
52+
return [x, y / scale / n];
53+
});
54+
}
55+
56+
kde.kernel = function(x) {
57+
if (!arguments.length) return kernel;
58+
kernel = x;
59+
return kde;
60+
};
61+
62+
kde.sample = function(x) {
63+
if (!arguments.length) return sample;
64+
sample = x;
65+
return kde;
66+
};
67+
68+
kde.scale = function(x) {
69+
if (!arguments.length) return scale;
70+
scale = x;
71+
return kde;
72+
};
73+
74+
return kde;
75+
};
76+
})()

d3.stats.min.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

data/faithful.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
79, 54, 74, 62, 85, 55, 88, 85, 51, 85, 54, 84, 78, 47, 83, 52, 62, 84, 52, 79, 51, 47, 78, 69, 74, 83, 55, 76, 78, 79, 73, 77, 66, 80, 74, 52, 48, 80, 59, 90, 80, 58, 84, 58, 73, 83, 64, 53,
3+
82, 59, 75, 90, 54, 80, 54, 83, 71, 64, 77, 81, 59, 84, 48, 82, 60, 92, 78, 78, 65, 73, 82, 56, 79, 71, 62, 76, 60, 78, 76, 83, 75, 82, 70, 65, 73, 88, 76, 80, 48, 86, 60, 90, 50, 78, 63, 72,
4+
84, 75, 51, 82, 62, 88, 49, 83, 81, 47, 84, 52, 86, 81, 75, 59, 89, 79, 59, 81, 50, 85, 59, 87, 53, 69, 77, 56, 88, 81, 45, 82, 55, 90, 45, 83, 56, 89, 46, 82, 51, 86, 53, 79, 81, 60, 82, 77,
5+
76, 59, 80, 49, 96, 53, 77, 77, 65, 81, 71, 70, 81, 93, 53, 89, 45, 86, 58, 78, 66, 76, 63, 88, 52, 93, 49, 57, 77, 68, 81, 81, 73, 50, 85, 74, 55, 77, 83, 83, 51, 78, 84, 46, 83, 55, 81, 57,
6+
76, 84, 77, 81, 87, 77, 51, 78, 60, 82, 91, 53, 78, 46, 77, 84, 49, 83, 71, 80, 49, 75, 64, 76, 53, 94, 55, 76, 50, 82, 54, 75, 78, 79, 78, 78, 70, 79, 70, 54, 86, 50, 90, 54, 54, 77, 79, 64,
7+
75, 47, 86, 63, 85, 82, 57, 82, 67, 74, 54, 83, 73, 73, 88, 80, 71, 83, 56, 79, 78, 84, 58, 83, 43, 60, 75, 81, 46, 90, 46, 74
8+
]

data/morley.csv

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
Expt,Run,Speed
2+
1,1,850
3+
1,2,740
4+
1,3,900
5+
1,4,1070
6+
1,5,930
7+
1,6,850
8+
1,7,950
9+
1,8,980
10+
1,9,980
11+
1,10,880
12+
1,11,1000
13+
1,12,980
14+
1,13,930
15+
1,14,650
16+
1,15,760
17+
1,16,810
18+
1,17,1000
19+
1,18,1000
20+
1,19,960
21+
1,20,960
22+
2,1,960
23+
2,2,940
24+
2,3,960
25+
2,4,940
26+
2,5,880
27+
2,6,800
28+
2,7,850
29+
2,8,880
30+
2,9,900
31+
2,10,840
32+
2,11,830
33+
2,12,790
34+
2,13,810
35+
2,14,880
36+
2,15,880
37+
2,16,830
38+
2,17,800
39+
2,18,790
40+
2,19,760
41+
2,20,800
42+
3,1,880
43+
3,2,880
44+
3,3,880
45+
3,4,860
46+
3,5,720
47+
3,6,720
48+
3,7,620
49+
3,8,860
50+
3,9,970
51+
3,10,950
52+
3,11,880
53+
3,12,910
54+
3,13,850
55+
3,14,870
56+
3,15,840
57+
3,16,840
58+
3,17,850
59+
3,18,840
60+
3,19,840
61+
3,20,840
62+
4,1,890
63+
4,2,810
64+
4,3,810
65+
4,4,820
66+
4,5,800
67+
4,6,770
68+
4,7,760
69+
4,8,740
70+
4,9,750
71+
4,10,760
72+
4,11,910
73+
4,12,920
74+
4,13,890
75+
4,14,860
76+
4,15,880
77+
4,16,720
78+
4,17,840
79+
4,18,850
80+
4,19,850
81+
4,20,780
82+
5,1,890
83+
5,2,840
84+
5,3,780
85+
5,4,810
86+
5,5,760
87+
5,6,810
88+
5,7,790
89+
5,8,810
90+
5,9,820
91+
5,10,850
92+
5,11,870
93+
5,12,870
94+
5,13,810
95+
5,14,740
96+
5,15,810
97+
5,16,940
98+
5,17,950
99+
5,18,800
100+
5,19,810
101+
5,20,870

examples/box/morley.csv

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

examples/box/morley.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../data/morley.csv

examples/kde/faithful.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../data/faithful.json

examples/kde/kde.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
body {
2+
font: 10px sans-serif;
3+
}
4+
5+
path {
6+
stroke: #000;
7+
stroke-width: 1.5px;
8+
fill: none;
9+
}

examples/kde/kde.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Kernel Density Estimation</title>
5+
<link rel="stylesheet" type="text/css" href="kde.css"/>
6+
<script type="text/javascript" src="../../d3.js"></script>
7+
<script type="text/javascript" src="../../d3.layout.js"></script>
8+
<script type="text/javascript" src="../../d3.stats.js"></script>
9+
</head>
10+
<body>
11+
<script type="text/javascript" src="kde.js"></script>
12+
</body>
13+
</html>

0 commit comments

Comments
 (0)