annotate extract_display_features/dashboard/html_js.py @ 0:89592faa2875 draft

Uploaded
author chrisb
date Wed, 23 Mar 2016 14:35:56 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1 __license__ = "MIT"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3 # test if local js dashboard will work
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5 if __name__ == "__main__":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6 import sys
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8 try:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9 inone = file(sys.argv[1],"read").readlines()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10 out = file(sys.argv[2],"w")
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11 output="""
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12 <!DOCTYPE html>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13 <html lang="en">
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14 <head>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15 <title>dc.js - Number Display Example</title>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16 <meta charset="UTF-8">
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17 </head>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18 <style>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19 div.dc-chart {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20 float: left;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
21 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
22
89592faa2875 Uploaded
chrisb
parents:
diff changeset
23 .dc-chart rect.bar {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
24 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
25 cursor: pointer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
26 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
27
89592faa2875 Uploaded
chrisb
parents:
diff changeset
28 .dc-chart rect.bar:hover {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
29 fill-opacity: .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
30 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
31
89592faa2875 Uploaded
chrisb
parents:
diff changeset
32 .dc-chart rect.stack1 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
33 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
34 fill: red;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
35 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
36
89592faa2875 Uploaded
chrisb
parents:
diff changeset
37 .dc-chart rect.stack2 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
38 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
39 fill: green;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
40 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
41
89592faa2875 Uploaded
chrisb
parents:
diff changeset
42 .dc-chart rect.deselected {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
43 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
44 fill: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
45 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
46
89592faa2875 Uploaded
chrisb
parents:
diff changeset
47 .dc-chart .empty-chart .pie-slice path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
48 fill: #FFEEEE;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
49 cursor: default;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
50 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
51
89592faa2875 Uploaded
chrisb
parents:
diff changeset
52 .dc-chart .empty-chart .pie-slice {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
53 cursor: default;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
54 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
55
89592faa2875 Uploaded
chrisb
parents:
diff changeset
56 .dc-chart .pie-slice {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
57 fill: white;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
58 font-size: 12px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
59 cursor: pointer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
60 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
61
89592faa2875 Uploaded
chrisb
parents:
diff changeset
62 .dc-chart .pie-slice.external{
89592faa2875 Uploaded
chrisb
parents:
diff changeset
63 fill: black;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
64 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
65
89592faa2875 Uploaded
chrisb
parents:
diff changeset
66 .dc-chart .pie-slice :hover {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
67 fill-opacity: .8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
68 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
69
89592faa2875 Uploaded
chrisb
parents:
diff changeset
70 .dc-chart .pie-slice.highlight {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
71 fill-opacity: .8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
72 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
73
89592faa2875 Uploaded
chrisb
parents:
diff changeset
74 .dc-chart .selected path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
75 stroke-width: 3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
76 stroke: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
77 fill-opacity: 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
78 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
79
89592faa2875 Uploaded
chrisb
parents:
diff changeset
80 .dc-chart .deselected path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
81 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
82 fill-opacity: .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
83 fill: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
84 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
85
89592faa2875 Uploaded
chrisb
parents:
diff changeset
86 .dc-chart .axis path, .axis line {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
87 fill: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
88 stroke: #000;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
89 shape-rendering: crispEdges;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
90 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
91
89592faa2875 Uploaded
chrisb
parents:
diff changeset
92 .dc-chart .axis text {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
93 font: 10px sans-serif;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
94 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
95
89592faa2875 Uploaded
chrisb
parents:
diff changeset
96 .dc-chart .grid-line {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
97 fill: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
98 stroke: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
99 opacity: .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
100 shape-rendering: crispEdges;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
101 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
102
89592faa2875 Uploaded
chrisb
parents:
diff changeset
103 .dc-chart .grid-line line {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
104 fill: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
105 stroke: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
106 opacity: .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
107 shape-rendering: crispEdges;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
108 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
109
89592faa2875 Uploaded
chrisb
parents:
diff changeset
110 .dc-chart .brush rect.background {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
111 z-index: -999;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
112 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
113
89592faa2875 Uploaded
chrisb
parents:
diff changeset
114 .dc-chart .brush rect.extent {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
115 fill: steelblue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
116 fill-opacity: .125;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
117 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
118
89592faa2875 Uploaded
chrisb
parents:
diff changeset
119 .dc-chart .brush .resize path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
120 fill: #eee;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
121 stroke: #666;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
122 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
123
89592faa2875 Uploaded
chrisb
parents:
diff changeset
124 .dc-chart path.line {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
125 fill: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
126 stroke-width: 1.5px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
127 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
128
89592faa2875 Uploaded
chrisb
parents:
diff changeset
129 .dc-chart circle.dot {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
130 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
131 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
132
89592faa2875 Uploaded
chrisb
parents:
diff changeset
133 .dc-chart g.dc-tooltip path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
134 fill: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
135 stroke: grey;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
136 stroke-opacity: .8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
137 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
138
89592faa2875 Uploaded
chrisb
parents:
diff changeset
139 .dc-chart path.area {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
140 fill-opacity: .3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
141 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
142 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
143
89592faa2875 Uploaded
chrisb
parents:
diff changeset
144 .dc-chart .node {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
145 font-size: 0.7em;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
146 cursor: pointer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
147 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
148
89592faa2875 Uploaded
chrisb
parents:
diff changeset
149 .dc-chart .node :hover {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
150 fill-opacity: .8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
151 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
152
89592faa2875 Uploaded
chrisb
parents:
diff changeset
153 .dc-chart .selected circle {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
154 stroke-width: 3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
155 stroke: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
156 fill-opacity: 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
157 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
158
89592faa2875 Uploaded
chrisb
parents:
diff changeset
159 .dc-chart .deselected circle {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
160 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
161 fill-opacity: .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
162 fill: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
163 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
164
89592faa2875 Uploaded
chrisb
parents:
diff changeset
165 .dc-chart .bubble {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
166 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
167 fill-opacity: 0.6;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
168 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
169
89592faa2875 Uploaded
chrisb
parents:
diff changeset
170 .dc-data-count {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
171 float: right;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
172 margin-top: 15px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
173 margin-right: 15px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
174 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
175
89592faa2875 Uploaded
chrisb
parents:
diff changeset
176 .dc-data-count .filter-count {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
177 color: #3182bd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
178 font-weight: bold;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
179 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
180
89592faa2875 Uploaded
chrisb
parents:
diff changeset
181 .dc-data-count .total-count {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
182 color: #3182bd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
183 font-weight: bold;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
184 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
185
89592faa2875 Uploaded
chrisb
parents:
diff changeset
186 .dc-data-table {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
187 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
188
89592faa2875 Uploaded
chrisb
parents:
diff changeset
189 .dc-chart g.state {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
190 cursor: pointer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
191 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
192
89592faa2875 Uploaded
chrisb
parents:
diff changeset
193 .dc-chart g.state :hover {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
194 fill-opacity: .8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
195 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
196
89592faa2875 Uploaded
chrisb
parents:
diff changeset
197 .dc-chart g.state path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
198 stroke: white;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
199 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
200
89592faa2875 Uploaded
chrisb
parents:
diff changeset
201 .dc-chart g.selected path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
202 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
203
89592faa2875 Uploaded
chrisb
parents:
diff changeset
204 .dc-chart g.deselected path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
205 fill: grey;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
206 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
207
89592faa2875 Uploaded
chrisb
parents:
diff changeset
208 .dc-chart g.selected text {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
209 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
210
89592faa2875 Uploaded
chrisb
parents:
diff changeset
211 .dc-chart g.deselected text {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
212 display: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
213 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
214
89592faa2875 Uploaded
chrisb
parents:
diff changeset
215 .dc-chart g.county path {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
216 stroke: white;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
217 fill: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
218 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
219
89592faa2875 Uploaded
chrisb
parents:
diff changeset
220 .dc-chart g.debug rect {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
221 fill: blue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
222 fill-opacity: .2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
223 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
224
89592faa2875 Uploaded
chrisb
parents:
diff changeset
225 .dc-chart g.row rect {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
226 fill-opacity: 0.8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
227 cursor: pointer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
228 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
229
89592faa2875 Uploaded
chrisb
parents:
diff changeset
230 .dc-chart g.row rect:hover {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
231 fill-opacity: 0.6;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
232 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
233
89592faa2875 Uploaded
chrisb
parents:
diff changeset
234 .dc-chart g.row text {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
235 fill: white;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
236 font-size: 12px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
237 cursor: pointer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
238 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
239
89592faa2875 Uploaded
chrisb
parents:
diff changeset
240 .dc-legend {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
241 font-size: 11px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
242 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
243
89592faa2875 Uploaded
chrisb
parents:
diff changeset
244 .dc-legend-item {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
245 cursor: pointer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
246 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
247
89592faa2875 Uploaded
chrisb
parents:
diff changeset
248 .dc-chart g.axis text {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
249 /* Makes it so the user can't accidentally click and select text that is meant as a label only */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
250 -webkit-user-select: none; /* Chrome/Safari */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
251 -moz-user-select: none; /* Firefox */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
252 -ms-user-select: none; /* IE10 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
253 -o-user-select: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
254 user-select: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
255 pointer-events: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
256 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
257
89592faa2875 Uploaded
chrisb
parents:
diff changeset
258 .dc-chart path.highlight {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
259 stroke-width: 3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
260 fill-opacity: 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
261 stroke-opacity: 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
262 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
263
89592faa2875 Uploaded
chrisb
parents:
diff changeset
264 .dc-chart .highlight {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
265 fill-opacity: 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
266 stroke-opacity: 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
267 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
268
89592faa2875 Uploaded
chrisb
parents:
diff changeset
269 .dc-chart .fadeout {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
270 fill-opacity: 0.2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
271 stroke-opacity: 0.2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
272 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
273
89592faa2875 Uploaded
chrisb
parents:
diff changeset
274 .dc-chart path.dc-symbol, g.dc-legend-item.fadeout {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
275 fill-opacity: 0.5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
276 stroke-opacity: 0.5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
277 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
278
89592faa2875 Uploaded
chrisb
parents:
diff changeset
279 .dc-hard .number-display {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
280 float: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
281 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
282
89592faa2875 Uploaded
chrisb
parents:
diff changeset
283 .dc-chart .box text {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
284 font: 10px sans-serif;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
285 -webkit-user-select: none; /* Chrome/Safari */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
286 -moz-user-select: none; /* Firefox */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
287 -ms-user-select: none; /* IE10 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
288 -o-user-select: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
289 user-select: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
290 pointer-events: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
291 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
292
89592faa2875 Uploaded
chrisb
parents:
diff changeset
293 .dc-chart .box line,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
294 .dc-chart .box circle {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
295 fill: #fff;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
296 stroke: #000;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
297 stroke-width: 1.5px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
298 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
299
89592faa2875 Uploaded
chrisb
parents:
diff changeset
300 .dc-chart .box rect {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
301 stroke: #000;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
302 stroke-width: 1.5px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
303 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
304
89592faa2875 Uploaded
chrisb
parents:
diff changeset
305 .dc-chart .box .center {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
306 stroke-dasharray: 3,3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
307 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
308
89592faa2875 Uploaded
chrisb
parents:
diff changeset
309 .dc-chart .box .outlier {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
310 fill: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
311 stroke: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
312 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
313
89592faa2875 Uploaded
chrisb
parents:
diff changeset
314 .dc-chart .box.deselected .box {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
315 fill: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
316 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
317
89592faa2875 Uploaded
chrisb
parents:
diff changeset
318 .dc-chart .box.deselected {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
319 opacity: .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
320 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
321
89592faa2875 Uploaded
chrisb
parents:
diff changeset
322 .dc-chart .symbol{
89592faa2875 Uploaded
chrisb
parents:
diff changeset
323 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
324 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
325
89592faa2875 Uploaded
chrisb
parents:
diff changeset
326 .dc-chart .heatmap .box-group.deselected rect {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
327 stroke: none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
328 fill-opacity: .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
329 fill: #ccc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
330 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
331
89592faa2875 Uploaded
chrisb
parents:
diff changeset
332 .dc-chart .heatmap g.axis text {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
333 pointer-events: all;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
334 cursor: pointer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
335 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
336
89592faa2875 Uploaded
chrisb
parents:
diff changeset
337 </style>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
338 <body>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
339
89592faa2875 Uploaded
chrisb
parents:
diff changeset
340 <div id="chart-bar-ring"></div>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
341 <div id="chart-row-pdb"></div>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
342
89592faa2875 Uploaded
chrisb
parents:
diff changeset
343
89592faa2875 Uploaded
chrisb
parents:
diff changeset
344 <script>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
345 !function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
346 var d3 = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
347 version: "3.5.2"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
348 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
349 if (!Date.now) Date.now = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
350 return +new Date();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
351 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
352 var d3_arraySlice = [].slice, d3_array = function(list) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
353 return d3_arraySlice.call(list);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
354 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
355 var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
356 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
357 d3_array(d3_documentElement.childNodes)[0].nodeType;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
358 } catch (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
359 d3_array = function(list) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
360 var i = list.length, array = new Array(i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
361 while (i--) array[i] = list[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
362 return array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
363 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
364 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
365 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
366 d3_document.createElement("div").style.setProperty("opacity", 0, "");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
367 } catch (error) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
368 var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
369 d3_element_prototype.setAttribute = function(name, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
370 d3_element_setAttribute.call(this, name, value + "");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
371 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
372 d3_element_prototype.setAttributeNS = function(space, local, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
373 d3_element_setAttributeNS.call(this, space, local, value + "");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
374 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
375 d3_style_prototype.setProperty = function(name, value, priority) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
376 d3_style_setProperty.call(this, name, value + "", priority);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
377 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
378 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
379 d3.ascending = d3_ascending;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
380 function d3_ascending(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
381 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
382 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
383 d3.descending = function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
384 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
385 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
386 d3.min = function(array, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
387 var i = -1, n = array.length, a, b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
388 if (arguments.length === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
389 while (++i < n) if ((b = array[i]) != null && b >= b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
390 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
391 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
392 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
393 while (++i < n) if ((b = array[i]) != null && a > b) a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
394 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
395 while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
396 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
397 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
398 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
399 while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
400 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
401 return a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
402 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
403 d3.max = function(array, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
404 var i = -1, n = array.length, a, b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
405 if (arguments.length === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
406 while (++i < n) if ((b = array[i]) != null && b >= b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
407 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
408 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
409 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
410 while (++i < n) if ((b = array[i]) != null && b > a) a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
411 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
412 while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
413 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
414 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
415 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
416 while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
417 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
418 return a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
419 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
420 d3.extent = function(array, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
421 var i = -1, n = array.length, a, b, c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
422 if (arguments.length === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
423 while (++i < n) if ((b = array[i]) != null && b >= b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
424 a = c = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
425 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
426 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
427 while (++i < n) if ((b = array[i]) != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
428 if (a > b) a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
429 if (c < b) c = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
430 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
431 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
432 while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
433 a = c = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
434 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
435 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
436 while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
437 if (a > b) a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
438 if (c < b) c = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
439 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
440 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
441 return [ a, c ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
442 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
443 function d3_number(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
444 return x === null ? NaN : +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
445 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
446 function d3_numeric(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
447 return !isNaN(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
448 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
449 d3.sum = function(array, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
450 var s = 0, n = array.length, a, i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
451 if (arguments.length === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
452 while (++i < n) if (d3_numeric(a = +array[i])) s += a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
453 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
454 while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
455 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
456 return s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
457 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
458 d3.mean = function(array, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
459 var s = 0, n = array.length, a, i = -1, j = n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
460 if (arguments.length === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
461 while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
462 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
463 while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
464 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
465 if (j) return s / j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
466 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
467 d3.quantile = function(values, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
468 var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
469 return e ? v + e * (values[h] - v) : v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
470 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
471 d3.median = function(array, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
472 var numbers = [], n = array.length, a, i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
473 if (arguments.length === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
474 while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
475 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
476 while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
477 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
478 if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
479 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
480 d3.variance = function(array, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
481 var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
482 if (arguments.length === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
483 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
484 if (d3_numeric(a = d3_number(array[i]))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
485 d = a - m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
486 m += d / ++j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
487 s += d * (a - m);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
488 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
489 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
490 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
491 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
492 if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
493 d = a - m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
494 m += d / ++j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
495 s += d * (a - m);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
496 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
497 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
498 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
499 if (j > 1) return s / (j - 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
500 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
501 d3.deviation = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
502 var v = d3.variance.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
503 return v ? Math.sqrt(v) : v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
504 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
505 function d3_bisector(compare) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
506 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
507 left: function(a, x, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
508 if (arguments.length < 3) lo = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
509 if (arguments.length < 4) hi = a.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
510 while (lo < hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
511 var mid = lo + hi >>> 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
512 if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
513 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
514 return lo;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
515 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
516 right: function(a, x, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
517 if (arguments.length < 3) lo = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
518 if (arguments.length < 4) hi = a.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
519 while (lo < hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
520 var mid = lo + hi >>> 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
521 if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
522 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
523 return lo;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
524 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
525 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
526 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
527 var d3_bisect = d3_bisector(d3_ascending);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
528 d3.bisectLeft = d3_bisect.left;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
529 d3.bisect = d3.bisectRight = d3_bisect.right;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
530 d3.bisector = function(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
531 return d3_bisector(f.length === 1 ? function(d, x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
532 return d3_ascending(f(d), x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
533 } : f);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
534 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
535 d3.shuffle = function(array, i0, i1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
536 if ((m = arguments.length) < 3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
537 i1 = array.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
538 if (m < 2) i0 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
539 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
540 var m = i1 - i0, t, i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
541 while (m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
542 i = Math.random() * m-- | 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
543 t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
544 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
545 return array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
546 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
547 d3.permute = function(array, indexes) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
548 var i = indexes.length, permutes = new Array(i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
549 while (i--) permutes[i] = array[indexes[i]];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
550 return permutes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
551 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
552 d3.pairs = function(array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
553 var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
554 while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
555 return pairs;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
556 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
557 d3.zip = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
558 if (!(n = arguments.length)) return [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
559 for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
560 for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
561 zip[j] = arguments[j][i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
562 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
563 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
564 return zips;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
565 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
566 function d3_zipLength(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
567 return d.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
568 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
569 d3.transpose = function(matrix) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
570 return d3.zip.apply(d3, matrix);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
571 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
572 d3.keys = function(map) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
573 var keys = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
574 for (var key in map) keys.push(key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
575 return keys;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
576 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
577 d3.values = function(map) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
578 var values = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
579 for (var key in map) values.push(map[key]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
580 return values;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
581 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
582 d3.entries = function(map) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
583 var entries = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
584 for (var key in map) entries.push({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
585 key: key,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
586 value: map[key]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
587 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
588 return entries;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
589 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
590 d3.merge = function(arrays) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
591 var n = arrays.length, m, i = -1, j = 0, merged, array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
592 while (++i < n) j += arrays[i].length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
593 merged = new Array(j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
594 while (--n >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
595 array = arrays[n];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
596 m = array.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
597 while (--m >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
598 merged[--j] = array[m];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
599 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
600 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
601 return merged;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
602 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
603 var abs = Math.abs;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
604 d3.range = function(start, stop, step) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
605 if (arguments.length < 3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
606 step = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
607 if (arguments.length < 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
608 stop = start;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
609 start = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
610 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
611 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
612 if ((stop - start) / step === Infinity) throw new Error("infinite range");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
613 var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
614 start *= k, stop *= k, step *= k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
615 if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
616 return range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
617 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
618 function d3_range_integerScale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
619 var k = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
620 while (x * k % 1) k *= 10;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
621 return k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
622 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
623 function d3_class(ctor, properties) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
624 for (var key in properties) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
625 Object.defineProperty(ctor.prototype, key, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
626 value: properties[key],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
627 enumerable: false
89592faa2875 Uploaded
chrisb
parents:
diff changeset
628 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
629 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
630 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
631 d3.map = function(object, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
632 var map = new d3_Map();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
633 if (object instanceof d3_Map) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
634 object.forEach(function(key, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
635 map.set(key, value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
636 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
637 } else if (Array.isArray(object)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
638 var i = -1, n = object.length, o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
639 if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
640 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
641 for (var key in object) map.set(key, object[key]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
642 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
643 return map;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
644 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
645 function d3_Map() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
646 this._ = Object.create(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
647 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
648 var d3_map_proto = "__proto__", d3_map_zero = "\x00";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
649 d3_class(d3_Map, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
650 has: d3_map_has,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
651 get: function(key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
652 return this._[d3_map_escape(key)];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
653 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
654 set: function(key, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
655 return this._[d3_map_escape(key)] = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
656 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
657 remove: d3_map_remove,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
658 keys: d3_map_keys,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
659 values: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
660 var values = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
661 for (var key in this._) values.push(this._[key]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
662 return values;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
663 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
664 entries: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
665 var entries = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
666 for (var key in this._) entries.push({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
667 key: d3_map_unescape(key),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
668 value: this._[key]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
669 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
670 return entries;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
671 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
672 size: d3_map_size,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
673 empty: d3_map_empty,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
674 forEach: function(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
675 for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
676 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
677 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
678 function d3_map_escape(key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
679 return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
680 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
681 function d3_map_unescape(key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
682 return (key += "")[0] === d3_map_zero ? key.slice(1) : key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
683 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
684 function d3_map_has(key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
685 return d3_map_escape(key) in this._;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
686 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
687 function d3_map_remove(key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
688 return (key = d3_map_escape(key)) in this._ && delete this._[key];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
689 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
690 function d3_map_keys() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
691 var keys = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
692 for (var key in this._) keys.push(d3_map_unescape(key));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
693 return keys;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
694 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
695 function d3_map_size() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
696 var size = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
697 for (var key in this._) ++size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
698 return size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
699 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
700 function d3_map_empty() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
701 for (var key in this._) return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
702 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
703 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
704 d3.nest = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
705 var nest = {}, keys = [], sortKeys = [], sortValues, rollup;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
706 function map(mapType, array, depth) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
707 if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
708 var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
709 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
710 if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
711 values.push(object);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
712 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
713 valuesByKey.set(keyValue, [ object ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
714 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
715 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
716 if (mapType) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
717 object = mapType();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
718 setter = function(keyValue, values) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
719 object.set(keyValue, map(mapType, values, depth));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
720 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
721 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
722 object = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
723 setter = function(keyValue, values) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
724 object[keyValue] = map(mapType, values, depth);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
725 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
726 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
727 valuesByKey.forEach(setter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
728 return object;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
729 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
730 function entries(map, depth) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
731 if (depth >= keys.length) return map;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
732 var array = [], sortKey = sortKeys[depth++];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
733 map.forEach(function(key, keyMap) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
734 array.push({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
735 key: key,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
736 values: entries(keyMap, depth)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
737 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
738 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
739 return sortKey ? array.sort(function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
740 return sortKey(a.key, b.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
741 }) : array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
742 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
743 nest.map = function(array, mapType) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
744 return map(mapType, array, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
745 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
746 nest.entries = function(array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
747 return entries(map(d3.map, array, 0), 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
748 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
749 nest.key = function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
750 keys.push(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
751 return nest;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
752 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
753 nest.sortKeys = function(order) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
754 sortKeys[keys.length - 1] = order;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
755 return nest;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
756 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
757 nest.sortValues = function(order) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
758 sortValues = order;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
759 return nest;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
760 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
761 nest.rollup = function(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
762 rollup = f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
763 return nest;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
764 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
765 return nest;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
766 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
767 d3.set = function(array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
768 var set = new d3_Set();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
769 if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
770 return set;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
771 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
772 function d3_Set() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
773 this._ = Object.create(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
774 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
775 d3_class(d3_Set, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
776 has: d3_map_has,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
777 add: function(key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
778 this._[d3_map_escape(key += "")] = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
779 return key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
780 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
781 remove: d3_map_remove,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
782 values: d3_map_keys,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
783 size: d3_map_size,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
784 empty: d3_map_empty,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
785 forEach: function(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
786 for (var key in this._) f.call(this, d3_map_unescape(key));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
787 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
788 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
789 d3.behavior = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
790 d3.rebind = function(target, source) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
791 var i = 1, n = arguments.length, method;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
792 while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
793 return target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
794 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
795 function d3_rebind(target, source, method) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
796 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
797 var value = method.apply(source, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
798 return value === source ? target : value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
799 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
800 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
801 function d3_vendorSymbol(object, name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
802 if (name in object) return name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
803 name = name.charAt(0).toUpperCase() + name.slice(1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
804 for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
805 var prefixName = d3_vendorPrefixes[i] + name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
806 if (prefixName in object) return prefixName;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
807 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
808 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
809 var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
810 function d3_noop() {}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
811 d3.dispatch = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
812 var dispatch = new d3_dispatch(), i = -1, n = arguments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
813 while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
814 return dispatch;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
815 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
816 function d3_dispatch() {}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
817 d3_dispatch.prototype.on = function(type, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
818 var i = type.indexOf("."), name = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
819 if (i >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
820 name = type.slice(i + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
821 type = type.slice(0, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
822 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
823 if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
824 if (arguments.length === 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
825 if (listener == null) for (type in this) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
826 if (this.hasOwnProperty(type)) this[type].on(name, null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
827 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
828 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
829 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
830 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
831 function d3_dispatch_event(dispatch) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
832 var listeners = [], listenerByName = new d3_Map();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
833 function event() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
834 var z = listeners, i = -1, n = z.length, l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
835 while (++i < n) if (l = z[i].on) l.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
836 return dispatch;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
837 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
838 event.on = function(name, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
839 var l = listenerByName.get(name), i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
840 if (arguments.length < 2) return l && l.on;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
841 if (l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
842 l.on = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
843 listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
844 listenerByName.remove(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
845 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
846 if (listener) listeners.push(listenerByName.set(name, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
847 on: listener
89592faa2875 Uploaded
chrisb
parents:
diff changeset
848 }));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
849 return dispatch;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
850 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
851 return event;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
852 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
853 d3.event = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
854 function d3_eventPreventDefault() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
855 d3.event.preventDefault();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
856 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
857 function d3_eventSource() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
858 var e = d3.event, s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
859 while (s = e.sourceEvent) e = s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
860 return e;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
861 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
862 function d3_eventDispatch(target) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
863 var dispatch = new d3_dispatch(), i = 0, n = arguments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
864 while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
865 dispatch.of = function(thiz, argumentz) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
866 return function(e1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
867 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
868 var e0 = e1.sourceEvent = d3.event;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
869 e1.target = target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
870 d3.event = e1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
871 dispatch[e1.type].apply(thiz, argumentz);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
872 } finally {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
873 d3.event = e0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
874 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
875 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
876 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
877 return dispatch;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
878 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
879 d3.requote = function(s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
880 return s.replace(d3_requote_re, "\\$&");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
881 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
882 var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
883 var d3_subclass = {}.__proto__ ? function(object, prototype) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
884 object.__proto__ = prototype;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
885 } : function(object, prototype) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
886 for (var property in prototype) object[property] = prototype[property];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
887 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
888 function d3_selection(groups) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
889 d3_subclass(groups, d3_selectionPrototype);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
890 return groups;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
891 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
892 var d3_select = function(s, n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
893 return n.querySelector(s);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
894 }, d3_selectAll = function(s, n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
895 return n.querySelectorAll(s);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
896 }, d3_selectMatcher = d3_documentElement.matches || d3_documentElement[d3_vendorSymbol(d3_documentElement, "matchesSelector")], d3_selectMatches = function(n, s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
897 return d3_selectMatcher.call(n, s);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
898 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
899 if (typeof Sizzle === "function") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
900 d3_select = function(s, n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
901 return Sizzle(s, n)[0] || null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
902 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
903 d3_selectAll = Sizzle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
904 d3_selectMatches = Sizzle.matchesSelector;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
905 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
906 d3.selection = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
907 return d3_selectionRoot;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
908 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
909 var d3_selectionPrototype = d3.selection.prototype = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
910 d3_selectionPrototype.select = function(selector) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
911 var subgroups = [], subgroup, subnode, group, node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
912 selector = d3_selection_selector(selector);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
913 for (var j = -1, m = this.length; ++j < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
914 subgroups.push(subgroup = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
915 subgroup.parentNode = (group = this[j]).parentNode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
916 for (var i = -1, n = group.length; ++i < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
917 if (node = group[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
918 subgroup.push(subnode = selector.call(node, node.__data__, i, j));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
919 if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
920 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
921 subgroup.push(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
922 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
923 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
924 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
925 return d3_selection(subgroups);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
926 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
927 function d3_selection_selector(selector) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
928 return typeof selector === "function" ? selector : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
929 return d3_select(selector, this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
930 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
931 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
932 d3_selectionPrototype.selectAll = function(selector) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
933 var subgroups = [], subgroup, node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
934 selector = d3_selection_selectorAll(selector);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
935 for (var j = -1, m = this.length; ++j < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
936 for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
937 if (node = group[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
938 subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
939 subgroup.parentNode = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
940 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
941 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
942 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
943 return d3_selection(subgroups);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
944 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
945 function d3_selection_selectorAll(selector) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
946 return typeof selector === "function" ? selector : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
947 return d3_selectAll(selector, this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
948 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
949 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
950 var d3_nsPrefix = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
951 svg: "http://www.w3.org/2000/svg",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
952 xhtml: "http://www.w3.org/1999/xhtml",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
953 xlink: "http://www.w3.org/1999/xlink",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
954 xml: "http://www.w3.org/XML/1998/namespace",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
955 xmlns: "http://www.w3.org/2000/xmlns/"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
956 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
957 d3.ns = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
958 prefix: d3_nsPrefix,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
959 qualify: function(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
960 var i = name.indexOf(":"), prefix = name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
961 if (i >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
962 prefix = name.slice(0, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
963 name = name.slice(i + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
964 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
965 return d3_nsPrefix.hasOwnProperty(prefix) ? {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
966 space: d3_nsPrefix[prefix],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
967 local: name
89592faa2875 Uploaded
chrisb
parents:
diff changeset
968 } : name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
969 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
970 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
971 d3_selectionPrototype.attr = function(name, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
972 if (arguments.length < 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
973 if (typeof name === "string") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
974 var node = this.node();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
975 name = d3.ns.qualify(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
976 return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
977 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
978 for (value in name) this.each(d3_selection_attr(value, name[value]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
979 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
980 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
981 return this.each(d3_selection_attr(name, value));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
982 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
983 function d3_selection_attr(name, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
984 name = d3.ns.qualify(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
985 function attrNull() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
986 this.removeAttribute(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
987 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
988 function attrNullNS() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
989 this.removeAttributeNS(name.space, name.local);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
990 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
991 function attrConstant() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
992 this.setAttribute(name, value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
993 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
994 function attrConstantNS() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
995 this.setAttributeNS(name.space, name.local, value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
996 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
997 function attrFunction() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
998 var x = value.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
999 if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1000 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1001 function attrFunctionNS() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1002 var x = value.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1003 if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1004 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1005 return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1006 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1007 function d3_collapse(s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1008 return s.trim().replace(/\s+/g, " ");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1009 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1010 d3_selectionPrototype.classed = function(name, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1011 if (arguments.length < 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1012 if (typeof name === "string") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1013 var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1014 if (value = node.classList) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1015 while (++i < n) if (!value.contains(name[i])) return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1016 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1017 value = node.getAttribute("class");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1018 while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1019 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1020 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1021 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1022 for (value in name) this.each(d3_selection_classed(value, name[value]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1023 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1024 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1025 return this.each(d3_selection_classed(name, value));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1026 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1027 function d3_selection_classedRe(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1028 return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1029 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1030 function d3_selection_classes(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1031 return (name + "").trim().split(/^|\s+/);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1032 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1033 function d3_selection_classed(name, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1034 name = d3_selection_classes(name).map(d3_selection_classedName);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1035 var n = name.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1036 function classedConstant() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1037 var i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1038 while (++i < n) name[i](this, value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1039 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1040 function classedFunction() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1041 var i = -1, x = value.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1042 while (++i < n) name[i](this, x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1043 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1044 return typeof value === "function" ? classedFunction : classedConstant;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1045 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1046 function d3_selection_classedName(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1047 var re = d3_selection_classedRe(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1048 return function(node, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1049 if (c = node.classList) return value ? c.add(name) : c.remove(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1050 var c = node.getAttribute("class") || "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1051 if (value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1052 re.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1053 if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1054 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1055 node.setAttribute("class", d3_collapse(c.replace(re, " ")));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1056 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1057 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1058 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1059 d3_selectionPrototype.style = function(name, value, priority) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1060 var n = arguments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1061 if (n < 3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1062 if (typeof name !== "string") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1063 if (n < 2) value = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1064 for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1065 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1066 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1067 if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1068 priority = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1069 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1070 return this.each(d3_selection_style(name, value, priority));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1071 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1072 function d3_selection_style(name, value, priority) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1073 function styleNull() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1074 this.style.removeProperty(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1075 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1076 function styleConstant() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1077 this.style.setProperty(name, value, priority);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1078 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1079 function styleFunction() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1080 var x = value.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1081 if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1082 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1083 return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1084 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1085 d3_selectionPrototype.property = function(name, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1086 if (arguments.length < 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1087 if (typeof name === "string") return this.node()[name];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1088 for (value in name) this.each(d3_selection_property(value, name[value]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1089 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1090 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1091 return this.each(d3_selection_property(name, value));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1092 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1093 function d3_selection_property(name, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1094 function propertyNull() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1095 delete this[name];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1096 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1097 function propertyConstant() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1098 this[name] = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1099 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1100 function propertyFunction() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1101 var x = value.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1102 if (x == null) delete this[name]; else this[name] = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1103 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1104 return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1105 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1106 d3_selectionPrototype.text = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1107 return arguments.length ? this.each(typeof value === "function" ? function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1108 var v = value.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1109 this.textContent = v == null ? "" : v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1110 } : value == null ? function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1111 this.textContent = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1112 } : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1113 this.textContent = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1114 }) : this.node().textContent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1115 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1116 d3_selectionPrototype.html = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1117 return arguments.length ? this.each(typeof value === "function" ? function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1118 var v = value.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1119 this.innerHTML = v == null ? "" : v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1120 } : value == null ? function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1121 this.innerHTML = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1122 } : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1123 this.innerHTML = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1124 }) : this.node().innerHTML;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1125 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1126 d3_selectionPrototype.append = function(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1127 name = d3_selection_creator(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1128 return this.select(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1129 return this.appendChild(name.apply(this, arguments));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1130 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1131 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1132 function d3_selection_creator(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1133 return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1134 return this.ownerDocument.createElementNS(name.space, name.local);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1135 } : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1136 return this.ownerDocument.createElementNS(this.namespaceURI, name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1137 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1138 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1139 d3_selectionPrototype.insert = function(name, before) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1140 name = d3_selection_creator(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1141 before = d3_selection_selector(before);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1142 return this.select(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1143 return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1144 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1145 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1146 d3_selectionPrototype.remove = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1147 return this.each(d3_selectionRemove);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1148 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1149 function d3_selectionRemove() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1150 var parent = this.parentNode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1151 if (parent) parent.removeChild(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1152 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1153 d3_selectionPrototype.data = function(value, key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1154 var i = -1, n = this.length, group, node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1155 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1156 value = new Array(n = (group = this[0]).length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1157 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1158 if (node = group[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1159 value[i] = node.__data__;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1160 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1161 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1162 return value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1163 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1164 function bind(group, groupData) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1165 var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1166 if (key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1167 var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1168 for (i = -1; ++i < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1169 if (nodeByKeyValue.has(keyValue = key.call(node = group[i], node.__data__, i))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1170 exitNodes[i] = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1171 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1172 nodeByKeyValue.set(keyValue, node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1173 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1174 keyValues[i] = keyValue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1175 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1176 for (i = -1; ++i < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1177 if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1178 enterNodes[i] = d3_selection_dataNode(nodeData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1179 } else if (node !== true) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1180 updateNodes[i] = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1181 node.__data__ = nodeData;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1182 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1183 nodeByKeyValue.set(keyValue, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1184 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1185 for (i = -1; ++i < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1186 if (nodeByKeyValue.get(keyValues[i]) !== true) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1187 exitNodes[i] = group[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1188 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1189 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1190 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1191 for (i = -1; ++i < n0; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1192 node = group[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1193 nodeData = groupData[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1194 if (node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1195 node.__data__ = nodeData;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1196 updateNodes[i] = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1197 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1198 enterNodes[i] = d3_selection_dataNode(nodeData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1199 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1200 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1201 for (;i < m; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1202 enterNodes[i] = d3_selection_dataNode(groupData[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1203 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1204 for (;i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1205 exitNodes[i] = group[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1206 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1207 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1208 enterNodes.update = updateNodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1209 enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1210 enter.push(enterNodes);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1211 update.push(updateNodes);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1212 exit.push(exitNodes);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1213 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1214 var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1215 if (typeof value === "function") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1216 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1217 bind(group = this[i], value.call(group, group.parentNode.__data__, i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1218 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1219 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1220 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1221 bind(group = this[i], value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1222 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1223 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1224 update.enter = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1225 return enter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1226 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1227 update.exit = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1228 return exit;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1229 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1230 return update;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1231 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1232 function d3_selection_dataNode(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1233 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1234 __data__: data
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1235 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1236 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1237 d3_selectionPrototype.datum = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1238 return arguments.length ? this.property("__data__", value) : this.property("__data__");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1239 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1240 d3_selectionPrototype.filter = function(filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1241 var subgroups = [], subgroup, group, node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1242 if (typeof filter !== "function") filter = d3_selection_filter(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1243 for (var j = 0, m = this.length; j < m; j++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1244 subgroups.push(subgroup = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1245 subgroup.parentNode = (group = this[j]).parentNode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1246 for (var i = 0, n = group.length; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1247 if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1248 subgroup.push(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1249 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1250 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1251 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1252 return d3_selection(subgroups);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1253 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1254 function d3_selection_filter(selector) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1255 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1256 return d3_selectMatches(this, selector);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1257 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1258 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1259 d3_selectionPrototype.order = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1260 for (var j = -1, m = this.length; ++j < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1261 for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1262 if (node = group[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1263 if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1264 next = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1265 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1266 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1267 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1268 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1269 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1270 d3_selectionPrototype.sort = function(comparator) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1271 comparator = d3_selection_sortComparator.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1272 for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1273 return this.order();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1274 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1275 function d3_selection_sortComparator(comparator) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1276 if (!arguments.length) comparator = d3_ascending;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1277 return function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1278 return a && b ? comparator(a.__data__, b.__data__) : !a - !b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1279 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1280 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1281 d3_selectionPrototype.each = function(callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1282 return d3_selection_each(this, function(node, i, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1283 callback.call(node, node.__data__, i, j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1284 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1285 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1286 function d3_selection_each(groups, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1287 for (var j = 0, m = groups.length; j < m; j++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1288 for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1289 if (node = group[i]) callback(node, i, j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1290 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1291 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1292 return groups;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1293 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1294 d3_selectionPrototype.call = function(callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1295 var args = d3_array(arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1296 callback.apply(args[0] = this, args);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1297 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1298 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1299 d3_selectionPrototype.empty = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1300 return !this.node();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1301 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1302 d3_selectionPrototype.node = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1303 for (var j = 0, m = this.length; j < m; j++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1304 for (var group = this[j], i = 0, n = group.length; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1305 var node = group[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1306 if (node) return node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1307 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1308 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1309 return null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1310 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1311 d3_selectionPrototype.size = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1312 var n = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1313 d3_selection_each(this, function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1314 ++n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1315 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1316 return n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1317 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1318 function d3_selection_enter(selection) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1319 d3_subclass(selection, d3_selection_enterPrototype);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1320 return selection;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1321 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1322 var d3_selection_enterPrototype = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1323 d3.selection.enter = d3_selection_enter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1324 d3.selection.enter.prototype = d3_selection_enterPrototype;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1325 d3_selection_enterPrototype.append = d3_selectionPrototype.append;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1326 d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1327 d3_selection_enterPrototype.node = d3_selectionPrototype.node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1328 d3_selection_enterPrototype.call = d3_selectionPrototype.call;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1329 d3_selection_enterPrototype.size = d3_selectionPrototype.size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1330 d3_selection_enterPrototype.select = function(selector) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1331 var subgroups = [], subgroup, subnode, upgroup, group, node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1332 for (var j = -1, m = this.length; ++j < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1333 upgroup = (group = this[j]).update;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1334 subgroups.push(subgroup = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1335 subgroup.parentNode = group.parentNode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1336 for (var i = -1, n = group.length; ++i < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1337 if (node = group[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1338 subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1339 subnode.__data__ = node.__data__;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1340 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1341 subgroup.push(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1342 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1343 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1344 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1345 return d3_selection(subgroups);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1346 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1347 d3_selection_enterPrototype.insert = function(name, before) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1348 if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1349 return d3_selectionPrototype.insert.call(this, name, before);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1350 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1351 function d3_selection_enterInsertBefore(enter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1352 var i0, j0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1353 return function(d, i, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1354 var group = enter[j].update, n = group.length, node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1355 if (j != j0) j0 = j, i0 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1356 if (i >= i0) i0 = i + 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1357 while (!(node = group[i0]) && ++i0 < n) ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1358 return node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1359 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1360 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1361 d3.select = function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1362 var group = [ typeof node === "string" ? d3_select(node, d3_document) : node ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1363 group.parentNode = d3_documentElement;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1364 return d3_selection([ group ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1365 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1366 d3.selectAll = function(nodes) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1367 var group = d3_array(typeof nodes === "string" ? d3_selectAll(nodes, d3_document) : nodes);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1368 group.parentNode = d3_documentElement;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1369 return d3_selection([ group ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1370 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1371 var d3_selectionRoot = d3.select(d3_documentElement);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1372 d3_selectionPrototype.on = function(type, listener, capture) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1373 var n = arguments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1374 if (n < 3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1375 if (typeof type !== "string") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1376 if (n < 2) listener = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1377 for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1378 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1379 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1380 if (n < 2) return (n = this.node()["__on" + type]) && n._;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1381 capture = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1382 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1383 return this.each(d3_selection_on(type, listener, capture));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1384 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1385 function d3_selection_on(type, listener, capture) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1386 var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1387 if (i > 0) type = type.slice(0, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1388 var filter = d3_selection_onFilters.get(type);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1389 if (filter) type = filter, wrap = d3_selection_onFilter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1390 function onRemove() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1391 var l = this[name];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1392 if (l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1393 this.removeEventListener(type, l, l.$);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1394 delete this[name];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1395 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1396 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1397 function onAdd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1398 var l = wrap(listener, d3_array(arguments));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1399 onRemove.call(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1400 this.addEventListener(type, this[name] = l, l.$ = capture);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1401 l._ = listener;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1402 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1403 function removeAll() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1404 var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1405 for (var name in this) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1406 if (match = name.match(re)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1407 var l = this[name];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1408 this.removeEventListener(match[1], l, l.$);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1409 delete this[name];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1410 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1411 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1412 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1413 return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1414 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1415 var d3_selection_onFilters = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1416 mouseenter: "mouseover",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1417 mouseleave: "mouseout"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1418 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1419 d3_selection_onFilters.forEach(function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1420 if ("on" + k in d3_document) d3_selection_onFilters.remove(k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1421 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1422 function d3_selection_onListener(listener, argumentz) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1423 return function(e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1424 var o = d3.event;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1425 d3.event = e;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1426 argumentz[0] = this.__data__;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1427 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1428 listener.apply(this, argumentz);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1429 } finally {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1430 d3.event = o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1431 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1432 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1433 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1434 function d3_selection_onFilter(listener, argumentz) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1435 var l = d3_selection_onListener(listener, argumentz);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1436 return function(e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1437 var target = this, related = e.relatedTarget;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1438 if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1439 l.call(target, e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1440 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1441 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1442 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1443 var d3_event_dragSelect = "onselectstart" in d3_document ? null : d3_vendorSymbol(d3_documentElement.style, "userSelect"), d3_event_dragId = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1444 function d3_event_dragSuppress() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1445 var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1446 if (d3_event_dragSelect) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1447 var style = d3_documentElement.style, select = style[d3_event_dragSelect];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1448 style[d3_event_dragSelect] = "none";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1449 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1450 return function(suppressClick) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1451 w.on(name, null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1452 if (d3_event_dragSelect) style[d3_event_dragSelect] = select;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1453 if (suppressClick) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1454 var off = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1455 w.on(click, null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1456 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1457 w.on(click, function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1458 d3_eventPreventDefault();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1459 off();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1460 }, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1461 setTimeout(off, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1462 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1463 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1464 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1465 d3.mouse = function(container) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1466 return d3_mousePoint(container, d3_eventSource());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1467 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1468 var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1469 function d3_mousePoint(container, e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1470 if (e.changedTouches) e = e.changedTouches[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1471 var svg = container.ownerSVGElement || container;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1472 if (svg.createSVGPoint) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1473 var point = svg.createSVGPoint();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1474 if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1475 svg = d3.select("body").append("svg").style({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1476 position: "absolute",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1477 top: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1478 left: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1479 margin: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1480 padding: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1481 border: "none"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1482 }, "important");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1483 var ctm = svg[0][0].getScreenCTM();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1484 d3_mouse_bug44083 = !(ctm.f || ctm.e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1485 svg.remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1486 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1487 if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1488 point.y = e.clientY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1489 point = point.matrixTransform(container.getScreenCTM().inverse());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1490 return [ point.x, point.y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1491 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1492 var rect = container.getBoundingClientRect();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1493 return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1494 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1495 d3.touch = function(container, touches, identifier) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1496 if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1497 if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1498 if ((touch = touches[i]).identifier === identifier) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1499 return d3_mousePoint(container, touch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1500 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1501 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1502 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1503 d3.behavior.drag = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1504 var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_behavior_dragMouseSubject, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_behavior_dragTouchSubject, "touchmove", "touchend");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1505 function drag() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1506 this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1507 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1508 function dragstart(id, position, subject, move, end) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1509 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1510 var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject()).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(), position0 = position(parent, dragId);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1511 if (origin) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1512 dragOffset = origin.apply(that, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1513 dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1514 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1515 dragOffset = [ 0, 0 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1516 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1517 dispatch({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1518 type: "dragstart"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1519 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1520 function moved() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1521 var position1 = position(parent, dragId), dx, dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1522 if (!position1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1523 dx = position1[0] - position0[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1524 dy = position1[1] - position0[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1525 dragged |= dx | dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1526 position0 = position1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1527 dispatch({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1528 type: "drag",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1529 x: position1[0] + dragOffset[0],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1530 y: position1[1] + dragOffset[1],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1531 dx: dx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1532 dy: dy
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1533 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1534 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1535 function ended() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1536 if (!position(parent, dragId)) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1537 dragSubject.on(move + dragName, null).on(end + dragName, null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1538 dragRestore(dragged && d3.event.target === target);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1539 dispatch({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1540 type: "dragend"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1541 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1542 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1543 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1544 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1545 drag.origin = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1546 if (!arguments.length) return origin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1547 origin = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1548 return drag;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1549 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1550 return d3.rebind(drag, event, "on");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1551 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1552 function d3_behavior_dragTouchId() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1553 return d3.event.changedTouches[0].identifier;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1554 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1555 function d3_behavior_dragTouchSubject() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1556 return d3.event.target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1557 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1558 function d3_behavior_dragMouseSubject() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1559 return d3_window;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1560 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1561 d3.touches = function(container, touches) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1562 if (arguments.length < 2) touches = d3_eventSource().touches;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1563 return touches ? d3_array(touches).map(function(touch) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1564 var point = d3_mousePoint(container, touch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1565 point.identifier = touch.identifier;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1566 return point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1567 }) : [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1568 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1569 var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1570 function d3_sgn(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1571 return x > 0 ? 1 : x < 0 ? -1 : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1572 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1573 function d3_cross2d(a, b, c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1574 return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1575 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1576 function d3_acos(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1577 return x > 1 ? 0 : x < -1 ? π : Math.acos(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1578 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1579 function d3_asin(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1580 return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1581 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1582 function d3_sinh(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1583 return ((x = Math.exp(x)) - 1 / x) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1584 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1585 function d3_cosh(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1586 return ((x = Math.exp(x)) + 1 / x) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1587 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1588 function d3_tanh(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1589 return ((x = Math.exp(2 * x)) - 1) / (x + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1590 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1591 function d3_haversin(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1592 return (x = Math.sin(x / 2)) * x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1593 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1594 var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1595 d3.interpolateZoom = function(p0, p1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1596 var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1597 var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1598 function interpolate(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1599 var s = t * S;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1600 if (dr) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1601 var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1602 return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1603 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1604 return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1605 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1606 interpolate.duration = S * 1e3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1607 return interpolate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1608 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1609 d3.behavior.zoom = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1610 var view = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1611 x: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1612 y: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1613 k: 1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1614 }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1615 function zoom(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1616 g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1617 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1618 zoom.event = function(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1619 g.each(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1620 var dispatch = event.of(this, arguments), view1 = view;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1621 if (d3_transitionInheritId) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1622 d3.select(this).transition().each("start.zoom", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1623 view = this.__chart__ || {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1624 x: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1625 y: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1626 k: 1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1627 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1628 zoomstarted(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1629 }).tween("zoom:zoom", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1630 var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1631 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1632 var l = i(t), k = dx / l[2];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1633 this.__chart__ = view = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1634 x: cx - l[0] * k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1635 y: cy - l[1] * k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1636 k: k
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1637 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1638 zoomed(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1639 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1640 }).each("interrupt.zoom", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1641 zoomended(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1642 }).each("end.zoom", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1643 zoomended(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1644 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1645 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1646 this.__chart__ = view;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1647 zoomstarted(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1648 zoomed(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1649 zoomended(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1650 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1651 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1652 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1653 zoom.translate = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1654 if (!arguments.length) return [ view.x, view.y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1655 view = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1656 x: +_[0],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1657 y: +_[1],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1658 k: view.k
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1659 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1660 rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1661 return zoom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1662 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1663 zoom.scale = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1664 if (!arguments.length) return view.k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1665 view = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1666 x: view.x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1667 y: view.y,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1668 k: +_
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1669 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1670 rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1671 return zoom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1672 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1673 zoom.scaleExtent = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1674 if (!arguments.length) return scaleExtent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1675 scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1676 return zoom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1677 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1678 zoom.center = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1679 if (!arguments.length) return center;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1680 center = _ && [ +_[0], +_[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1681 return zoom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1682 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1683 zoom.size = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1684 if (!arguments.length) return size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1685 size = _ && [ +_[0], +_[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1686 return zoom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1687 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1688 zoom.duration = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1689 if (!arguments.length) return duration;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1690 duration = +_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1691 return zoom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1692 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1693 zoom.x = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1694 if (!arguments.length) return x1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1695 x1 = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1696 x0 = z.copy();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1697 view = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1698 x: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1699 y: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1700 k: 1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1701 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1702 return zoom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1703 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1704 zoom.y = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1705 if (!arguments.length) return y1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1706 y1 = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1707 y0 = z.copy();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1708 view = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1709 x: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1710 y: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1711 k: 1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1712 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1713 return zoom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1714 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1715 function location(p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1716 return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1717 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1718 function point(l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1719 return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1720 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1721 function scaleTo(s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1722 view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1723 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1724 function translateTo(p, l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1725 l = point(l);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1726 view.x += p[0] - l[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1727 view.y += p[1] - l[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1728 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1729 function zoomTo(that, p, l, k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1730 that.__chart__ = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1731 x: view.x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1732 y: view.y,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1733 k: view.k
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1734 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1735 scaleTo(Math.pow(2, k));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1736 translateTo(center0 = p, l);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1737 that = d3.select(that);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1738 if (duration > 0) that = that.transition().duration(duration);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1739 that.call(zoom.event);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1740 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1741 function rescale() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1742 if (x1) x1.domain(x0.range().map(function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1743 return (x - view.x) / view.k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1744 }).map(x0.invert));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1745 if (y1) y1.domain(y0.range().map(function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1746 return (y - view.y) / view.k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1747 }).map(y0.invert));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1748 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1749 function zoomstarted(dispatch) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1750 if (!zooming++) dispatch({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1751 type: "zoomstart"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1752 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1753 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1754 function zoomed(dispatch) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1755 rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1756 dispatch({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1757 type: "zoom",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1758 scale: view.k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1759 translate: [ view.x, view.y ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1760 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1761 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1762 function zoomended(dispatch) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1763 if (!--zooming) dispatch({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1764 type: "zoomend"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1765 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1766 center0 = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1767 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1768 function mousedowned() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1769 var that = this, target = d3.event.target, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1770 d3_selection_interrupt.call(that);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1771 zoomstarted(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1772 function moved() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1773 dragged = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1774 translateTo(d3.mouse(that), location0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1775 zoomed(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1776 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1777 function ended() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1778 subject.on(mousemove, null).on(mouseup, null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1779 dragRestore(dragged && d3.event.target === target);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1780 zoomended(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1781 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1782 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1783 function touchstarted() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1784 var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1785 started();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1786 zoomstarted(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1787 subject.on(mousedown, null).on(touchstart, started);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1788 function relocate() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1789 var touches = d3.touches(that);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1790 scale0 = view.k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1791 touches.forEach(function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1792 if (t.identifier in locations0) locations0[t.identifier] = location(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1793 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1794 return touches;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1795 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1796 function started() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1797 var target = d3.event.target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1798 d3.select(target).on(touchmove, moved).on(touchend, ended);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1799 targets.push(target);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1800 var changed = d3.event.changedTouches;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1801 for (var i = 0, n = changed.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1802 locations0[changed[i].identifier] = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1803 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1804 var touches = relocate(), now = Date.now();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1805 if (touches.length === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1806 if (now - touchtime < 500) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1807 var p = touches[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1808 zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1809 d3_eventPreventDefault();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1810 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1811 touchtime = now;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1812 } else if (touches.length > 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1813 var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1814 distance0 = dx * dx + dy * dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1815 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1816 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1817 function moved() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1818 var touches = d3.touches(that), p0, l0, p1, l1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1819 d3_selection_interrupt.call(that);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1820 for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1821 p1 = touches[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1822 if (l1 = locations0[p1.identifier]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1823 if (l0) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1824 p0 = p1, l0 = l1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1825 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1826 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1827 if (l1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1828 var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1829 p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1830 l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1831 scaleTo(scale1 * scale0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1832 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1833 touchtime = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1834 translateTo(p0, l0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1835 zoomed(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1836 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1837 function ended() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1838 if (d3.event.touches.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1839 var changed = d3.event.changedTouches;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1840 for (var i = 0, n = changed.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1841 delete locations0[changed[i].identifier];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1842 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1843 for (var identifier in locations0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1844 return void relocate();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1845 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1846 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1847 d3.selectAll(targets).on(zoomName, null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1848 subject.on(mousedown, mousedowned).on(touchstart, touchstarted);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1849 dragRestore();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1850 zoomended(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1851 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1852 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1853 function mousewheeled() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1854 var dispatch = event.of(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1855 if (mousewheelTimer) clearTimeout(mousewheelTimer); else translate0 = location(center0 = center || d3.mouse(this)),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1856 d3_selection_interrupt.call(this), zoomstarted(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1857 mousewheelTimer = setTimeout(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1858 mousewheelTimer = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1859 zoomended(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1860 }, 50);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1861 d3_eventPreventDefault();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1862 scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1863 translateTo(center0, translate0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1864 zoomed(dispatch);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1865 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1866 function dblclicked() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1867 var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1868 zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1869 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1870 return d3.rebind(zoom, event, "on");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1871 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1872 var d3_behavior_zoomInfinity = [ 0, Infinity ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1873 var d3_behavior_zoomDelta, d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1874 return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1875 }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1876 return d3.event.wheelDelta;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1877 }, "mousewheel") : (d3_behavior_zoomDelta = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1878 return -d3.event.detail;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1879 }, "MozMousePixelScroll");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1880 d3.color = d3_color;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1881 function d3_color() {}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1882 d3_color.prototype.toString = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1883 return this.rgb() + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1884 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1885 d3.hsl = d3_hsl;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1886 function d3_hsl(h, s, l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1887 return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1888 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1889 var d3_hslPrototype = d3_hsl.prototype = new d3_color();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1890 d3_hslPrototype.brighter = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1891 k = Math.pow(.7, arguments.length ? k : 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1892 return new d3_hsl(this.h, this.s, this.l / k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1893 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1894 d3_hslPrototype.darker = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1895 k = Math.pow(.7, arguments.length ? k : 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1896 return new d3_hsl(this.h, this.s, k * this.l);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1897 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1898 d3_hslPrototype.rgb = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1899 return d3_hsl_rgb(this.h, this.s, this.l);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1900 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1901 function d3_hsl_rgb(h, s, l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1902 var m1, m2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1903 h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1904 s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1905 l = l < 0 ? 0 : l > 1 ? 1 : l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1906 m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1907 m1 = 2 * l - m2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1908 function v(h) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1909 if (h > 360) h -= 360; else if (h < 0) h += 360;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1910 if (h < 60) return m1 + (m2 - m1) * h / 60;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1911 if (h < 180) return m2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1912 if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1913 return m1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1914 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1915 function vv(h) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1916 return Math.round(v(h) * 255);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1917 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1918 return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1919 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1920 d3.hcl = d3_hcl;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1921 function d3_hcl(h, c, l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1922 return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1923 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1924 var d3_hclPrototype = d3_hcl.prototype = new d3_color();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1925 d3_hclPrototype.brighter = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1926 return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1927 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1928 d3_hclPrototype.darker = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1929 return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1930 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1931 d3_hclPrototype.rgb = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1932 return d3_hcl_lab(this.h, this.c, this.l).rgb();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1933 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1934 function d3_hcl_lab(h, c, l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1935 if (isNaN(h)) h = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1936 if (isNaN(c)) c = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1937 return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1938 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1939 d3.lab = d3_lab;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1940 function d3_lab(l, a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1941 return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1942 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1943 var d3_lab_K = 18;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1944 var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1945 var d3_labPrototype = d3_lab.prototype = new d3_color();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1946 d3_labPrototype.brighter = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1947 return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1948 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1949 d3_labPrototype.darker = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1950 return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1951 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1952 d3_labPrototype.rgb = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1953 return d3_lab_rgb(this.l, this.a, this.b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1954 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1955 function d3_lab_rgb(l, a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1956 var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1957 x = d3_lab_xyz(x) * d3_lab_X;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1958 y = d3_lab_xyz(y) * d3_lab_Y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1959 z = d3_lab_xyz(z) * d3_lab_Z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1960 return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1961 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1962 function d3_lab_hcl(l, a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1963 return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1964 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1965 function d3_lab_xyz(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1966 return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1967 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1968 function d3_xyz_lab(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1969 return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1970 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1971 function d3_xyz_rgb(r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1972 return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1973 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1974 d3.rgb = d3_rgb;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1975 function d3_rgb(r, g, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1976 return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1977 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1978 function d3_rgbNumber(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1979 return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1980 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1981 function d3_rgbString(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1982 return d3_rgbNumber(value) + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1983 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1984 var d3_rgbPrototype = d3_rgb.prototype = new d3_color();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1985 d3_rgbPrototype.brighter = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1986 k = Math.pow(.7, arguments.length ? k : 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1987 var r = this.r, g = this.g, b = this.b, i = 30;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1988 if (!r && !g && !b) return new d3_rgb(i, i, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1989 if (r && r < i) r = i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1990 if (g && g < i) g = i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1991 if (b && b < i) b = i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1992 return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1993 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1994 d3_rgbPrototype.darker = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1995 k = Math.pow(.7, arguments.length ? k : 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1996 return new d3_rgb(k * this.r, k * this.g, k * this.b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1997 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1998 d3_rgbPrototype.hsl = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
1999 return d3_rgb_hsl(this.r, this.g, this.b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2000 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2001 d3_rgbPrototype.toString = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2002 return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2003 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2004 function d3_rgb_hex(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2005 return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2006 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2007 function d3_rgb_parse(format, rgb, hsl) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2008 var r = 0, g = 0, b = 0, m1, m2, color;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2009 m1 = /([a-z]+)\((.*)\)/i.exec(format);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2010 if (m1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2011 m2 = m1[2].split(",");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2012 switch (m1[1]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2013 case "hsl":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2014 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2015 return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2016 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2017
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2018 case "rgb":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2019 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2020 return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2021 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2022 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2023 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2024 if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2025 if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2026 if (format.length === 4) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2027 r = (color & 3840) >> 4;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2028 r = r >> 4 | r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2029 g = color & 240;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2030 g = g >> 4 | g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2031 b = color & 15;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2032 b = b << 4 | b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2033 } else if (format.length === 7) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2034 r = (color & 16711680) >> 16;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2035 g = (color & 65280) >> 8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2036 b = color & 255;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2037 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2038 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2039 return rgb(r, g, b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2040 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2041 function d3_rgb_hsl(r, g, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2042 var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2043 if (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2044 s = l < .5 ? d / (max + min) : d / (2 - max - min);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2045 if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2046 h *= 60;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2047 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2048 h = NaN;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2049 s = l > 0 && l < 1 ? 0 : h;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2050 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2051 return new d3_hsl(h, s, l);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2052 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2053 function d3_rgb_lab(r, g, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2054 r = d3_rgb_xyz(r);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2055 g = d3_rgb_xyz(g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2056 b = d3_rgb_xyz(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2057 var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2058 return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2059 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2060 function d3_rgb_xyz(r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2061 return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2062 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2063 function d3_rgb_parseNumber(c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2064 var f = parseFloat(c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2065 return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2066 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2067 var d3_rgb_names = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2068 aliceblue: 15792383,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2069 antiquewhite: 16444375,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2070 aqua: 65535,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2071 aquamarine: 8388564,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2072 azure: 15794175,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2073 beige: 16119260,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2074 bisque: 16770244,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2075 black: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2076 blanchedalmond: 16772045,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2077 blue: 255,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2078 blueviolet: 9055202,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2079 brown: 10824234,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2080 burlywood: 14596231,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2081 cadetblue: 6266528,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2082 chartreuse: 8388352,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2083 chocolate: 13789470,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2084 coral: 16744272,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2085 cornflowerblue: 6591981,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2086 cornsilk: 16775388,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2087 crimson: 14423100,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2088 cyan: 65535,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2089 darkblue: 139,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2090 darkcyan: 35723,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2091 darkgoldenrod: 12092939,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2092 darkgray: 11119017,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2093 darkgreen: 25600,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2094 darkgrey: 11119017,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2095 darkkhaki: 12433259,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2096 darkmagenta: 9109643,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2097 darkolivegreen: 5597999,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2098 darkorange: 16747520,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2099 darkorchid: 10040012,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2100 darkred: 9109504,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2101 darksalmon: 15308410,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2102 darkseagreen: 9419919,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2103 darkslateblue: 4734347,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2104 darkslategray: 3100495,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2105 darkslategrey: 3100495,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2106 darkturquoise: 52945,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2107 darkviolet: 9699539,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2108 deeppink: 16716947,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2109 deepskyblue: 49151,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2110 dimgray: 6908265,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2111 dimgrey: 6908265,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2112 dodgerblue: 2003199,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2113 firebrick: 11674146,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2114 floralwhite: 16775920,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2115 forestgreen: 2263842,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2116 fuchsia: 16711935,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2117 gainsboro: 14474460,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2118 ghostwhite: 16316671,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2119 gold: 16766720,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2120 goldenrod: 14329120,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2121 gray: 8421504,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2122 green: 32768,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2123 greenyellow: 11403055,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2124 grey: 8421504,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2125 honeydew: 15794160,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2126 hotpink: 16738740,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2127 indianred: 13458524,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2128 indigo: 4915330,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2129 ivory: 16777200,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2130 khaki: 15787660,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2131 lavender: 15132410,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2132 lavenderblush: 16773365,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2133 lawngreen: 8190976,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2134 lemonchiffon: 16775885,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2135 lightblue: 11393254,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2136 lightcoral: 15761536,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2137 lightcyan: 14745599,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2138 lightgoldenrodyellow: 16448210,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2139 lightgray: 13882323,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2140 lightgreen: 9498256,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2141 lightgrey: 13882323,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2142 lightpink: 16758465,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2143 lightsalmon: 16752762,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2144 lightseagreen: 2142890,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2145 lightskyblue: 8900346,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2146 lightslategray: 7833753,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2147 lightslategrey: 7833753,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2148 lightsteelblue: 11584734,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2149 lightyellow: 16777184,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2150 lime: 65280,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2151 limegreen: 3329330,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2152 linen: 16445670,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2153 magenta: 16711935,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2154 maroon: 8388608,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2155 mediumaquamarine: 6737322,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2156 mediumblue: 205,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2157 mediumorchid: 12211667,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2158 mediumpurple: 9662683,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2159 mediumseagreen: 3978097,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2160 mediumslateblue: 8087790,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2161 mediumspringgreen: 64154,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2162 mediumturquoise: 4772300,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2163 mediumvioletred: 13047173,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2164 midnightblue: 1644912,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2165 mintcream: 16121850,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2166 mistyrose: 16770273,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2167 moccasin: 16770229,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2168 navajowhite: 16768685,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2169 navy: 128,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2170 oldlace: 16643558,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2171 olive: 8421376,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2172 olivedrab: 7048739,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2173 orange: 16753920,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2174 orangered: 16729344,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2175 orchid: 14315734,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2176 palegoldenrod: 15657130,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2177 palegreen: 10025880,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2178 paleturquoise: 11529966,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2179 palevioletred: 14381203,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2180 papayawhip: 16773077,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2181 peachpuff: 16767673,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2182 peru: 13468991,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2183 pink: 16761035,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2184 plum: 14524637,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2185 powderblue: 11591910,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2186 purple: 8388736,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2187 red: 16711680,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2188 rosybrown: 12357519,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2189 royalblue: 4286945,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2190 saddlebrown: 9127187,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2191 salmon: 16416882,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2192 sandybrown: 16032864,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2193 seagreen: 3050327,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2194 seashell: 16774638,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2195 sienna: 10506797,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2196 silver: 12632256,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2197 skyblue: 8900331,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2198 slateblue: 6970061,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2199 slategray: 7372944,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2200 slategrey: 7372944,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2201 snow: 16775930,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2202 springgreen: 65407,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2203 steelblue: 4620980,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2204 tan: 13808780,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2205 teal: 32896,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2206 thistle: 14204888,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2207 tomato: 16737095,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2208 turquoise: 4251856,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2209 violet: 15631086,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2210 wheat: 16113331,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2211 white: 16777215,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2212 whitesmoke: 16119285,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2213 yellow: 16776960,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2214 yellowgreen: 10145074
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2215 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2216 d3_rgb_names.forEach(function(key, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2217 d3_rgb_names.set(key, d3_rgbNumber(value));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2218 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2219 function d3_functor(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2220 return typeof v === "function" ? v : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2221 return v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2222 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2223 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2224 d3.functor = d3_functor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2225 function d3_identity(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2226 return d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2227 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2228 d3.xhr = d3_xhrType(d3_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2229 function d3_xhrType(response) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2230 return function(url, mimeType, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2231 if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2232 mimeType = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2233 return d3_xhr(url, mimeType, response, callback);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2234 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2235 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2236 function d3_xhr(url, mimeType, response, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2237 var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2238 if (d3_window.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2239 "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2240 request.readyState > 3 && respond();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2241 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2242 function respond() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2243 var status = request.status, result;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2244 if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2245 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2246 result = response.call(xhr, request);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2247 } catch (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2248 dispatch.error.call(xhr, e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2249 return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2250 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2251 dispatch.load.call(xhr, result);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2252 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2253 dispatch.error.call(xhr, request);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2254 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2255 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2256 request.onprogress = function(event) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2257 var o = d3.event;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2258 d3.event = event;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2259 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2260 dispatch.progress.call(xhr, request);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2261 } finally {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2262 d3.event = o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2263 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2264 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2265 xhr.header = function(name, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2266 name = (name + "").toLowerCase();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2267 if (arguments.length < 2) return headers[name];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2268 if (value == null) delete headers[name]; else headers[name] = value + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2269 return xhr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2270 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2271 xhr.mimeType = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2272 if (!arguments.length) return mimeType;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2273 mimeType = value == null ? null : value + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2274 return xhr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2275 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2276 xhr.responseType = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2277 if (!arguments.length) return responseType;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2278 responseType = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2279 return xhr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2280 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2281 xhr.response = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2282 response = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2283 return xhr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2284 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2285 [ "get", "post" ].forEach(function(method) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2286 xhr[method] = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2287 return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2288 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2289 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2290 xhr.send = function(method, data, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2291 if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2292 request.open(method, url, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2293 if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2294 if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2295 if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2296 if (responseType != null) request.responseType = responseType;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2297 if (callback != null) xhr.on("error", callback).on("load", function(request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2298 callback(null, request);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2299 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2300 dispatch.beforesend.call(xhr, request);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2301 request.send(data == null ? null : data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2302 return xhr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2303 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2304 xhr.abort = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2305 request.abort();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2306 return xhr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2307 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2308 d3.rebind(xhr, dispatch, "on");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2309 return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2310 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2311 function d3_xhr_fixCallback(callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2312 return callback.length === 1 ? function(error, request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2313 callback(error == null ? request : null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2314 } : callback;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2315 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2316 function d3_xhrHasResponse(request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2317 var type = request.responseType;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2318 return type && type !== "text" ? request.response : request.responseText;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2319 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2320 d3.dsv = function(delimiter, mimeType) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2321 var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2322 function dsv(url, row, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2323 if (arguments.length < 3) callback = row, row = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2324 var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2325 xhr.row = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2326 return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2327 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2328 return xhr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2329 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2330 function response(request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2331 return dsv.parse(request.responseText);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2332 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2333 function typedResponse(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2334 return function(request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2335 return dsv.parse(request.responseText, f);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2336 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2337 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2338 dsv.parse = function(text, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2339 var o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2340 return dsv.parseRows(text, function(row, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2341 if (o) return o(row, i - 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2342 var a = new Function("d", "return {" + row.map(function(name, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2343 return JSON.stringify(name) + ": d[" + i + "]";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2344 }).join(",") + "}");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2345 o = f ? function(row, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2346 return f(a(row), i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2347 } : a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2348 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2349 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2350 dsv.parseRows = function(text, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2351 var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2352 function token() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2353 if (I >= N) return EOF;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2354 if (eol) return eol = false, EOL;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2355 var j = I;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2356 if (text.charCodeAt(j) === 34) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2357 var i = j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2358 while (i++ < N) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2359 if (text.charCodeAt(i) === 34) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2360 if (text.charCodeAt(i + 1) !== 34) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2361 ++i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2362 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2363 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2364 I = i + 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2365 var c = text.charCodeAt(i + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2366 if (c === 13) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2367 eol = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2368 if (text.charCodeAt(i + 2) === 10) ++I;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2369 } else if (c === 10) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2370 eol = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2371 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2372 return text.slice(j + 1, i).replace(/""/g, '"');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2373 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2374 while (I < N) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2375 var c = text.charCodeAt(I++), k = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2376 if (c === 10) eol = true; else if (c === 13) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2377 eol = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2378 if (text.charCodeAt(I) === 10) ++I, ++k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2379 } else if (c !== delimiterCode) continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2380 return text.slice(j, I - k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2381 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2382 return text.slice(j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2383 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2384 while ((t = token()) !== EOF) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2385 var a = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2386 while (t !== EOL && t !== EOF) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2387 a.push(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2388 t = token();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2389 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2390 if (f && (a = f(a, n++)) == null) continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2391 rows.push(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2392 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2393 return rows;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2394 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2395 dsv.format = function(rows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2396 if (Array.isArray(rows[0])) return dsv.formatRows(rows);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2397 var fieldSet = new d3_Set(), fields = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2398 rows.forEach(function(row) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2399 for (var field in row) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2400 if (!fieldSet.has(field)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2401 fields.push(fieldSet.add(field));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2402 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2403 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2404 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2405 return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2406 return fields.map(function(field) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2407 return formatValue(row[field]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2408 }).join(delimiter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2409 })).join("\n");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2410 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2411 dsv.formatRows = function(rows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2412 return rows.map(formatRow).join("\n");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2413 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2414 function formatRow(row) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2415 return row.map(formatValue).join(delimiter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2416 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2417 function formatValue(text) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2418 return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2419 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2420 return dsv;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2421 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2422 d3.csv = d3.dsv(",", "text/csv");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2423 d3.tsv = d3.dsv(" ", "text/tab-separated-values");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2424 var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, "requestAnimationFrame")] || function(callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2425 setTimeout(callback, 17);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2426 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2427 d3.timer = function(callback, delay, then) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2428 var n = arguments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2429 if (n < 2) delay = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2430 if (n < 3) then = Date.now();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2431 var time = then + delay, timer = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2432 c: callback,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2433 t: time,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2434 f: false,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2435 n: null
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2436 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2437 if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2438 d3_timer_queueTail = timer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2439 if (!d3_timer_interval) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2440 d3_timer_timeout = clearTimeout(d3_timer_timeout);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2441 d3_timer_interval = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2442 d3_timer_frame(d3_timer_step);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2443 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2444 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2445 function d3_timer_step() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2446 var now = d3_timer_mark(), delay = d3_timer_sweep() - now;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2447 if (delay > 24) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2448 if (isFinite(delay)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2449 clearTimeout(d3_timer_timeout);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2450 d3_timer_timeout = setTimeout(d3_timer_step, delay);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2451 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2452 d3_timer_interval = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2453 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2454 d3_timer_interval = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2455 d3_timer_frame(d3_timer_step);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2456 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2457 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2458 d3.timer.flush = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2459 d3_timer_mark();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2460 d3_timer_sweep();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2461 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2462 function d3_timer_mark() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2463 var now = Date.now();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2464 d3_timer_active = d3_timer_queueHead;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2465 while (d3_timer_active) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2466 if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2467 d3_timer_active = d3_timer_active.n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2468 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2469 return now;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2470 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2471 function d3_timer_sweep() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2472 var t0, t1 = d3_timer_queueHead, time = Infinity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2473 while (t1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2474 if (t1.f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2475 t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2476 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2477 if (t1.t < time) time = t1.t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2478 t1 = (t0 = t1).n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2479 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2480 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2481 d3_timer_queueTail = t0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2482 return time;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2483 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2484 function d3_format_precision(x, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2485 return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2486 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2487 d3.round = function(x, n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2488 return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2489 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2490 var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2491 d3.formatPrefix = function(value, precision) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2492 var i = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2493 if (value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2494 if (value < 0) value *= -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2495 if (precision) value = d3.round(value, d3_format_precision(value, precision));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2496 i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2497 i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2498 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2499 return d3_formatPrefixes[8 + i / 3];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2500 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2501 function d3_formatPrefix(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2502 var k = Math.pow(10, abs(8 - i) * 3);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2503 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2504 scale: i > 8 ? function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2505 return d / k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2506 } : function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2507 return d * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2508 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2509 symbol: d
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2510 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2511 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2512 function d3_locale_numberFormat(locale) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2513 var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2514 var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2515 while (i > 0 && g > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2516 if (length + g + 1 > width) g = Math.max(1, width - length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2517 t.push(value.substring(i -= g, i + g));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2518 if ((length += g + 1) > width) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2519 g = locale_grouping[j = (j + 1) % locale_grouping.length];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2520 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2521 return t.reverse().join(locale_thousands);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2522 } : d3_identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2523 return function(specifier) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2524 var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false, exponent = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2525 if (precision) precision = +precision.substring(1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2526 if (zfill || fill === "0" && align === "=") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2527 zfill = fill = "0";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2528 align = "=";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2529 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2530 switch (type) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2531 case "n":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2532 comma = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2533 type = "g";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2534 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2535
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2536 case "%":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2537 scale = 100;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2538 suffix = "%";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2539 type = "f";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2540 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2541
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2542 case "p":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2543 scale = 100;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2544 suffix = "%";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2545 type = "r";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2546 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2547
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2548 case "b":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2549 case "o":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2550 case "x":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2551 case "X":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2552 if (symbol === "#") prefix = "0" + type.toLowerCase();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2553
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2554 case "c":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2555 exponent = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2556
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2557 case "d":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2558 integer = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2559 precision = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2560 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2561
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2562 case "s":
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2563 scale = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2564 type = "r";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2565 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2566 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2567 if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2568 if (type == "r" && !precision) type = "g";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2569 if (precision != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2570 if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2571 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2572 type = d3_format_types.get(type) || d3_format_typeDefault;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2573 var zcomma = zfill && comma;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2574 return function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2575 var fullSuffix = suffix;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2576 if (integer && value % 1) return "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2577 var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2578 if (scale < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2579 var unit = d3.formatPrefix(value, precision);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2580 value = unit.scale(value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2581 fullSuffix = unit.symbol + suffix;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2582 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2583 value *= scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2584 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2585 value = type(value, precision);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2586 var i = value.lastIndexOf("."), before, after;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2587 if (i < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2588 var j = exponent ? value.lastIndexOf("e") : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2589 if (j < 0) before = value, after = ""; else before = value.substring(0, j), after = value.substring(j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2590 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2591 before = value.substring(0, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2592 after = locale_decimal + value.substring(i + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2593 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2594 if (!zfill && comma) before = formatGroup(before, Infinity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2595 var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2596 if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2597 negative += prefix;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2598 value = before + after;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2599 return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2600 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2601 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2602 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2603 var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2604 var d3_format_types = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2605 b: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2606 return x.toString(2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2607 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2608 c: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2609 return String.fromCharCode(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2610 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2611 o: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2612 return x.toString(8);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2613 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2614 x: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2615 return x.toString(16);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2616 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2617 X: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2618 return x.toString(16).toUpperCase();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2619 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2620 g: function(x, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2621 return x.toPrecision(p);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2622 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2623 e: function(x, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2624 return x.toExponential(p);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2625 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2626 f: function(x, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2627 return x.toFixed(p);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2628 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2629 r: function(x, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2630 return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2631 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2632 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2633 function d3_format_typeDefault(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2634 return x + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2635 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2636 var d3_time = d3.time = {}, d3_date = Date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2637 function d3_date_utc() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2638 this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2639 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2640 d3_date_utc.prototype = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2641 getDate: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2642 return this._.getUTCDate();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2643 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2644 getDay: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2645 return this._.getUTCDay();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2646 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2647 getFullYear: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2648 return this._.getUTCFullYear();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2649 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2650 getHours: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2651 return this._.getUTCHours();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2652 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2653 getMilliseconds: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2654 return this._.getUTCMilliseconds();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2655 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2656 getMinutes: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2657 return this._.getUTCMinutes();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2658 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2659 getMonth: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2660 return this._.getUTCMonth();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2661 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2662 getSeconds: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2663 return this._.getUTCSeconds();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2664 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2665 getTime: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2666 return this._.getTime();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2667 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2668 getTimezoneOffset: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2669 return 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2670 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2671 valueOf: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2672 return this._.valueOf();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2673 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2674 setDate: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2675 d3_time_prototype.setUTCDate.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2676 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2677 setDay: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2678 d3_time_prototype.setUTCDay.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2679 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2680 setFullYear: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2681 d3_time_prototype.setUTCFullYear.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2682 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2683 setHours: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2684 d3_time_prototype.setUTCHours.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2685 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2686 setMilliseconds: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2687 d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2688 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2689 setMinutes: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2690 d3_time_prototype.setUTCMinutes.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2691 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2692 setMonth: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2693 d3_time_prototype.setUTCMonth.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2694 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2695 setSeconds: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2696 d3_time_prototype.setUTCSeconds.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2697 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2698 setTime: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2699 d3_time_prototype.setTime.apply(this._, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2700 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2701 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2702 var d3_time_prototype = Date.prototype;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2703 function d3_time_interval(local, step, number) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2704 function round(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2705 var d0 = local(date), d1 = offset(d0, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2706 return date - d0 < d1 - date ? d0 : d1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2707 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2708 function ceil(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2709 step(date = local(new d3_date(date - 1)), 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2710 return date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2711 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2712 function offset(date, k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2713 step(date = new d3_date(+date), k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2714 return date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2715 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2716 function range(t0, t1, dt) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2717 var time = ceil(t0), times = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2718 if (dt > 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2719 while (time < t1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2720 if (!(number(time) % dt)) times.push(new Date(+time));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2721 step(time, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2722 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2723 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2724 while (time < t1) times.push(new Date(+time)), step(time, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2725 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2726 return times;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2727 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2728 function range_utc(t0, t1, dt) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2729 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2730 d3_date = d3_date_utc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2731 var utc = new d3_date_utc();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2732 utc._ = t0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2733 return range(utc, t1, dt);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2734 } finally {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2735 d3_date = Date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2736 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2737 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2738 local.floor = local;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2739 local.round = round;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2740 local.ceil = ceil;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2741 local.offset = offset;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2742 local.range = range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2743 var utc = local.utc = d3_time_interval_utc(local);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2744 utc.floor = utc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2745 utc.round = d3_time_interval_utc(round);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2746 utc.ceil = d3_time_interval_utc(ceil);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2747 utc.offset = d3_time_interval_utc(offset);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2748 utc.range = range_utc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2749 return local;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2750 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2751 function d3_time_interval_utc(method) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2752 return function(date, k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2753 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2754 d3_date = d3_date_utc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2755 var utc = new d3_date_utc();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2756 utc._ = date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2757 return method(utc, k)._;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2758 } finally {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2759 d3_date = Date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2760 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2761 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2762 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2763 d3_time.year = d3_time_interval(function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2764 date = d3_time.day(date);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2765 date.setMonth(0, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2766 return date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2767 }, function(date, offset) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2768 date.setFullYear(date.getFullYear() + offset);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2769 }, function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2770 return date.getFullYear();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2771 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2772 d3_time.years = d3_time.year.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2773 d3_time.years.utc = d3_time.year.utc.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2774 d3_time.day = d3_time_interval(function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2775 var day = new d3_date(2e3, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2776 day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2777 return day;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2778 }, function(date, offset) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2779 date.setDate(date.getDate() + offset);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2780 }, function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2781 return date.getDate() - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2782 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2783 d3_time.days = d3_time.day.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2784 d3_time.days.utc = d3_time.day.utc.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2785 d3_time.dayOfYear = function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2786 var year = d3_time.year(date);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2787 return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2788 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2789 [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2790 i = 7 - i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2791 var interval = d3_time[day] = d3_time_interval(function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2792 (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2793 return date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2794 }, function(date, offset) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2795 date.setDate(date.getDate() + Math.floor(offset) * 7);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2796 }, function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2797 var day = d3_time.year(date).getDay();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2798 return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2799 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2800 d3_time[day + "s"] = interval.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2801 d3_time[day + "s"].utc = interval.utc.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2802 d3_time[day + "OfYear"] = function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2803 var day = d3_time.year(date).getDay();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2804 return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2805 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2806 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2807 d3_time.week = d3_time.sunday;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2808 d3_time.weeks = d3_time.sunday.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2809 d3_time.weeks.utc = d3_time.sunday.utc.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2810 d3_time.weekOfYear = d3_time.sundayOfYear;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2811 function d3_locale_timeFormat(locale) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2812 var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2813 function d3_time_format(template) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2814 var n = template.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2815 function format(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2816 var string = [], i = -1, j = 0, c, p, f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2817 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2818 if (template.charCodeAt(i) === 37) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2819 string.push(template.slice(j, i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2820 if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2821 if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2822 string.push(c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2823 j = i + 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2824 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2825 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2826 string.push(template.slice(j, i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2827 return string.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2828 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2829 format.parse = function(string) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2830 var d = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2831 y: 1900,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2832 m: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2833 d: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2834 H: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2835 M: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2836 S: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2837 L: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2838 Z: null
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2839 }, i = d3_time_parse(d, template, string, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2840 if (i != string.length) return null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2841 if ("p" in d) d.H = d.H % 12 + d.p * 12;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2842 var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2843 if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("w" in d && ("W" in d || "U" in d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2844 date.setFullYear(d.y, 0, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2845 date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2846 } else date.setFullYear(d.y, d.m, d.d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2847 date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2848 return localZ ? date._ : date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2849 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2850 format.toString = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2851 return template;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2852 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2853 return format;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2854 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2855 function d3_time_parse(date, template, string, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2856 var c, p, t, i = 0, n = template.length, m = string.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2857 while (i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2858 if (j >= m) return -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2859 c = template.charCodeAt(i++);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2860 if (c === 37) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2861 t = template.charAt(i++);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2862 p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2863 if (!p || (j = p(date, string, j)) < 0) return -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2864 } else if (c != string.charCodeAt(j++)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2865 return -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2866 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2867 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2868 return j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2869 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2870 d3_time_format.utc = function(template) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2871 var local = d3_time_format(template);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2872 function format(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2873 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2874 d3_date = d3_date_utc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2875 var utc = new d3_date();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2876 utc._ = date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2877 return local(utc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2878 } finally {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2879 d3_date = Date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2880 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2881 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2882 format.parse = function(string) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2883 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2884 d3_date = d3_date_utc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2885 var date = local.parse(string);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2886 return date && date._;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2887 } finally {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2888 d3_date = Date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2889 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2890 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2891 format.toString = local.toString;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2892 return format;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2893 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2894 d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2895 var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2896 locale_periods.forEach(function(p, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2897 d3_time_periodLookup.set(p.toLowerCase(), i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2898 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2899 var d3_time_formats = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2900 a: function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2901 return locale_shortDays[d.getDay()];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2902 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2903 A: function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2904 return locale_days[d.getDay()];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2905 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2906 b: function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2907 return locale_shortMonths[d.getMonth()];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2908 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2909 B: function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2910 return locale_months[d.getMonth()];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2911 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2912 c: d3_time_format(locale_dateTime),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2913 d: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2914 return d3_time_formatPad(d.getDate(), p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2915 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2916 e: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2917 return d3_time_formatPad(d.getDate(), p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2918 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2919 H: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2920 return d3_time_formatPad(d.getHours(), p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2921 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2922 I: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2923 return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2924 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2925 j: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2926 return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2927 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2928 L: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2929 return d3_time_formatPad(d.getMilliseconds(), p, 3);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2930 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2931 m: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2932 return d3_time_formatPad(d.getMonth() + 1, p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2933 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2934 M: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2935 return d3_time_formatPad(d.getMinutes(), p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2936 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2937 p: function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2938 return locale_periods[+(d.getHours() >= 12)];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2939 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2940 S: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2941 return d3_time_formatPad(d.getSeconds(), p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2942 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2943 U: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2944 return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2945 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2946 w: function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2947 return d.getDay();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2948 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2949 W: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2950 return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2951 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2952 x: d3_time_format(locale_date),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2953 X: d3_time_format(locale_time),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2954 y: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2955 return d3_time_formatPad(d.getFullYear() % 100, p, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2956 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2957 Y: function(d, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2958 return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2959 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2960 Z: d3_time_zone,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2961 "%": function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2962 return "%";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2963 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2964 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2965 var d3_time_parsers = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2966 a: d3_time_parseWeekdayAbbrev,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2967 A: d3_time_parseWeekday,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2968 b: d3_time_parseMonthAbbrev,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2969 B: d3_time_parseMonth,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2970 c: d3_time_parseLocaleFull,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2971 d: d3_time_parseDay,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2972 e: d3_time_parseDay,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2973 H: d3_time_parseHour24,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2974 I: d3_time_parseHour24,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2975 j: d3_time_parseDayOfYear,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2976 L: d3_time_parseMilliseconds,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2977 m: d3_time_parseMonthNumber,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2978 M: d3_time_parseMinutes,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2979 p: d3_time_parseAmPm,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2980 S: d3_time_parseSeconds,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2981 U: d3_time_parseWeekNumberSunday,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2982 w: d3_time_parseWeekdayNumber,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2983 W: d3_time_parseWeekNumberMonday,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2984 x: d3_time_parseLocaleDate,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2985 X: d3_time_parseLocaleTime,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2986 y: d3_time_parseYear,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2987 Y: d3_time_parseFullYear,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2988 Z: d3_time_parseZone,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2989 "%": d3_time_parseLiteralPercent
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2990 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2991 function d3_time_parseWeekdayAbbrev(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2992 d3_time_dayAbbrevRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2993 var n = d3_time_dayAbbrevRe.exec(string.slice(i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2994 return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2995 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2996 function d3_time_parseWeekday(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2997 d3_time_dayRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2998 var n = d3_time_dayRe.exec(string.slice(i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
2999 return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3000 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3001 function d3_time_parseMonthAbbrev(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3002 d3_time_monthAbbrevRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3003 var n = d3_time_monthAbbrevRe.exec(string.slice(i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3004 return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3005 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3006 function d3_time_parseMonth(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3007 d3_time_monthRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3008 var n = d3_time_monthRe.exec(string.slice(i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3009 return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3010 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3011 function d3_time_parseLocaleFull(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3012 return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3013 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3014 function d3_time_parseLocaleDate(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3015 return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3016 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3017 function d3_time_parseLocaleTime(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3018 return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3019 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3020 function d3_time_parseAmPm(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3021 var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3022 return n == null ? -1 : (date.p = n, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3023 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3024 return d3_time_format;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3025 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3026 var d3_time_formatPads = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3027 "-": "",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3028 _: " ",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3029 "0": "0"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3030 }, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3031 function d3_time_formatPad(value, fill, width) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3032 var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3033 return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3034 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3035 function d3_time_formatRe(names) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3036 return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3037 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3038 function d3_time_formatLookup(names) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3039 var map = new d3_Map(), i = -1, n = names.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3040 while (++i < n) map.set(names[i].toLowerCase(), i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3041 return map;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3042 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3043 function d3_time_parseWeekdayNumber(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3044 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3045 var n = d3_time_numberRe.exec(string.slice(i, i + 1));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3046 return n ? (date.w = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3047 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3048 function d3_time_parseWeekNumberSunday(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3049 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3050 var n = d3_time_numberRe.exec(string.slice(i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3051 return n ? (date.U = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3052 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3053 function d3_time_parseWeekNumberMonday(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3054 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3055 var n = d3_time_numberRe.exec(string.slice(i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3056 return n ? (date.W = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3057 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3058 function d3_time_parseFullYear(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3059 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3060 var n = d3_time_numberRe.exec(string.slice(i, i + 4));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3061 return n ? (date.y = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3062 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3063 function d3_time_parseYear(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3064 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3065 var n = d3_time_numberRe.exec(string.slice(i, i + 2));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3066 return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3067 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3068 function d3_time_parseZone(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3069 return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3070 i + 5) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3071 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3072 function d3_time_expandYear(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3073 return d + (d > 68 ? 1900 : 2e3);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3074 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3075 function d3_time_parseMonthNumber(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3076 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3077 var n = d3_time_numberRe.exec(string.slice(i, i + 2));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3078 return n ? (date.m = n[0] - 1, i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3079 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3080 function d3_time_parseDay(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3081 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3082 var n = d3_time_numberRe.exec(string.slice(i, i + 2));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3083 return n ? (date.d = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3084 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3085 function d3_time_parseDayOfYear(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3086 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3087 var n = d3_time_numberRe.exec(string.slice(i, i + 3));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3088 return n ? (date.j = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3089 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3090 function d3_time_parseHour24(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3091 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3092 var n = d3_time_numberRe.exec(string.slice(i, i + 2));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3093 return n ? (date.H = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3094 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3095 function d3_time_parseMinutes(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3096 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3097 var n = d3_time_numberRe.exec(string.slice(i, i + 2));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3098 return n ? (date.M = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3099 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3100 function d3_time_parseSeconds(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3101 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3102 var n = d3_time_numberRe.exec(string.slice(i, i + 2));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3103 return n ? (date.S = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3104 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3105 function d3_time_parseMilliseconds(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3106 d3_time_numberRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3107 var n = d3_time_numberRe.exec(string.slice(i, i + 3));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3108 return n ? (date.L = +n[0], i + n[0].length) : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3109 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3110 function d3_time_zone(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3111 var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3112 return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3113 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3114 function d3_time_parseLiteralPercent(date, string, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3115 d3_time_percentRe.lastIndex = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3116 var n = d3_time_percentRe.exec(string.slice(i, i + 1));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3117 return n ? i + n[0].length : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3118 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3119 function d3_time_formatMulti(formats) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3120 var n = formats.length, i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3121 while (++i < n) formats[i][0] = this(formats[i][0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3122 return function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3123 var i = 0, f = formats[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3124 while (!f[1](date)) f = formats[++i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3125 return f[0](date);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3126 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3127 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3128 d3.locale = function(locale) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3129 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3130 numberFormat: d3_locale_numberFormat(locale),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3131 timeFormat: d3_locale_timeFormat(locale)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3132 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3133 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3134 var d3_locale_enUS = d3.locale({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3135 decimal: ".",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3136 thousands: ",",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3137 grouping: [ 3 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3138 currency: [ "$", "" ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3139 dateTime: "%a %b %e %X %Y",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3140 date: "%m/%d/%Y",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3141 time: "%H:%M:%S",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3142 periods: [ "AM", "PM" ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3143 days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3144 shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3145 months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3146 shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3147 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3148 d3.format = d3_locale_enUS.numberFormat;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3149 d3.geo = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3150 function d3_adder() {}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3151 d3_adder.prototype = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3152 s: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3153 t: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3154 add: function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3155 d3_adderSum(y, this.t, d3_adderTemp);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3156 d3_adderSum(d3_adderTemp.s, this.s, this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3157 if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3158 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3159 reset: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3160 this.s = this.t = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3161 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3162 valueOf: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3163 return this.s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3164 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3165 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3166 var d3_adderTemp = new d3_adder();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3167 function d3_adderSum(a, b, o) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3168 var x = o.s = a + b, bv = x - a, av = x - bv;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3169 o.t = a - av + (b - bv);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3170 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3171 d3.geo.stream = function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3172 if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3173 d3_geo_streamObjectType[object.type](object, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3174 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3175 d3_geo_streamGeometry(object, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3176 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3177 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3178 function d3_geo_streamGeometry(geometry, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3179 if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3180 d3_geo_streamGeometryType[geometry.type](geometry, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3181 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3182 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3183 var d3_geo_streamObjectType = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3184 Feature: function(feature, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3185 d3_geo_streamGeometry(feature.geometry, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3186 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3187 FeatureCollection: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3188 var features = object.features, i = -1, n = features.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3189 while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3190 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3191 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3192 var d3_geo_streamGeometryType = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3193 Sphere: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3194 listener.sphere();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3195 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3196 Point: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3197 object = object.coordinates;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3198 listener.point(object[0], object[1], object[2]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3199 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3200 MultiPoint: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3201 var coordinates = object.coordinates, i = -1, n = coordinates.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3202 while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3203 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3204 LineString: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3205 d3_geo_streamLine(object.coordinates, listener, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3206 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3207 MultiLineString: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3208 var coordinates = object.coordinates, i = -1, n = coordinates.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3209 while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3210 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3211 Polygon: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3212 d3_geo_streamPolygon(object.coordinates, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3213 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3214 MultiPolygon: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3215 var coordinates = object.coordinates, i = -1, n = coordinates.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3216 while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3217 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3218 GeometryCollection: function(object, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3219 var geometries = object.geometries, i = -1, n = geometries.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3220 while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3221 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3222 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3223 function d3_geo_streamLine(coordinates, listener, closed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3224 var i = -1, n = coordinates.length - closed, coordinate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3225 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3226 while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3227 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3228 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3229 function d3_geo_streamPolygon(coordinates, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3230 var i = -1, n = coordinates.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3231 listener.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3232 while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3233 listener.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3234 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3235 d3.geo.area = function(object) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3236 d3_geo_areaSum = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3237 d3.geo.stream(object, d3_geo_area);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3238 return d3_geo_areaSum;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3239 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3240 var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3241 var d3_geo_area = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3242 sphere: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3243 d3_geo_areaSum += 4 * π;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3244 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3245 point: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3246 lineStart: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3247 lineEnd: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3248 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3249 d3_geo_areaRingSum.reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3250 d3_geo_area.lineStart = d3_geo_areaRingStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3251 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3252 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3253 var area = 2 * d3_geo_areaRingSum;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3254 d3_geo_areaSum += area < 0 ? 4 * π + area : area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3255 d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3256 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3257 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3258 function d3_geo_areaRingStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3259 var λ00, φ00, λ0, cosφ0, sinφ0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3260 d3_geo_area.point = function(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3261 d3_geo_area.point = nextPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3262 λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3263 sinφ0 = Math.sin(φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3264 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3265 function nextPoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3266 λ *= d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3267 φ = φ * d3_radians / 2 + π / 4;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3268 var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3269 d3_geo_areaRingSum.add(Math.atan2(v, u));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3270 λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3271 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3272 d3_geo_area.lineEnd = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3273 nextPoint(λ00, φ00);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3274 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3275 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3276 function d3_geo_cartesian(spherical) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3277 var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3278 return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3279 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3280 function d3_geo_cartesianDot(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3281 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3282 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3283 function d3_geo_cartesianCross(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3284 return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3285 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3286 function d3_geo_cartesianAdd(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3287 a[0] += b[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3288 a[1] += b[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3289 a[2] += b[2];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3290 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3291 function d3_geo_cartesianScale(vector, k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3292 return [ vector[0] * k, vector[1] * k, vector[2] * k ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3293 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3294 function d3_geo_cartesianNormalize(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3295 var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3296 d[0] /= l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3297 d[1] /= l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3298 d[2] /= l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3299 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3300 function d3_geo_spherical(cartesian) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3301 return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3302 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3303 function d3_geo_sphericalEqual(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3304 return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3305 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3306 d3.geo.bounds = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3307 var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3308 var bound = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3309 point: point,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3310 lineStart: lineStart,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3311 lineEnd: lineEnd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3312 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3313 bound.point = ringPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3314 bound.lineStart = ringStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3315 bound.lineEnd = ringEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3316 dλSum = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3317 d3_geo_area.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3318 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3319 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3320 d3_geo_area.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3321 bound.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3322 bound.lineStart = lineStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3323 bound.lineEnd = lineEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3324 if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3325 range[0] = λ0, range[1] = λ1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3326 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3327 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3328 function point(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3329 ranges.push(range = [ λ0 = λ, λ1 = λ ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3330 if (φ < φ0) φ0 = φ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3331 if (φ > φ1) φ1 = φ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3332 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3333 function linePoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3334 var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3335 if (p0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3336 var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3337 d3_geo_cartesianNormalize(inflection);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3338 inflection = d3_geo_spherical(inflection);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3339 var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3340 if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3341 var φi = inflection[1] * d3_degrees;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3342 if (φi > φ1) φ1 = φi;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3343 } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3344 var φi = -inflection[1] * d3_degrees;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3345 if (φi < φ0) φ0 = φi;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3346 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3347 if (φ < φ0) φ0 = φ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3348 if (φ > φ1) φ1 = φ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3349 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3350 if (antimeridian) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3351 if (λ < λ_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3352 if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3353 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3354 if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3355 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3356 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3357 if (λ1 >= λ0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3358 if (λ < λ0) λ0 = λ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3359 if (λ > λ1) λ1 = λ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3360 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3361 if (λ > λ_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3362 if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3363 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3364 if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3365 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3366 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3367 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3368 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3369 point(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3370 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3371 p0 = p, λ_ = λ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3372 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3373 function lineStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3374 bound.point = linePoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3375 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3376 function lineEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3377 range[0] = λ0, range[1] = λ1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3378 bound.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3379 p0 = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3380 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3381 function ringPoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3382 if (p0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3383 var dλ = λ - λ_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3384 dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3385 } else λ__ = λ, φ__ = φ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3386 d3_geo_area.point(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3387 linePoint(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3388 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3389 function ringStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3390 d3_geo_area.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3391 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3392 function ringEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3393 ringPoint(λ__, φ__);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3394 d3_geo_area.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3395 if (abs(dλSum) > ε) λ0 = -(λ1 = 180);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3396 range[0] = λ0, range[1] = λ1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3397 p0 = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3398 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3399 function angle(λ0, λ1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3400 return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3401 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3402 function compareRanges(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3403 return a[0] - b[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3404 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3405 function withinRange(x, range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3406 return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3407 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3408 return function(feature) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3409 φ1 = λ1 = -(λ0 = φ0 = Infinity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3410 ranges = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3411 d3.geo.stream(feature, bound);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3412 var n = ranges.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3413 if (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3414 ranges.sort(compareRanges);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3415 for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3416 b = ranges[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3417 if (withinRange(b[0], a) || withinRange(b[1], a)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3418 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3419 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3420 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3421 merged.push(a = b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3422 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3423 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3424 var best = -Infinity, dλ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3425 for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3426 b = merged[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3427 if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3428 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3429 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3430 ranges = range = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3431 return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3432 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3433 }();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3434 d3.geo.centroid = function(object) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3435 d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3436 d3.geo.stream(object, d3_geo_centroid);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3437 var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3438 if (m < ε2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3439 x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3440 if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3441 m = x * x + y * y + z * z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3442 if (m < ε2) return [ NaN, NaN ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3443 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3444 return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3445 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3446 var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3447 var d3_geo_centroid = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3448 sphere: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3449 point: d3_geo_centroidPoint,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3450 lineStart: d3_geo_centroidLineStart,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3451 lineEnd: d3_geo_centroidLineEnd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3452 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3453 d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3454 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3455 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3456 d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3457 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3458 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3459 function d3_geo_centroidPoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3460 λ *= d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3461 var cosφ = Math.cos(φ *= d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3462 d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3463 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3464 function d3_geo_centroidPointXYZ(x, y, z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3465 ++d3_geo_centroidW0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3466 d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3467 d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3468 d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3469 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3470 function d3_geo_centroidLineStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3471 var x0, y0, z0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3472 d3_geo_centroid.point = function(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3473 λ *= d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3474 var cosφ = Math.cos(φ *= d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3475 x0 = cosφ * Math.cos(λ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3476 y0 = cosφ * Math.sin(λ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3477 z0 = Math.sin(φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3478 d3_geo_centroid.point = nextPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3479 d3_geo_centroidPointXYZ(x0, y0, z0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3480 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3481 function nextPoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3482 λ *= d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3483 var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3484 d3_geo_centroidW1 += w;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3485 d3_geo_centroidX1 += w * (x0 + (x0 = x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3486 d3_geo_centroidY1 += w * (y0 + (y0 = y));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3487 d3_geo_centroidZ1 += w * (z0 + (z0 = z));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3488 d3_geo_centroidPointXYZ(x0, y0, z0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3489 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3490 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3491 function d3_geo_centroidLineEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3492 d3_geo_centroid.point = d3_geo_centroidPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3493 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3494 function d3_geo_centroidRingStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3495 var λ00, φ00, x0, y0, z0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3496 d3_geo_centroid.point = function(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3497 λ00 = λ, φ00 = φ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3498 d3_geo_centroid.point = nextPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3499 λ *= d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3500 var cosφ = Math.cos(φ *= d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3501 x0 = cosφ * Math.cos(λ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3502 y0 = cosφ * Math.sin(λ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3503 z0 = Math.sin(φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3504 d3_geo_centroidPointXYZ(x0, y0, z0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3505 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3506 d3_geo_centroid.lineEnd = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3507 nextPoint(λ00, φ00);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3508 d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3509 d3_geo_centroid.point = d3_geo_centroidPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3510 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3511 function nextPoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3512 λ *= d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3513 var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3514 d3_geo_centroidX2 += v * cx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3515 d3_geo_centroidY2 += v * cy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3516 d3_geo_centroidZ2 += v * cz;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3517 d3_geo_centroidW1 += w;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3518 d3_geo_centroidX1 += w * (x0 + (x0 = x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3519 d3_geo_centroidY1 += w * (y0 + (y0 = y));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3520 d3_geo_centroidZ1 += w * (z0 + (z0 = z));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3521 d3_geo_centroidPointXYZ(x0, y0, z0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3522 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3523 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3524 function d3_geo_compose(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3525 function compose(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3526 return x = a(x, y), b(x[0], x[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3527 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3528 if (a.invert && b.invert) compose.invert = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3529 return x = b.invert(x, y), x && a.invert(x[0], x[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3530 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3531 return compose;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3532 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3533 function d3_true() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3534 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3535 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3536 function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3537 var subject = [], clip = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3538 segments.forEach(function(segment) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3539 if ((n = segment.length - 1) <= 0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3540 var n, p0 = segment[0], p1 = segment[n];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3541 if (d3_geo_sphericalEqual(p0, p1)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3542 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3543 for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3544 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3545 return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3546 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3547 var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3548 a.o = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3549 subject.push(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3550 clip.push(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3551 a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3552 b = new d3_geo_clipPolygonIntersection(p1, null, a, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3553 a.o = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3554 subject.push(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3555 clip.push(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3556 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3557 clip.sort(compare);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3558 d3_geo_clipPolygonLinkCircular(subject);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3559 d3_geo_clipPolygonLinkCircular(clip);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3560 if (!subject.length) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3561 for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3562 clip[i].e = entry = !entry;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3563 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3564 var start = subject[0], points, point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3565 while (1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3566 var current = start, isSubject = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3567 while (current.v) if ((current = current.n) === start) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3568 points = current.z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3569 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3570 do {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3571 current.v = current.o.v = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3572 if (current.e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3573 if (isSubject) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3574 for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3575 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3576 interpolate(current.x, current.n.x, 1, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3577 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3578 current = current.n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3579 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3580 if (isSubject) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3581 points = current.p.z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3582 for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3583 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3584 interpolate(current.x, current.p.x, -1, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3585 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3586 current = current.p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3587 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3588 current = current.o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3589 points = current.z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3590 isSubject = !isSubject;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3591 } while (!current.v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3592 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3593 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3594 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3595 function d3_geo_clipPolygonLinkCircular(array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3596 if (!(n = array.length)) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3597 var n, i = 0, a = array[0], b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3598 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3599 a.n = b = array[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3600 b.p = a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3601 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3602 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3603 a.n = b = array[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3604 b.p = a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3605 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3606 function d3_geo_clipPolygonIntersection(point, points, other, entry) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3607 this.x = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3608 this.z = points;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3609 this.o = other;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3610 this.e = entry;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3611 this.v = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3612 this.n = this.p = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3613 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3614 function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3615 return function(rotate, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3616 var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3617 var clip = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3618 point: point,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3619 lineStart: lineStart,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3620 lineEnd: lineEnd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3621 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3622 clip.point = pointRing;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3623 clip.lineStart = ringStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3624 clip.lineEnd = ringEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3625 segments = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3626 polygon = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3627 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3628 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3629 clip.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3630 clip.lineStart = lineStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3631 clip.lineEnd = lineEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3632 segments = d3.merge(segments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3633 var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3634 if (segments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3635 if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3636 d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3637 } else if (clipStartInside) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3638 if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3639 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3640 interpolate(null, null, 1, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3641 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3642 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3643 if (polygonStarted) listener.polygonEnd(), polygonStarted = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3644 segments = polygon = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3645 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3646 sphere: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3647 listener.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3648 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3649 interpolate(null, null, 1, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3650 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3651 listener.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3652 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3653 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3654 function point(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3655 var point = rotate(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3656 if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3657 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3658 function pointLine(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3659 var point = rotate(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3660 line.point(point[0], point[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3661 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3662 function lineStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3663 clip.point = pointLine;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3664 line.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3665 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3666 function lineEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3667 clip.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3668 line.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3669 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3670 var segments;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3671 var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3672 function pointRing(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3673 ring.push([ λ, φ ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3674 var point = rotate(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3675 ringListener.point(point[0], point[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3676 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3677 function ringStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3678 ringListener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3679 ring = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3680 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3681 function ringEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3682 pointRing(ring[0][0], ring[0][1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3683 ringListener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3684 var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3685 ring.pop();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3686 polygon.push(ring);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3687 ring = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3688 if (!n) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3689 if (clean & 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3690 segment = ringSegments[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3691 var n = segment.length - 1, i = -1, point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3692 if (n > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3693 if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3694 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3695 while (++i < n) listener.point((point = segment[i])[0], point[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3696 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3697 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3698 return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3699 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3700 if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3701 segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3702 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3703 return clip;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3704 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3705 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3706 function d3_geo_clipSegmentLength1(segment) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3707 return segment.length > 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3708 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3709 function d3_geo_clipBufferListener() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3710 var lines = [], line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3711 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3712 lineStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3713 lines.push(line = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3714 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3715 point: function(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3716 line.push([ λ, φ ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3717 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3718 lineEnd: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3719 buffer: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3720 var buffer = lines;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3721 lines = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3722 line = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3723 return buffer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3724 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3725 rejoin: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3726 if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3727 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3728 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3729 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3730 function d3_geo_clipSort(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3731 return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3732 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3733 var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3734 function d3_geo_clipAntimeridianLine(listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3735 var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3736 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3737 lineStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3738 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3739 clean = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3740 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3741 point: function(λ1, φ1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3742 var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3743 if (abs(dλ - π) < ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3744 listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3745 listener.point(sλ0, φ0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3746 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3747 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3748 listener.point(sλ1, φ0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3749 listener.point(λ1, φ0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3750 clean = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3751 } else if (sλ0 !== sλ1 && dλ >= π) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3752 if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3753 if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3754 φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3755 listener.point(sλ0, φ0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3756 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3757 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3758 listener.point(sλ1, φ0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3759 clean = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3760 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3761 listener.point(λ0 = λ1, φ0 = φ1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3762 sλ0 = sλ1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3763 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3764 lineEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3765 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3766 λ0 = φ0 = NaN;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3767 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3768 clean: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3769 return 2 - clean;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3770 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3771 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3772 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3773 function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3774 var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3775 return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3776 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3777 function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3778 var φ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3779 if (from == null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3780 φ = direction * halfπ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3781 listener.point(-π, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3782 listener.point(0, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3783 listener.point(π, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3784 listener.point(π, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3785 listener.point(π, -φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3786 listener.point(0, -φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3787 listener.point(-π, -φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3788 listener.point(-π, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3789 listener.point(-π, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3790 } else if (abs(from[0] - to[0]) > ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3791 var s = from[0] < to[0] ? π : -π;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3792 φ = direction * s / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3793 listener.point(-s, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3794 listener.point(0, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3795 listener.point(s, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3796 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3797 listener.point(to[0], to[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3798 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3799 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3800 function d3_geo_pointInPolygon(point, polygon) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3801 var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3802 d3_geo_areaRingSum.reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3803 for (var i = 0, n = polygon.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3804 var ring = polygon[i], m = ring.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3805 if (!m) continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3806 var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3807 while (true) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3808 if (j === m) j = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3809 point = ring[j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3810 var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3811 d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3812 polarAngle += antimeridian ? dλ + sdλ * τ : dλ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3813 if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3814 var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3815 d3_geo_cartesianNormalize(arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3816 var intersection = d3_geo_cartesianCross(meridianNormal, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3817 d3_geo_cartesianNormalize(intersection);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3818 var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3819 if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3820 winding += antimeridian ^ dλ >= 0 ? 1 : -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3821 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3822 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3823 if (!j++) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3824 λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3825 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3826 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3827 return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3828 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3829 function d3_geo_clipCircle(radius) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3830 var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3831 return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3832 function visible(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3833 return Math.cos(λ) * Math.cos(φ) > cr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3834 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3835 function clipLine(listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3836 var point0, c0, v0, v00, clean;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3837 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3838 lineStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3839 v00 = v0 = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3840 clean = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3841 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3842 point: function(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3843 var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3844 if (!point0 && (v00 = v0 = v)) listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3845 if (v !== v0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3846 point2 = intersect(point0, point1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3847 if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3848 point1[0] += ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3849 point1[1] += ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3850 v = visible(point1[0], point1[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3851 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3852 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3853 if (v !== v0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3854 clean = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3855 if (v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3856 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3857 point2 = intersect(point1, point0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3858 listener.point(point2[0], point2[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3859 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3860 point2 = intersect(point0, point1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3861 listener.point(point2[0], point2[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3862 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3863 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3864 point0 = point2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3865 } else if (notHemisphere && point0 && smallRadius ^ v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3866 var t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3867 if (!(c & c0) && (t = intersect(point1, point0, true))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3868 clean = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3869 if (smallRadius) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3870 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3871 listener.point(t[0][0], t[0][1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3872 listener.point(t[1][0], t[1][1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3873 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3874 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3875 listener.point(t[1][0], t[1][1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3876 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3877 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3878 listener.point(t[0][0], t[0][1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3879 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3880 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3881 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3882 if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3883 listener.point(point1[0], point1[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3884 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3885 point0 = point1, v0 = v, c0 = c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3886 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3887 lineEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3888 if (v0) listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3889 point0 = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3890 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3891 clean: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3892 return clean | (v00 && v0) << 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3893 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3894 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3895 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3896 function intersect(a, b, two) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3897 var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3898 var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3899 if (!determinant) return !two && a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3900 var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3901 d3_geo_cartesianAdd(A, B);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3902 var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3903 if (t2 < 0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3904 var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3905 d3_geo_cartesianAdd(q, A);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3906 q = d3_geo_spherical(q);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3907 if (!two) return q;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3908 var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3909 if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3910 var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3911 if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3912 if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3913 var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3914 d3_geo_cartesianAdd(q1, A);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3915 return [ q, d3_geo_spherical(q1) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3916 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3917 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3918 function code(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3919 var r = smallRadius ? radius : π - radius, code = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3920 if (λ < -r) code |= 1; else if (λ > r) code |= 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3921 if (φ < -r) code |= 4; else if (φ > r) code |= 8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3922 return code;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3923 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3924 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3925 function d3_geom_clipLine(x0, y0, x1, y1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3926 return function(line) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3927 var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3928 r = x0 - ax;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3929 if (!dx && r > 0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3930 r /= dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3931 if (dx < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3932 if (r < t0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3933 if (r < t1) t1 = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3934 } else if (dx > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3935 if (r > t1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3936 if (r > t0) t0 = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3937 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3938 r = x1 - ax;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3939 if (!dx && r < 0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3940 r /= dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3941 if (dx < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3942 if (r > t1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3943 if (r > t0) t0 = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3944 } else if (dx > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3945 if (r < t0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3946 if (r < t1) t1 = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3947 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3948 r = y0 - ay;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3949 if (!dy && r > 0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3950 r /= dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3951 if (dy < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3952 if (r < t0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3953 if (r < t1) t1 = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3954 } else if (dy > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3955 if (r > t1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3956 if (r > t0) t0 = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3957 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3958 r = y1 - ay;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3959 if (!dy && r < 0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3960 r /= dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3961 if (dy < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3962 if (r > t1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3963 if (r > t0) t0 = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3964 } else if (dy > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3965 if (r < t0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3966 if (r < t1) t1 = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3967 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3968 if (t0 > 0) line.a = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3969 x: ax + t0 * dx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3970 y: ay + t0 * dy
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3971 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3972 if (t1 < 1) line.b = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3973 x: ax + t1 * dx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3974 y: ay + t1 * dy
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3975 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3976 return line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3977 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3978 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3979 var d3_geo_clipExtentMAX = 1e9;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3980 d3.geo.clipExtent = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3981 var x0, y0, x1, y1, stream, clip, clipExtent = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3982 stream: function(output) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3983 if (stream) stream.valid = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3984 stream = clip(output);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3985 stream.valid = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3986 return stream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3987 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3988 extent: function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3989 if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3990 clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3991 if (stream) stream.valid = false, stream = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3992 return clipExtent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3993 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3994 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3995 return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3996 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3997 function d3_geo_clipExtent(x0, y0, x1, y1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3998 return function(listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
3999 var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4000 var clip = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4001 point: point,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4002 lineStart: lineStart,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4003 lineEnd: lineEnd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4004 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4005 listener = bufferListener;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4006 segments = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4007 polygon = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4008 clean = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4009 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4010 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4011 listener = listener_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4012 segments = d3.merge(segments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4013 var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4014 if (inside || visible) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4015 listener.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4016 if (inside) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4017 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4018 interpolate(null, null, 1, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4019 listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4020 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4021 if (visible) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4022 d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4023 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4024 listener.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4025 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4026 segments = polygon = ring = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4027 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4028 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4029 function insidePolygon(p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4030 var wn = 0, n = polygon.length, y = p[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4031 for (var i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4032 for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4033 b = v[j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4034 if (a[1] <= y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4035 if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4036 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4037 if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4038 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4039 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4040 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4041 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4042 return wn !== 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4043 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4044 function interpolate(from, to, direction, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4045 var a = 0, a1 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4046 if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4047 do {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4048 listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4049 } while ((a = (a + direction + 4) % 4) !== a1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4050 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4051 listener.point(to[0], to[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4052 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4053 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4054 function pointVisible(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4055 return x0 <= x && x <= x1 && y0 <= y && y <= y1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4056 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4057 function point(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4058 if (pointVisible(x, y)) listener.point(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4059 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4060 var x__, y__, v__, x_, y_, v_, first, clean;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4061 function lineStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4062 clip.point = linePoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4063 if (polygon) polygon.push(ring = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4064 first = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4065 v_ = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4066 x_ = y_ = NaN;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4067 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4068 function lineEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4069 if (segments) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4070 linePoint(x__, y__);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4071 if (v__ && v_) bufferListener.rejoin();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4072 segments.push(bufferListener.buffer());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4073 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4074 clip.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4075 if (v_) listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4076 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4077 function linePoint(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4078 x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4079 y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4080 var v = pointVisible(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4081 if (polygon) ring.push([ x, y ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4082 if (first) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4083 x__ = x, y__ = y, v__ = v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4084 first = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4085 if (v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4086 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4087 listener.point(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4088 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4089 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4090 if (v && v_) listener.point(x, y); else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4091 var l = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4092 a: {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4093 x: x_,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4094 y: y_
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4095 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4096 b: {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4097 x: x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4098 y: y
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4099 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4100 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4101 if (clipLine(l)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4102 if (!v_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4103 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4104 listener.point(l.a.x, l.a.y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4105 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4106 listener.point(l.b.x, l.b.y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4107 if (!v) listener.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4108 clean = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4109 } else if (v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4110 listener.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4111 listener.point(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4112 clean = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4113 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4114 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4115 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4116 x_ = x, y_ = y, v_ = v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4117 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4118 return clip;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4119 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4120 function corner(p, direction) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4121 return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4122 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4123 function compare(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4124 return comparePoints(a.x, b.x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4125 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4126 function comparePoints(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4127 var ca = corner(a, 1), cb = corner(b, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4128 return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4129 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4130 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4131 function d3_geo_conic(projectAt) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4132 var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4133 p.parallels = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4134 if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4135 return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4136 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4137 return p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4138 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4139 function d3_geo_conicEqualArea(φ0, φ1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4140 var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4141 function forward(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4142 var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4143 return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4144 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4145 forward.invert = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4146 var ρ0_y = ρ0 - y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4147 return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4148 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4149 return forward;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4150 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4151 (d3.geo.conicEqualArea = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4152 return d3_geo_conic(d3_geo_conicEqualArea);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4153 }).raw = d3_geo_conicEqualArea;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4154 d3.geo.albers = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4155 return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4156 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4157 d3.geo.albersUsa = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4158 var lower48 = d3.geo.albers();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4159 var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4160 var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4161 var point, pointStream = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4162 point: function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4163 point = [ x, y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4164 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4165 }, lower48Point, alaskaPoint, hawaiiPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4166 function albersUsa(coordinates) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4167 var x = coordinates[0], y = coordinates[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4168 point = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4169 (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4170 return point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4171 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4172 albersUsa.invert = function(coordinates) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4173 var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4174 return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4175 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4176 albersUsa.stream = function(stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4177 var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4178 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4179 point: function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4180 lower48Stream.point(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4181 alaskaStream.point(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4182 hawaiiStream.point(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4183 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4184 sphere: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4185 lower48Stream.sphere();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4186 alaskaStream.sphere();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4187 hawaiiStream.sphere();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4188 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4189 lineStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4190 lower48Stream.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4191 alaskaStream.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4192 hawaiiStream.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4193 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4194 lineEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4195 lower48Stream.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4196 alaskaStream.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4197 hawaiiStream.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4198 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4199 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4200 lower48Stream.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4201 alaskaStream.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4202 hawaiiStream.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4203 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4204 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4205 lower48Stream.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4206 alaskaStream.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4207 hawaiiStream.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4208 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4209 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4210 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4211 albersUsa.precision = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4212 if (!arguments.length) return lower48.precision();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4213 lower48.precision(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4214 alaska.precision(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4215 hawaii.precision(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4216 return albersUsa;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4217 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4218 albersUsa.scale = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4219 if (!arguments.length) return lower48.scale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4220 lower48.scale(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4221 alaska.scale(_ * .35);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4222 hawaii.scale(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4223 return albersUsa.translate(lower48.translate());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4224 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4225 albersUsa.translate = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4226 if (!arguments.length) return lower48.translate();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4227 var k = lower48.scale(), x = +_[0], y = +_[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4228 lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4229 alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4230 hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4231 return albersUsa;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4232 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4233 return albersUsa.scale(1070);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4234 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4235 var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4236 point: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4237 lineStart: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4238 lineEnd: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4239 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4240 d3_geo_pathAreaPolygon = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4241 d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4242 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4243 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4244 d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4245 d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4246 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4247 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4248 function d3_geo_pathAreaRingStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4249 var x00, y00, x0, y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4250 d3_geo_pathArea.point = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4251 d3_geo_pathArea.point = nextPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4252 x00 = x0 = x, y00 = y0 = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4253 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4254 function nextPoint(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4255 d3_geo_pathAreaPolygon += y0 * x - x0 * y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4256 x0 = x, y0 = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4257 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4258 d3_geo_pathArea.lineEnd = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4259 nextPoint(x00, y00);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4260 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4261 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4262 var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4263 var d3_geo_pathBounds = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4264 point: d3_geo_pathBoundsPoint,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4265 lineStart: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4266 lineEnd: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4267 polygonStart: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4268 polygonEnd: d3_noop
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4269 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4270 function d3_geo_pathBoundsPoint(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4271 if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4272 if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4273 if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4274 if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4275 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4276 function d3_geo_pathBuffer() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4277 var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4278 var stream = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4279 point: point,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4280 lineStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4281 stream.point = pointLineStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4282 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4283 lineEnd: lineEnd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4284 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4285 stream.lineEnd = lineEndPolygon;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4286 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4287 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4288 stream.lineEnd = lineEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4289 stream.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4290 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4291 pointRadius: function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4292 pointCircle = d3_geo_pathBufferCircle(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4293 return stream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4294 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4295 result: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4296 if (buffer.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4297 var result = buffer.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4298 buffer = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4299 return result;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4300 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4301 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4302 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4303 function point(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4304 buffer.push("M", x, ",", y, pointCircle);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4305 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4306 function pointLineStart(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4307 buffer.push("M", x, ",", y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4308 stream.point = pointLine;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4309 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4310 function pointLine(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4311 buffer.push("L", x, ",", y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4312 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4313 function lineEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4314 stream.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4315 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4316 function lineEndPolygon() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4317 buffer.push("Z");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4318 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4319 return stream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4320 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4321 function d3_geo_pathBufferCircle(radius) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4322 return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4323 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4324 var d3_geo_pathCentroid = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4325 point: d3_geo_pathCentroidPoint,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4326 lineStart: d3_geo_pathCentroidLineStart,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4327 lineEnd: d3_geo_pathCentroidLineEnd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4328 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4329 d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4330 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4331 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4332 d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4333 d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4334 d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4335 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4336 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4337 function d3_geo_pathCentroidPoint(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4338 d3_geo_centroidX0 += x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4339 d3_geo_centroidY0 += y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4340 ++d3_geo_centroidZ0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4341 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4342 function d3_geo_pathCentroidLineStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4343 var x0, y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4344 d3_geo_pathCentroid.point = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4345 d3_geo_pathCentroid.point = nextPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4346 d3_geo_pathCentroidPoint(x0 = x, y0 = y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4347 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4348 function nextPoint(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4349 var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4350 d3_geo_centroidX1 += z * (x0 + x) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4351 d3_geo_centroidY1 += z * (y0 + y) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4352 d3_geo_centroidZ1 += z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4353 d3_geo_pathCentroidPoint(x0 = x, y0 = y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4354 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4355 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4356 function d3_geo_pathCentroidLineEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4357 d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4358 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4359 function d3_geo_pathCentroidRingStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4360 var x00, y00, x0, y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4361 d3_geo_pathCentroid.point = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4362 d3_geo_pathCentroid.point = nextPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4363 d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4364 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4365 function nextPoint(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4366 var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4367 d3_geo_centroidX1 += z * (x0 + x) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4368 d3_geo_centroidY1 += z * (y0 + y) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4369 d3_geo_centroidZ1 += z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4370 z = y0 * x - x0 * y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4371 d3_geo_centroidX2 += z * (x0 + x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4372 d3_geo_centroidY2 += z * (y0 + y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4373 d3_geo_centroidZ2 += z * 3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4374 d3_geo_pathCentroidPoint(x0 = x, y0 = y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4375 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4376 d3_geo_pathCentroid.lineEnd = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4377 nextPoint(x00, y00);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4378 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4379 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4380 function d3_geo_pathContext(context) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4381 var pointRadius = 4.5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4382 var stream = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4383 point: point,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4384 lineStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4385 stream.point = pointLineStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4386 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4387 lineEnd: lineEnd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4388 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4389 stream.lineEnd = lineEndPolygon;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4390 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4391 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4392 stream.lineEnd = lineEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4393 stream.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4394 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4395 pointRadius: function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4396 pointRadius = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4397 return stream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4398 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4399 result: d3_noop
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4400 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4401 function point(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4402 context.moveTo(x + pointRadius, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4403 context.arc(x, y, pointRadius, 0, τ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4404 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4405 function pointLineStart(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4406 context.moveTo(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4407 stream.point = pointLine;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4408 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4409 function pointLine(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4410 context.lineTo(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4411 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4412 function lineEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4413 stream.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4414 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4415 function lineEndPolygon() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4416 context.closePath();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4417 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4418 return stream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4419 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4420 function d3_geo_resample(project) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4421 var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4422 function resample(stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4423 return (maxDepth ? resampleRecursive : resampleNone)(stream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4424 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4425 function resampleNone(stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4426 return d3_geo_transformPoint(stream, function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4427 x = project(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4428 stream.point(x[0], x[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4429 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4430 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4431 function resampleRecursive(stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4432 var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4433 var resample = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4434 point: point,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4435 lineStart: lineStart,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4436 lineEnd: lineEnd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4437 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4438 stream.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4439 resample.lineStart = ringStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4440 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4441 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4442 stream.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4443 resample.lineStart = lineStart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4444 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4445 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4446 function point(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4447 x = project(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4448 stream.point(x[0], x[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4449 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4450 function lineStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4451 x0 = NaN;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4452 resample.point = linePoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4453 stream.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4454 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4455 function linePoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4456 var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4457 resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4458 stream.point(x0, y0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4459 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4460 function lineEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4461 resample.point = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4462 stream.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4463 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4464 function ringStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4465 lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4466 resample.point = ringPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4467 resample.lineEnd = ringEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4468 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4469 function ringPoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4470 linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4471 resample.point = linePoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4472 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4473 function ringEnd() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4474 resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4475 resample.lineEnd = lineEnd;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4476 lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4477 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4478 return resample;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4479 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4480 function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4481 var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4482 if (d2 > 4 * δ2 && depth--) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4483 var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4484 if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4485 resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4486 stream.point(x2, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4487 resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4488 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4489 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4490 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4491 resample.precision = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4492 if (!arguments.length) return Math.sqrt(δ2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4493 maxDepth = (δ2 = _ * _) > 0 && 16;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4494 return resample;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4495 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4496 return resample;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4497 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4498 d3.geo.path = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4499 var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4500 function path(object) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4501 if (object) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4502 if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4503 if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4504 d3.geo.stream(object, cacheStream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4505 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4506 return contextStream.result();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4507 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4508 path.area = function(object) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4509 d3_geo_pathAreaSum = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4510 d3.geo.stream(object, projectStream(d3_geo_pathArea));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4511 return d3_geo_pathAreaSum;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4512 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4513 path.centroid = function(object) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4514 d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4515 d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4516 return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4517 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4518 path.bounds = function(object) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4519 d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4520 d3.geo.stream(object, projectStream(d3_geo_pathBounds));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4521 return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4522 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4523 path.projection = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4524 if (!arguments.length) return projection;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4525 projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4526 return reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4527 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4528 path.context = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4529 if (!arguments.length) return context;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4530 contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4531 if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4532 return reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4533 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4534 path.pointRadius = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4535 if (!arguments.length) return pointRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4536 pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4537 return path;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4538 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4539 function reset() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4540 cacheStream = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4541 return path;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4542 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4543 return path.projection(d3.geo.albersUsa()).context(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4544 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4545 function d3_geo_pathProjectStream(project) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4546 var resample = d3_geo_resample(function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4547 return project([ x * d3_degrees, y * d3_degrees ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4548 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4549 return function(stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4550 return d3_geo_projectionRadians(resample(stream));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4551 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4552 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4553 d3.geo.transform = function(methods) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4554 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4555 stream: function(stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4556 var transform = new d3_geo_transform(stream);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4557 for (var k in methods) transform[k] = methods[k];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4558 return transform;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4559 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4560 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4561 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4562 function d3_geo_transform(stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4563 this.stream = stream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4564 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4565 d3_geo_transform.prototype = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4566 point: function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4567 this.stream.point(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4568 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4569 sphere: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4570 this.stream.sphere();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4571 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4572 lineStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4573 this.stream.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4574 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4575 lineEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4576 this.stream.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4577 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4578 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4579 this.stream.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4580 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4581 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4582 this.stream.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4583 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4584 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4585 function d3_geo_transformPoint(stream, point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4586 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4587 point: point,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4588 sphere: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4589 stream.sphere();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4590 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4591 lineStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4592 stream.lineStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4593 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4594 lineEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4595 stream.lineEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4596 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4597 polygonStart: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4598 stream.polygonStart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4599 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4600 polygonEnd: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4601 stream.polygonEnd();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4602 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4603 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4604 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4605 d3.geo.projection = d3_geo_projection;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4606 d3.geo.projectionMutator = d3_geo_projectionMutator;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4607 function d3_geo_projection(project) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4608 return d3_geo_projectionMutator(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4609 return project;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4610 })();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4611 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4612 function d3_geo_projectionMutator(projectAt) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4613 var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4614 x = project(x, y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4615 return [ x[0] * k + δx, δy - x[1] * k ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4616 }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4617 function projection(point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4618 point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4619 return [ point[0] * k + δx, δy - point[1] * k ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4620 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4621 function invert(point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4622 point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4623 return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4624 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4625 projection.stream = function(output) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4626 if (stream) stream.valid = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4627 stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4628 stream.valid = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4629 return stream;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4630 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4631 projection.clipAngle = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4632 if (!arguments.length) return clipAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4633 preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4634 return invalidate();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4635 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4636 projection.clipExtent = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4637 if (!arguments.length) return clipExtent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4638 clipExtent = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4639 postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4640 return invalidate();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4641 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4642 projection.scale = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4643 if (!arguments.length) return k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4644 k = +_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4645 return reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4646 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4647 projection.translate = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4648 if (!arguments.length) return [ x, y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4649 x = +_[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4650 y = +_[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4651 return reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4652 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4653 projection.center = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4654 if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4655 λ = _[0] % 360 * d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4656 φ = _[1] % 360 * d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4657 return reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4658 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4659 projection.rotate = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4660 if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4661 δλ = _[0] % 360 * d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4662 δφ = _[1] % 360 * d3_radians;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4663 δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4664 return reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4665 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4666 d3.rebind(projection, projectResample, "precision");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4667 function reset() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4668 projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4669 var center = project(λ, φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4670 δx = x - center[0] * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4671 δy = y + center[1] * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4672 return invalidate();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4673 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4674 function invalidate() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4675 if (stream) stream.valid = false, stream = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4676 return projection;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4677 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4678 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4679 project = projectAt.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4680 projection.invert = project.invert && invert;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4681 return reset();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4682 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4683 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4684 function d3_geo_projectionRadians(stream) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4685 return d3_geo_transformPoint(stream, function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4686 stream.point(x * d3_radians, y * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4687 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4688 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4689 function d3_geo_equirectangular(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4690 return [ λ, φ ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4691 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4692 (d3.geo.equirectangular = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4693 return d3_geo_projection(d3_geo_equirectangular);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4694 }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4695 d3.geo.rotation = function(rotate) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4696 rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4697 function forward(coordinates) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4698 coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4699 return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4700 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4701 forward.invert = function(coordinates) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4702 coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4703 return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4704 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4705 return forward;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4706 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4707 function d3_geo_identityRotation(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4708 return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4709 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4710 d3_geo_identityRotation.invert = d3_geo_equirectangular;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4711 function d3_geo_rotation(δλ, δφ, δγ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4712 return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4713 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4714 function d3_geo_forwardRotationλ(δλ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4715 return function(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4716 return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4717 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4718 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4719 function d3_geo_rotationλ(δλ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4720 var rotation = d3_geo_forwardRotationλ(δλ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4721 rotation.invert = d3_geo_forwardRotationλ(-δλ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4722 return rotation;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4723 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4724 function d3_geo_rotationφγ(δφ, δγ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4725 var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4726 function rotation(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4727 var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4728 return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4729 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4730 rotation.invert = function(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4731 var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4732 return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4733 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4734 return rotation;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4735 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4736 d3.geo.circle = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4737 var origin = [ 0, 0 ], angle, precision = 6, interpolate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4738 function circle() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4739 var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4740 interpolate(null, null, 1, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4741 point: function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4742 ring.push(x = rotate(x, y));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4743 x[0] *= d3_degrees, x[1] *= d3_degrees;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4744 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4745 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4746 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4747 type: "Polygon",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4748 coordinates: [ ring ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4749 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4750 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4751 circle.origin = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4752 if (!arguments.length) return origin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4753 origin = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4754 return circle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4755 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4756 circle.angle = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4757 if (!arguments.length) return angle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4758 interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4759 return circle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4760 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4761 circle.precision = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4762 if (!arguments.length) return precision;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4763 interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4764 return circle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4765 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4766 return circle.angle(90);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4767 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4768 function d3_geo_circleInterpolate(radius, precision) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4769 var cr = Math.cos(radius), sr = Math.sin(radius);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4770 return function(from, to, direction, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4771 var step = direction * precision;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4772 if (from != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4773 from = d3_geo_circleAngle(cr, from);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4774 to = d3_geo_circleAngle(cr, to);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4775 if (direction > 0 ? from < to : from > to) from += direction * τ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4776 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4777 from = radius + direction * τ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4778 to = radius - .5 * step;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4779 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4780 for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4781 listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4782 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4783 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4784 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4785 function d3_geo_circleAngle(cr, point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4786 var a = d3_geo_cartesian(point);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4787 a[0] -= cr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4788 d3_geo_cartesianNormalize(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4789 var angle = d3_acos(-a[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4790 return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4791 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4792 d3.geo.distance = function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4793 var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4794 return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4795 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4796 d3.geo.graticule = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4797 var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4798 function graticule() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4799 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4800 type: "MultiLineString",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4801 coordinates: lines()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4802 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4803 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4804 function lines() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4805 return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4806 return abs(x % DX) > ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4807 }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4808 return abs(y % DY) > ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4809 }).map(y));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4810 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4811 graticule.lines = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4812 return lines().map(function(coordinates) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4813 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4814 type: "LineString",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4815 coordinates: coordinates
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4816 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4817 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4818 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4819 graticule.outline = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4820 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4821 type: "Polygon",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4822 coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4823 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4824 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4825 graticule.extent = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4826 if (!arguments.length) return graticule.minorExtent();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4827 return graticule.majorExtent(_).minorExtent(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4828 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4829 graticule.majorExtent = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4830 if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4831 X0 = +_[0][0], X1 = +_[1][0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4832 Y0 = +_[0][1], Y1 = +_[1][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4833 if (X0 > X1) _ = X0, X0 = X1, X1 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4834 if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4835 return graticule.precision(precision);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4836 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4837 graticule.minorExtent = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4838 if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4839 x0 = +_[0][0], x1 = +_[1][0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4840 y0 = +_[0][1], y1 = +_[1][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4841 if (x0 > x1) _ = x0, x0 = x1, x1 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4842 if (y0 > y1) _ = y0, y0 = y1, y1 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4843 return graticule.precision(precision);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4844 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4845 graticule.step = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4846 if (!arguments.length) return graticule.minorStep();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4847 return graticule.majorStep(_).minorStep(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4848 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4849 graticule.majorStep = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4850 if (!arguments.length) return [ DX, DY ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4851 DX = +_[0], DY = +_[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4852 return graticule;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4853 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4854 graticule.minorStep = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4855 if (!arguments.length) return [ dx, dy ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4856 dx = +_[0], dy = +_[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4857 return graticule;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4858 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4859 graticule.precision = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4860 if (!arguments.length) return precision;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4861 precision = +_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4862 x = d3_geo_graticuleX(y0, y1, 90);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4863 y = d3_geo_graticuleY(x0, x1, precision);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4864 X = d3_geo_graticuleX(Y0, Y1, 90);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4865 Y = d3_geo_graticuleY(X0, X1, precision);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4866 return graticule;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4867 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4868 return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4869 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4870 function d3_geo_graticuleX(y0, y1, dy) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4871 var y = d3.range(y0, y1 - ε, dy).concat(y1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4872 return function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4873 return y.map(function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4874 return [ x, y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4875 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4876 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4877 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4878 function d3_geo_graticuleY(x0, x1, dx) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4879 var x = d3.range(x0, x1 - ε, dx).concat(x1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4880 return function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4881 return x.map(function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4882 return [ x, y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4883 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4884 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4885 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4886 function d3_source(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4887 return d.source;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4888 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4889 function d3_target(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4890 return d.target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4891 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4892 d3.geo.greatArc = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4893 var source = d3_source, source_, target = d3_target, target_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4894 function greatArc() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4895 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4896 type: "LineString",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4897 coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4898 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4899 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4900 greatArc.distance = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4901 return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4902 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4903 greatArc.source = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4904 if (!arguments.length) return source;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4905 source = _, source_ = typeof _ === "function" ? null : _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4906 return greatArc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4907 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4908 greatArc.target = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4909 if (!arguments.length) return target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4910 target = _, target_ = typeof _ === "function" ? null : _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4911 return greatArc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4912 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4913 greatArc.precision = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4914 return arguments.length ? greatArc : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4915 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4916 return greatArc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4917 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4918 d3.geo.interpolate = function(source, target) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4919 return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4920 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4921 function d3_geo_interpolate(x0, y0, x1, y1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4922 var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4923 var interpolate = d ? function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4924 var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4925 return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4926 } : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4927 return [ x0 * d3_degrees, y0 * d3_degrees ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4928 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4929 interpolate.distance = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4930 return interpolate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4931 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4932 d3.geo.length = function(object) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4933 d3_geo_lengthSum = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4934 d3.geo.stream(object, d3_geo_length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4935 return d3_geo_lengthSum;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4936 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4937 var d3_geo_lengthSum;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4938 var d3_geo_length = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4939 sphere: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4940 point: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4941 lineStart: d3_geo_lengthLineStart,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4942 lineEnd: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4943 polygonStart: d3_noop,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4944 polygonEnd: d3_noop
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4945 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4946 function d3_geo_lengthLineStart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4947 var λ0, sinφ0, cosφ0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4948 d3_geo_length.point = function(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4949 λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4950 d3_geo_length.point = nextPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4951 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4952 d3_geo_length.lineEnd = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4953 d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4954 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4955 function nextPoint(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4956 var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4957 d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4958 λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4959 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4960 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4961 function d3_geo_azimuthal(scale, angle) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4962 function azimuthal(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4963 var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4964 return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4965 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4966 azimuthal.invert = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4967 var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4968 return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4969 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4970 return azimuthal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4971 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4972 var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4973 return Math.sqrt(2 / (1 + cosλcosφ));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4974 }, function(ρ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4975 return 2 * Math.asin(ρ / 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4976 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4977 (d3.geo.azimuthalEqualArea = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4978 return d3_geo_projection(d3_geo_azimuthalEqualArea);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4979 }).raw = d3_geo_azimuthalEqualArea;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4980 var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4981 var c = Math.acos(cosλcosφ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4982 return c && c / Math.sin(c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4983 }, d3_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4984 (d3.geo.azimuthalEquidistant = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4985 return d3_geo_projection(d3_geo_azimuthalEquidistant);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4986 }).raw = d3_geo_azimuthalEquidistant;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4987 function d3_geo_conicConformal(φ0, φ1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4988 var cosφ0 = Math.cos(φ0), t = function(φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4989 return Math.tan(π / 4 + φ / 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4990 }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4991 if (!n) return d3_geo_mercator;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4992 function forward(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4993 if (F > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4994 if (φ < -halfπ + ε) φ = -halfπ + ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4995 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4996 if (φ > halfπ - ε) φ = halfπ - ε;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4997 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4998 var ρ = F / Math.pow(t(φ), n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
4999 return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5000 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5001 forward.invert = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5002 var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5003 return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5004 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5005 return forward;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5006 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5007 (d3.geo.conicConformal = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5008 return d3_geo_conic(d3_geo_conicConformal);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5009 }).raw = d3_geo_conicConformal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5010 function d3_geo_conicEquidistant(φ0, φ1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5011 var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5012 if (abs(n) < ε) return d3_geo_equirectangular;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5013 function forward(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5014 var ρ = G - φ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5015 return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5016 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5017 forward.invert = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5018 var ρ0_y = G - y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5019 return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5020 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5021 return forward;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5022 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5023 (d3.geo.conicEquidistant = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5024 return d3_geo_conic(d3_geo_conicEquidistant);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5025 }).raw = d3_geo_conicEquidistant;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5026 var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5027 return 1 / cosλcosφ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5028 }, Math.atan);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5029 (d3.geo.gnomonic = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5030 return d3_geo_projection(d3_geo_gnomonic);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5031 }).raw = d3_geo_gnomonic;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5032 function d3_geo_mercator(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5033 return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5034 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5035 d3_geo_mercator.invert = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5036 return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5037 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5038 function d3_geo_mercatorProjection(project) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5039 var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5040 m.scale = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5041 var v = scale.apply(m, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5042 return v === m ? clipAuto ? m.clipExtent(null) : m : v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5043 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5044 m.translate = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5045 var v = translate.apply(m, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5046 return v === m ? clipAuto ? m.clipExtent(null) : m : v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5047 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5048 m.clipExtent = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5049 var v = clipExtent.apply(m, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5050 if (v === m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5051 if (clipAuto = _ == null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5052 var k = π * scale(), t = translate();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5053 clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5054 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5055 } else if (clipAuto) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5056 v = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5057 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5058 return v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5059 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5060 return m.clipExtent(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5061 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5062 (d3.geo.mercator = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5063 return d3_geo_mercatorProjection(d3_geo_mercator);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5064 }).raw = d3_geo_mercator;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5065 var d3_geo_orthographic = d3_geo_azimuthal(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5066 return 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5067 }, Math.asin);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5068 (d3.geo.orthographic = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5069 return d3_geo_projection(d3_geo_orthographic);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5070 }).raw = d3_geo_orthographic;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5071 var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5072 return 1 / (1 + cosλcosφ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5073 }, function(ρ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5074 return 2 * Math.atan(ρ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5075 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5076 (d3.geo.stereographic = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5077 return d3_geo_projection(d3_geo_stereographic);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5078 }).raw = d3_geo_stereographic;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5079 function d3_geo_transverseMercator(λ, φ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5080 return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5081 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5082 d3_geo_transverseMercator.invert = function(x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5083 return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5084 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5085 (d3.geo.transverseMercator = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5086 var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5087 projection.center = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5088 return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5089 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5090 projection.rotate = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5091 return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5092 [ _[0], _[1], _[2] - 90 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5093 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5094 return rotate([ 0, 0, 90 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5095 }).raw = d3_geo_transverseMercator;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5096 d3.geom = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5097 function d3_geom_pointX(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5098 return d[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5099 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5100 function d3_geom_pointY(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5101 return d[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5102 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5103 d3.geom.hull = function(vertices) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5104 var x = d3_geom_pointX, y = d3_geom_pointY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5105 if (arguments.length) return hull(vertices);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5106 function hull(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5107 if (data.length < 3) return [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5108 var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5109 for (i = 0; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5110 points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5111 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5112 points.sort(d3_geom_hullOrder);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5113 for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5114 var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5115 var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5116 for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5117 for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5118 return polygon;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5119 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5120 hull.x = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5121 return arguments.length ? (x = _, hull) : x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5122 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5123 hull.y = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5124 return arguments.length ? (y = _, hull) : y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5125 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5126 return hull;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5127 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5128 function d3_geom_hullUpper(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5129 var n = points.length, hull = [ 0, 1 ], hs = 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5130 for (var i = 2; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5131 while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5132 hull[hs++] = i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5133 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5134 return hull.slice(0, hs);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5135 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5136 function d3_geom_hullOrder(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5137 return a[0] - b[0] || a[1] - b[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5138 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5139 d3.geom.polygon = function(coordinates) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5140 d3_subclass(coordinates, d3_geom_polygonPrototype);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5141 return coordinates;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5142 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5143 var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5144 d3_geom_polygonPrototype.area = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5145 var i = -1, n = this.length, a, b = this[n - 1], area = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5146 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5147 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5148 b = this[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5149 area += a[1] * b[0] - a[0] * b[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5150 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5151 return area * .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5152 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5153 d3_geom_polygonPrototype.centroid = function(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5154 var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5155 if (!arguments.length) k = -1 / (6 * this.area());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5156 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5157 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5158 b = this[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5159 c = a[0] * b[1] - b[0] * a[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5160 x += (a[0] + b[0]) * c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5161 y += (a[1] + b[1]) * c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5162 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5163 return [ x * k, y * k ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5164 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5165 d3_geom_polygonPrototype.clip = function(subject) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5166 var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5167 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5168 input = subject.slice();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5169 subject.length = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5170 b = this[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5171 c = input[(m = input.length - closed) - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5172 j = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5173 while (++j < m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5174 d = input[j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5175 if (d3_geom_polygonInside(d, a, b)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5176 if (!d3_geom_polygonInside(c, a, b)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5177 subject.push(d3_geom_polygonIntersect(c, d, a, b));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5178 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5179 subject.push(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5180 } else if (d3_geom_polygonInside(c, a, b)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5181 subject.push(d3_geom_polygonIntersect(c, d, a, b));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5182 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5183 c = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5184 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5185 if (closed) subject.push(subject[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5186 a = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5187 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5188 return subject;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5189 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5190 function d3_geom_polygonInside(p, a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5191 return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5192 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5193 function d3_geom_polygonIntersect(c, d, a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5194 var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5195 return [ x1 + ua * x21, y1 + ua * y21 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5196 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5197 function d3_geom_polygonClosed(coordinates) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5198 var a = coordinates[0], b = coordinates[coordinates.length - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5199 return !(a[0] - b[0] || a[1] - b[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5200 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5201 var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5202 function d3_geom_voronoiBeach() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5203 d3_geom_voronoiRedBlackNode(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5204 this.edge = this.site = this.circle = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5205 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5206 function d3_geom_voronoiCreateBeach(site) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5207 var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5208 beach.site = site;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5209 return beach;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5210 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5211 function d3_geom_voronoiDetachBeach(beach) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5212 d3_geom_voronoiDetachCircle(beach);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5213 d3_geom_voronoiBeaches.remove(beach);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5214 d3_geom_voronoiBeachPool.push(beach);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5215 d3_geom_voronoiRedBlackNode(beach);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5216 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5217 function d3_geom_voronoiRemoveBeach(beach) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5218 var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5219 x: x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5220 y: y
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5221 }, previous = beach.P, next = beach.N, disappearing = [ beach ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5222 d3_geom_voronoiDetachBeach(beach);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5223 var lArc = previous;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5224 while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5225 previous = lArc.P;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5226 disappearing.unshift(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5227 d3_geom_voronoiDetachBeach(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5228 lArc = previous;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5229 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5230 disappearing.unshift(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5231 d3_geom_voronoiDetachCircle(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5232 var rArc = next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5233 while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5234 next = rArc.N;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5235 disappearing.push(rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5236 d3_geom_voronoiDetachBeach(rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5237 rArc = next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5238 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5239 disappearing.push(rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5240 d3_geom_voronoiDetachCircle(rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5241 var nArcs = disappearing.length, iArc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5242 for (iArc = 1; iArc < nArcs; ++iArc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5243 rArc = disappearing[iArc];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5244 lArc = disappearing[iArc - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5245 d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5246 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5247 lArc = disappearing[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5248 rArc = disappearing[nArcs - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5249 rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5250 d3_geom_voronoiAttachCircle(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5251 d3_geom_voronoiAttachCircle(rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5252 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5253 function d3_geom_voronoiAddBeach(site) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5254 var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5255 while (node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5256 dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5257 if (dxl > ε) node = node.L; else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5258 dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5259 if (dxr > ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5260 if (!node.R) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5261 lArc = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5262 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5263 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5264 node = node.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5265 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5266 if (dxl > -ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5267 lArc = node.P;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5268 rArc = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5269 } else if (dxr > -ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5270 lArc = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5271 rArc = node.N;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5272 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5273 lArc = rArc = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5274 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5275 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5276 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5277 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5278 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5279 var newArc = d3_geom_voronoiCreateBeach(site);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5280 d3_geom_voronoiBeaches.insert(lArc, newArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5281 if (!lArc && !rArc) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5282 if (lArc === rArc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5283 d3_geom_voronoiDetachCircle(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5284 rArc = d3_geom_voronoiCreateBeach(lArc.site);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5285 d3_geom_voronoiBeaches.insert(newArc, rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5286 newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5287 d3_geom_voronoiAttachCircle(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5288 d3_geom_voronoiAttachCircle(rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5289 return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5290 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5291 if (!rArc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5292 newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5293 return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5294 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5295 d3_geom_voronoiDetachCircle(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5296 d3_geom_voronoiDetachCircle(rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5297 var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5298 x: (cy * hb - by * hc) / d + ax,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5299 y: (bx * hc - cx * hb) / d + ay
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5300 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5301 d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5302 newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5303 rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5304 d3_geom_voronoiAttachCircle(lArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5305 d3_geom_voronoiAttachCircle(rArc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5306 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5307 function d3_geom_voronoiLeftBreakPoint(arc, directrix) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5308 var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5309 if (!pby2) return rfocx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5310 var lArc = arc.P;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5311 if (!lArc) return -Infinity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5312 site = lArc.site;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5313 var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5314 if (!plby2) return lfocx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5315 var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5316 if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5317 return (rfocx + lfocx) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5318 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5319 function d3_geom_voronoiRightBreakPoint(arc, directrix) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5320 var rArc = arc.N;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5321 if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5322 var site = arc.site;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5323 return site.y === directrix ? site.x : Infinity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5324 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5325 function d3_geom_voronoiCell(site) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5326 this.site = site;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5327 this.edges = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5328 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5329 d3_geom_voronoiCell.prototype.prepare = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5330 var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5331 while (iHalfEdge--) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5332 edge = halfEdges[iHalfEdge].edge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5333 if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5334 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5335 halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5336 return halfEdges.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5337 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5338 function d3_geom_voronoiCloseCells(extent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5339 var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5340 while (iCell--) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5341 cell = cells[iCell];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5342 if (!cell || !cell.prepare()) continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5343 halfEdges = cell.edges;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5344 nHalfEdges = halfEdges.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5345 iHalfEdge = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5346 while (iHalfEdge < nHalfEdges) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5347 end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5348 start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5349 if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5350 halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5351 x: x0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5352 y: abs(x2 - x0) < ε ? y2 : y1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5353 } : abs(y3 - y1) < ε && x1 - x3 > ε ? {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5354 x: abs(y2 - y1) < ε ? x2 : x1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5355 y: y1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5356 } : abs(x3 - x1) < ε && y3 - y0 > ε ? {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5357 x: x1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5358 y: abs(x2 - x1) < ε ? y2 : y0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5359 } : abs(y3 - y0) < ε && x3 - x0 > ε ? {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5360 x: abs(y2 - y0) < ε ? x2 : x0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5361 y: y0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5362 } : null), cell.site, null));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5363 ++nHalfEdges;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5364 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5365 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5366 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5367 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5368 function d3_geom_voronoiHalfEdgeOrder(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5369 return b.angle - a.angle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5370 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5371 function d3_geom_voronoiCircle() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5372 d3_geom_voronoiRedBlackNode(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5373 this.x = this.y = this.arc = this.site = this.cy = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5374 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5375 function d3_geom_voronoiAttachCircle(arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5376 var lArc = arc.P, rArc = arc.N;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5377 if (!lArc || !rArc) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5378 var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5379 if (lSite === rSite) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5380 var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5381 var d = 2 * (ax * cy - ay * cx);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5382 if (d >= -ε2) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5383 var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5384 var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5385 circle.arc = arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5386 circle.site = cSite;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5387 circle.x = x + bx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5388 circle.y = cy + Math.sqrt(x * x + y * y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5389 circle.cy = cy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5390 arc.circle = circle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5391 var before = null, node = d3_geom_voronoiCircles._;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5392 while (node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5393 if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5394 if (node.L) node = node.L; else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5395 before = node.P;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5396 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5397 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5398 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5399 if (node.R) node = node.R; else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5400 before = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5401 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5402 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5403 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5404 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5405 d3_geom_voronoiCircles.insert(before, circle);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5406 if (!before) d3_geom_voronoiFirstCircle = circle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5407 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5408 function d3_geom_voronoiDetachCircle(arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5409 var circle = arc.circle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5410 if (circle) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5411 if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5412 d3_geom_voronoiCircles.remove(circle);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5413 d3_geom_voronoiCirclePool.push(circle);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5414 d3_geom_voronoiRedBlackNode(circle);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5415 arc.circle = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5416 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5417 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5418 function d3_geom_voronoiClipEdges(extent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5419 var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5420 while (i--) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5421 e = edges[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5422 if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5423 e.a = e.b = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5424 edges.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5425 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5426 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5427 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5428 function d3_geom_voronoiConnectEdge(edge, extent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5429 var vb = edge.b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5430 if (vb) return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5431 var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5432 if (ry === ly) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5433 if (fx < x0 || fx >= x1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5434 if (lx > rx) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5435 if (!va) va = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5436 x: fx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5437 y: y0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5438 }; else if (va.y >= y1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5439 vb = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5440 x: fx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5441 y: y1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5442 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5443 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5444 if (!va) va = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5445 x: fx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5446 y: y1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5447 }; else if (va.y < y0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5448 vb = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5449 x: fx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5450 y: y0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5451 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5452 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5453 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5454 fm = (lx - rx) / (ry - ly);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5455 fb = fy - fm * fx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5456 if (fm < -1 || fm > 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5457 if (lx > rx) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5458 if (!va) va = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5459 x: (y0 - fb) / fm,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5460 y: y0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5461 }; else if (va.y >= y1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5462 vb = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5463 x: (y1 - fb) / fm,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5464 y: y1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5465 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5466 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5467 if (!va) va = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5468 x: (y1 - fb) / fm,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5469 y: y1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5470 }; else if (va.y < y0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5471 vb = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5472 x: (y0 - fb) / fm,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5473 y: y0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5474 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5475 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5476 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5477 if (ly < ry) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5478 if (!va) va = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5479 x: x0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5480 y: fm * x0 + fb
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5481 }; else if (va.x >= x1) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5482 vb = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5483 x: x1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5484 y: fm * x1 + fb
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5485 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5486 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5487 if (!va) va = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5488 x: x1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5489 y: fm * x1 + fb
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5490 }; else if (va.x < x0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5491 vb = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5492 x: x0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5493 y: fm * x0 + fb
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5494 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5495 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5496 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5497 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5498 edge.a = va;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5499 edge.b = vb;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5500 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5501 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5502 function d3_geom_voronoiEdge(lSite, rSite) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5503 this.l = lSite;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5504 this.r = rSite;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5505 this.a = this.b = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5506 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5507 function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5508 var edge = new d3_geom_voronoiEdge(lSite, rSite);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5509 d3_geom_voronoiEdges.push(edge);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5510 if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5511 if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5512 d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5513 d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5514 return edge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5515 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5516 function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5517 var edge = new d3_geom_voronoiEdge(lSite, null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5518 edge.a = va;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5519 edge.b = vb;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5520 d3_geom_voronoiEdges.push(edge);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5521 return edge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5522 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5523 function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5524 if (!edge.a && !edge.b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5525 edge.a = vertex;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5526 edge.l = lSite;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5527 edge.r = rSite;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5528 } else if (edge.l === rSite) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5529 edge.b = vertex;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5530 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5531 edge.a = vertex;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5532 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5533 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5534 function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5535 var va = edge.a, vb = edge.b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5536 this.edge = edge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5537 this.site = lSite;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5538 this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5539 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5540 d3_geom_voronoiHalfEdge.prototype = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5541 start: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5542 return this.edge.l === this.site ? this.edge.a : this.edge.b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5543 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5544 end: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5545 return this.edge.l === this.site ? this.edge.b : this.edge.a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5546 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5547 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5548 function d3_geom_voronoiRedBlackTree() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5549 this._ = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5550 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5551 function d3_geom_voronoiRedBlackNode(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5552 node.U = node.C = node.L = node.R = node.P = node.N = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5553 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5554 d3_geom_voronoiRedBlackTree.prototype = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5555 insert: function(after, node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5556 var parent, grandpa, uncle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5557 if (after) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5558 node.P = after;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5559 node.N = after.N;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5560 if (after.N) after.N.P = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5561 after.N = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5562 if (after.R) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5563 after = after.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5564 while (after.L) after = after.L;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5565 after.L = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5566 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5567 after.R = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5568 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5569 parent = after;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5570 } else if (this._) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5571 after = d3_geom_voronoiRedBlackFirst(this._);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5572 node.P = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5573 node.N = after;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5574 after.P = after.L = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5575 parent = after;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5576 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5577 node.P = node.N = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5578 this._ = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5579 parent = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5580 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5581 node.L = node.R = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5582 node.U = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5583 node.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5584 after = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5585 while (parent && parent.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5586 grandpa = parent.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5587 if (parent === grandpa.L) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5588 uncle = grandpa.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5589 if (uncle && uncle.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5590 parent.C = uncle.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5591 grandpa.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5592 after = grandpa;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5593 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5594 if (after === parent.R) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5595 d3_geom_voronoiRedBlackRotateLeft(this, parent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5596 after = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5597 parent = after.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5598 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5599 parent.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5600 grandpa.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5601 d3_geom_voronoiRedBlackRotateRight(this, grandpa);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5602 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5603 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5604 uncle = grandpa.L;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5605 if (uncle && uncle.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5606 parent.C = uncle.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5607 grandpa.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5608 after = grandpa;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5609 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5610 if (after === parent.L) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5611 d3_geom_voronoiRedBlackRotateRight(this, parent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5612 after = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5613 parent = after.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5614 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5615 parent.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5616 grandpa.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5617 d3_geom_voronoiRedBlackRotateLeft(this, grandpa);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5618 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5619 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5620 parent = after.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5621 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5622 this._.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5623 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5624 remove: function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5625 if (node.N) node.N.P = node.P;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5626 if (node.P) node.P.N = node.N;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5627 node.N = node.P = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5628 var parent = node.U, sibling, left = node.L, right = node.R, next, red;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5629 if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5630 if (parent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5631 if (parent.L === node) parent.L = next; else parent.R = next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5632 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5633 this._ = next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5634 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5635 if (left && right) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5636 red = next.C;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5637 next.C = node.C;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5638 next.L = left;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5639 left.U = next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5640 if (next !== right) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5641 parent = next.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5642 next.U = node.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5643 node = next.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5644 parent.L = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5645 next.R = right;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5646 right.U = next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5647 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5648 next.U = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5649 parent = next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5650 node = next.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5651 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5652 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5653 red = node.C;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5654 node = next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5655 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5656 if (node) node.U = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5657 if (red) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5658 if (node && node.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5659 node.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5660 return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5661 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5662 do {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5663 if (node === this._) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5664 if (node === parent.L) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5665 sibling = parent.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5666 if (sibling.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5667 sibling.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5668 parent.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5669 d3_geom_voronoiRedBlackRotateLeft(this, parent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5670 sibling = parent.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5671 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5672 if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5673 if (!sibling.R || !sibling.R.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5674 sibling.L.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5675 sibling.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5676 d3_geom_voronoiRedBlackRotateRight(this, sibling);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5677 sibling = parent.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5678 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5679 sibling.C = parent.C;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5680 parent.C = sibling.R.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5681 d3_geom_voronoiRedBlackRotateLeft(this, parent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5682 node = this._;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5683 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5684 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5685 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5686 sibling = parent.L;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5687 if (sibling.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5688 sibling.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5689 parent.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5690 d3_geom_voronoiRedBlackRotateRight(this, parent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5691 sibling = parent.L;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5692 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5693 if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5694 if (!sibling.L || !sibling.L.C) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5695 sibling.R.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5696 sibling.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5697 d3_geom_voronoiRedBlackRotateLeft(this, sibling);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5698 sibling = parent.L;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5699 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5700 sibling.C = parent.C;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5701 parent.C = sibling.L.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5702 d3_geom_voronoiRedBlackRotateRight(this, parent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5703 node = this._;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5704 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5705 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5706 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5707 sibling.C = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5708 node = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5709 parent = parent.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5710 } while (!node.C);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5711 if (node) node.C = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5712 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5713 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5714 function d3_geom_voronoiRedBlackRotateLeft(tree, node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5715 var p = node, q = node.R, parent = p.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5716 if (parent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5717 if (parent.L === p) parent.L = q; else parent.R = q;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5718 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5719 tree._ = q;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5720 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5721 q.U = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5722 p.U = q;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5723 p.R = q.L;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5724 if (p.R) p.R.U = p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5725 q.L = p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5726 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5727 function d3_geom_voronoiRedBlackRotateRight(tree, node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5728 var p = node, q = node.L, parent = p.U;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5729 if (parent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5730 if (parent.L === p) parent.L = q; else parent.R = q;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5731 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5732 tree._ = q;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5733 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5734 q.U = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5735 p.U = q;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5736 p.L = q.R;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5737 if (p.L) p.L.U = p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5738 q.R = p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5739 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5740 function d3_geom_voronoiRedBlackFirst(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5741 while (node.L) node = node.L;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5742 return node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5743 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5744 function d3_geom_voronoi(sites, bbox) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5745 var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5746 d3_geom_voronoiEdges = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5747 d3_geom_voronoiCells = new Array(sites.length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5748 d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5749 d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5750 while (true) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5751 circle = d3_geom_voronoiFirstCircle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5752 if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5753 if (site.x !== x0 || site.y !== y0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5754 d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5755 d3_geom_voronoiAddBeach(site);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5756 x0 = site.x, y0 = site.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5757 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5758 site = sites.pop();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5759 } else if (circle) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5760 d3_geom_voronoiRemoveBeach(circle.arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5761 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5762 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5763 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5764 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5765 if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5766 var diagram = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5767 cells: d3_geom_voronoiCells,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5768 edges: d3_geom_voronoiEdges
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5769 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5770 d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5771 return diagram;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5772 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5773 function d3_geom_voronoiVertexOrder(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5774 return b.y - a.y || b.x - a.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5775 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5776 d3.geom.voronoi = function(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5777 var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5778 if (points) return voronoi(points);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5779 function voronoi(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5780 var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5781 d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5782 var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5783 var s = e.start();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5784 return [ s.x, s.y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5785 }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5786 polygon.point = data[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5787 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5788 return polygons;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5789 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5790 function sites(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5791 return data.map(function(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5792 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5793 x: Math.round(fx(d, i) / ε) * ε,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5794 y: Math.round(fy(d, i) / ε) * ε,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5795 i: i
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5796 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5797 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5798 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5799 voronoi.links = function(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5800 return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5801 return edge.l && edge.r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5802 }).map(function(edge) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5803 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5804 source: data[edge.l.i],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5805 target: data[edge.r.i]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5806 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5807 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5808 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5809 voronoi.triangles = function(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5810 var triangles = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5811 d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5812 var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5813 while (++j < m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5814 e0 = e1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5815 s0 = s1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5816 e1 = edges[j].edge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5817 s1 = e1.l === site ? e1.r : e1.l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5818 if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5819 triangles.push([ data[i], data[s0.i], data[s1.i] ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5820 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5821 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5822 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5823 return triangles;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5824 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5825 voronoi.x = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5826 return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5827 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5828 voronoi.y = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5829 return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5830 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5831 voronoi.clipExtent = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5832 if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5833 clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5834 return voronoi;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5835 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5836 voronoi.size = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5837 if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5838 return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5839 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5840 return voronoi;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5841 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5842 var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5843 function d3_geom_voronoiTriangleArea(a, b, c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5844 return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5845 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5846 d3.geom.delaunay = function(vertices) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5847 return d3.geom.voronoi().triangles(vertices);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5848 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5849 d3.geom.quadtree = function(points, x1, y1, x2, y2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5850 var x = d3_geom_pointX, y = d3_geom_pointY, compat;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5851 if (compat = arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5852 x = d3_geom_quadtreeCompatX;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5853 y = d3_geom_quadtreeCompatY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5854 if (compat === 3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5855 y2 = y1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5856 x2 = x1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5857 y1 = x1 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5858 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5859 return quadtree(points);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5860 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5861 function quadtree(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5862 var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5863 if (x1 != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5864 x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5865 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5866 x2_ = y2_ = -(x1_ = y1_ = Infinity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5867 xs = [], ys = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5868 n = data.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5869 if (compat) for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5870 d = data[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5871 if (d.x < x1_) x1_ = d.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5872 if (d.y < y1_) y1_ = d.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5873 if (d.x > x2_) x2_ = d.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5874 if (d.y > y2_) y2_ = d.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5875 xs.push(d.x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5876 ys.push(d.y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5877 } else for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5878 var x_ = +fx(d = data[i], i), y_ = +fy(d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5879 if (x_ < x1_) x1_ = x_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5880 if (y_ < y1_) y1_ = y_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5881 if (x_ > x2_) x2_ = x_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5882 if (y_ > y2_) y2_ = y_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5883 xs.push(x_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5884 ys.push(y_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5885 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5886 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5887 var dx = x2_ - x1_, dy = y2_ - y1_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5888 if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5889 function insert(n, d, x, y, x1, y1, x2, y2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5890 if (isNaN(x) || isNaN(y)) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5891 if (n.leaf) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5892 var nx = n.x, ny = n.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5893 if (nx != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5894 if (abs(nx - x) + abs(ny - y) < .01) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5895 insertChild(n, d, x, y, x1, y1, x2, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5896 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5897 var nPoint = n.point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5898 n.x = n.y = n.point = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5899 insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5900 insertChild(n, d, x, y, x1, y1, x2, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5901 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5902 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5903 n.x = x, n.y = y, n.point = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5904 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5905 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5906 insertChild(n, d, x, y, x1, y1, x2, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5907 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5908 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5909 function insertChild(n, d, x, y, x1, y1, x2, y2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5910 var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5911 n.leaf = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5912 n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5913 if (right) x1 = xm; else x2 = xm;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5914 if (below) y1 = ym; else y2 = ym;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5915 insert(n, d, x, y, x1, y1, x2, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5916 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5917 var root = d3_geom_quadtreeNode();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5918 root.add = function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5919 insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5920 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5921 root.visit = function(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5922 d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5923 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5924 root.find = function(point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5925 return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5926 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5927 i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5928 if (x1 == null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5929 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5930 insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5931 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5932 --i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5933 } else data.forEach(root.add);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5934 xs = ys = data = d = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5935 return root;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5936 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5937 quadtree.x = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5938 return arguments.length ? (x = _, quadtree) : x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5939 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5940 quadtree.y = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5941 return arguments.length ? (y = _, quadtree) : y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5942 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5943 quadtree.extent = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5944 if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5945 if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5946 y2 = +_[1][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5947 return quadtree;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5948 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5949 quadtree.size = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5950 if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5951 if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5952 return quadtree;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5953 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5954 return quadtree;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5955 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5956 function d3_geom_quadtreeCompatX(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5957 return d.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5958 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5959 function d3_geom_quadtreeCompatY(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5960 return d.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5961 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5962 function d3_geom_quadtreeNode() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5963 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5964 leaf: true,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5965 nodes: [],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5966 point: null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5967 x: null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5968 y: null
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5969 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5970 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5971 function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5972 if (!f(node, x1, y1, x2, y2)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5973 var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5974 if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5975 if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5976 if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5977 if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5978 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5979 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5980 function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5981 var minDistance2 = Infinity, closestPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5982 (function find(node, x1, y1, x2, y2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5983 if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5984 if (point = node.point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5985 var point, dx = x - point[0], dy = y - point[1], distance2 = dx * dx + dy * dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5986 if (distance2 < minDistance2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5987 var distance = Math.sqrt(minDistance2 = distance2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5988 x0 = x - distance, y0 = y - distance;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5989 x3 = x + distance, y3 = y + distance;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5990 closestPoint = point;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5991 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5992 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5993 var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5994 for (var i = below << 1 | right, j = i + 4; i < j; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5995 if (node = children[i & 3]) switch (i & 3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5996 case 0:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5997 find(node, x1, y1, xm, ym);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5998 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
5999
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6000 case 1:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6001 find(node, xm, y1, x2, ym);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6002 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6003
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6004 case 2:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6005 find(node, x1, ym, xm, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6006 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6007
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6008 case 3:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6009 find(node, xm, ym, x2, y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6010 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6011 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6012 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6013 })(root, x0, y0, x3, y3);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6014 return closestPoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6015 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6016 d3.interpolateRgb = d3_interpolateRgb;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6017 function d3_interpolateRgb(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6018 a = d3.rgb(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6019 b = d3.rgb(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6020 var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6021 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6022 return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6023 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6024 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6025 d3.interpolateObject = d3_interpolateObject;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6026 function d3_interpolateObject(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6027 var i = {}, c = {}, k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6028 for (k in a) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6029 if (k in b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6030 i[k] = d3_interpolate(a[k], b[k]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6031 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6032 c[k] = a[k];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6033 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6034 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6035 for (k in b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6036 if (!(k in a)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6037 c[k] = b[k];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6038 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6039 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6040 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6041 for (k in i) c[k] = i[k](t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6042 return c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6043 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6044 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6045 d3.interpolateNumber = d3_interpolateNumber;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6046 function d3_interpolateNumber(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6047 a = +a, b = +b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6048 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6049 return a * (1 - t) + b * t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6050 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6051 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6052 d3.interpolateString = d3_interpolateString;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6053 function d3_interpolateString(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6054 var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6055 a = a + "", b = b + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6056 while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6057 if ((bs = bm.index) > bi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6058 bs = b.slice(bi, bs);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6059 if (s[i]) s[i] += bs; else s[++i] = bs;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6060 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6061 if ((am = am[0]) === (bm = bm[0])) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6062 if (s[i]) s[i] += bm; else s[++i] = bm;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6063 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6064 s[++i] = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6065 q.push({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6066 i: i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6067 x: d3_interpolateNumber(am, bm)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6068 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6069 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6070 bi = d3_interpolate_numberB.lastIndex;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6071 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6072 if (bi < b.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6073 bs = b.slice(bi);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6074 if (s[i]) s[i] += bs; else s[++i] = bs;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6075 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6076 return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6077 return b(t) + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6078 }) : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6079 return b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6080 } : (b = q.length, function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6081 for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6082 return s.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6083 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6084 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6085 var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6086 d3.interpolate = d3_interpolate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6087 function d3_interpolate(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6088 var i = d3.interpolators.length, f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6089 while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6090 return f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6091 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6092 d3.interpolators = [ function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6093 var t = typeof b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6094 return (t === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6095 } ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6096 d3.interpolateArray = d3_interpolateArray;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6097 function d3_interpolateArray(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6098 var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6099 for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6100 for (;i < na; ++i) c[i] = a[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6101 for (;i < nb; ++i) c[i] = b[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6102 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6103 for (i = 0; i < n0; ++i) c[i] = x[i](t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6104 return c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6105 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6106 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6107 var d3_ease_default = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6108 return d3_identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6109 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6110 var d3_ease = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6111 linear: d3_ease_default,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6112 poly: d3_ease_poly,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6113 quad: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6114 return d3_ease_quad;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6115 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6116 cubic: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6117 return d3_ease_cubic;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6118 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6119 sin: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6120 return d3_ease_sin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6121 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6122 exp: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6123 return d3_ease_exp;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6124 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6125 circle: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6126 return d3_ease_circle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6127 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6128 elastic: d3_ease_elastic,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6129 back: d3_ease_back,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6130 bounce: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6131 return d3_ease_bounce;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6132 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6133 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6134 var d3_ease_mode = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6135 "in": d3_identity,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6136 out: d3_ease_reverse,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6137 "in-out": d3_ease_reflect,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6138 "out-in": function(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6139 return d3_ease_reflect(d3_ease_reverse(f));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6140 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6141 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6142 d3.ease = function(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6143 var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6144 t = d3_ease.get(t) || d3_ease_default;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6145 m = d3_ease_mode.get(m) || d3_identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6146 return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6147 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6148 function d3_ease_clamp(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6149 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6150 return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6151 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6152 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6153 function d3_ease_reverse(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6154 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6155 return 1 - f(1 - t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6156 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6157 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6158 function d3_ease_reflect(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6159 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6160 return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6161 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6162 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6163 function d3_ease_quad(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6164 return t * t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6165 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6166 function d3_ease_cubic(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6167 return t * t * t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6168 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6169 function d3_ease_cubicInOut(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6170 if (t <= 0) return 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6171 if (t >= 1) return 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6172 var t2 = t * t, t3 = t2 * t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6173 return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6174 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6175 function d3_ease_poly(e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6176 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6177 return Math.pow(t, e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6178 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6179 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6180 function d3_ease_sin(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6181 return 1 - Math.cos(t * halfπ);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6182 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6183 function d3_ease_exp(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6184 return Math.pow(2, 10 * (t - 1));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6185 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6186 function d3_ease_circle(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6187 return 1 - Math.sqrt(1 - t * t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6188 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6189 function d3_ease_elastic(a, p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6190 var s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6191 if (arguments.length < 2) p = .45;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6192 if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6193 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6194 return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6195 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6196 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6197 function d3_ease_back(s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6198 if (!s) s = 1.70158;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6199 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6200 return t * t * ((s + 1) * t - s);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6201 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6202 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6203 function d3_ease_bounce(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6204 return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6205 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6206 d3.interpolateHcl = d3_interpolateHcl;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6207 function d3_interpolateHcl(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6208 a = d3.hcl(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6209 b = d3.hcl(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6210 var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6211 if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6212 if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6213 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6214 return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6215 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6216 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6217 d3.interpolateHsl = d3_interpolateHsl;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6218 function d3_interpolateHsl(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6219 a = d3.hsl(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6220 b = d3.hsl(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6221 var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6222 if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6223 if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6224 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6225 return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6226 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6227 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6228 d3.interpolateLab = d3_interpolateLab;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6229 function d3_interpolateLab(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6230 a = d3.lab(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6231 b = d3.lab(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6232 var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6233 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6234 return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6235 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6236 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6237 d3.interpolateRound = d3_interpolateRound;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6238 function d3_interpolateRound(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6239 b -= a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6240 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6241 return Math.round(a + b * t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6242 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6243 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6244 d3.transform = function(string) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6245 var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6246 return (d3.transform = function(string) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6247 if (string != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6248 g.setAttribute("transform", string);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6249 var t = g.transform.baseVal.consolidate();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6250 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6251 return new d3_transform(t ? t.matrix : d3_transformIdentity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6252 })(string);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6253 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6254 function d3_transform(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6255 var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6256 if (r0[0] * r1[1] < r1[0] * r0[1]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6257 r0[0] *= -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6258 r0[1] *= -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6259 kx *= -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6260 kz *= -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6261 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6262 this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6263 this.translate = [ m.e, m.f ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6264 this.scale = [ kx, ky ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6265 this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6266 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6267 d3_transform.prototype.toString = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6268 return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6269 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6270 function d3_transformDot(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6271 return a[0] * b[0] + a[1] * b[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6272 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6273 function d3_transformNormalize(a) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6274 var k = Math.sqrt(d3_transformDot(a, a));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6275 if (k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6276 a[0] /= k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6277 a[1] /= k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6278 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6279 return k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6280 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6281 function d3_transformCombine(a, b, k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6282 a[0] += k * b[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6283 a[1] += k * b[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6284 return a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6285 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6286 var d3_transformIdentity = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6287 a: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6288 b: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6289 c: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6290 d: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6291 e: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6292 f: 0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6293 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6294 d3.interpolateTransform = d3_interpolateTransform;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6295 function d3_interpolateTransform(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6296 var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6297 if (ta[0] != tb[0] || ta[1] != tb[1]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6298 s.push("translate(", null, ",", null, ")");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6299 q.push({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6300 i: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6301 x: d3_interpolateNumber(ta[0], tb[0])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6302 }, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6303 i: 3,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6304 x: d3_interpolateNumber(ta[1], tb[1])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6305 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6306 } else if (tb[0] || tb[1]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6307 s.push("translate(" + tb + ")");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6308 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6309 s.push("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6310 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6311 if (ra != rb) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6312 if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6313 q.push({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6314 i: s.push(s.pop() + "rotate(", null, ")") - 2,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6315 x: d3_interpolateNumber(ra, rb)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6316 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6317 } else if (rb) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6318 s.push(s.pop() + "rotate(" + rb + ")");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6319 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6320 if (wa != wb) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6321 q.push({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6322 i: s.push(s.pop() + "skewX(", null, ")") - 2,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6323 x: d3_interpolateNumber(wa, wb)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6324 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6325 } else if (wb) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6326 s.push(s.pop() + "skewX(" + wb + ")");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6327 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6328 if (ka[0] != kb[0] || ka[1] != kb[1]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6329 n = s.push(s.pop() + "scale(", null, ",", null, ")");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6330 q.push({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6331 i: n - 4,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6332 x: d3_interpolateNumber(ka[0], kb[0])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6333 }, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6334 i: n - 2,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6335 x: d3_interpolateNumber(ka[1], kb[1])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6336 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6337 } else if (kb[0] != 1 || kb[1] != 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6338 s.push(s.pop() + "scale(" + kb + ")");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6339 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6340 n = q.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6341 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6342 var i = -1, o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6343 while (++i < n) s[(o = q[i]).i] = o.x(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6344 return s.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6345 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6346 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6347 function d3_uninterpolateNumber(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6348 b = (b -= a = +a) || 1 / b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6349 return function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6350 return (x - a) / b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6351 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6352 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6353 function d3_uninterpolateClamp(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6354 b = (b -= a = +a) || 1 / b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6355 return function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6356 return Math.max(0, Math.min(1, (x - a) / b));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6357 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6358 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6359 d3.layout = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6360 d3.layout.bundle = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6361 return function(links) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6362 var paths = [], i = -1, n = links.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6363 while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6364 return paths;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6365 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6366 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6367 function d3_layout_bundlePath(link) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6368 var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6369 while (start !== lca) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6370 start = start.parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6371 points.push(start);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6372 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6373 var k = points.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6374 while (end !== lca) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6375 points.splice(k, 0, end);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6376 end = end.parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6377 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6378 return points;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6379 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6380 function d3_layout_bundleAncestors(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6381 var ancestors = [], parent = node.parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6382 while (parent != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6383 ancestors.push(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6384 node = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6385 parent = parent.parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6386 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6387 ancestors.push(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6388 return ancestors;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6389 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6390 function d3_layout_bundleLeastCommonAncestor(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6391 if (a === b) return a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6392 var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6393 while (aNode === bNode) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6394 sharedNode = aNode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6395 aNode = aNodes.pop();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6396 bNode = bNodes.pop();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6397 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6398 return sharedNode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6399 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6400 d3.layout.chord = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6401 var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6402 function relayout() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6403 var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6404 chords = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6405 groups = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6406 k = 0, i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6407 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6408 x = 0, j = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6409 while (++j < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6410 x += matrix[i][j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6411 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6412 groupSums.push(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6413 subgroupIndex.push(d3.range(n));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6414 k += x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6415 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6416 if (sortGroups) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6417 groupIndex.sort(function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6418 return sortGroups(groupSums[a], groupSums[b]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6419 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6420 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6421 if (sortSubgroups) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6422 subgroupIndex.forEach(function(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6423 d.sort(function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6424 return sortSubgroups(matrix[i][a], matrix[i][b]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6425 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6426 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6427 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6428 k = (τ - padding * n) / k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6429 x = 0, i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6430 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6431 x0 = x, j = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6432 while (++j < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6433 var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6434 subgroups[di + "-" + dj] = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6435 index: di,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6436 subindex: dj,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6437 startAngle: a0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6438 endAngle: a1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6439 value: v
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6440 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6441 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6442 groups[di] = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6443 index: di,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6444 startAngle: x0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6445 endAngle: x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6446 value: (x - x0) / k
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6447 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6448 x += padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6449 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6450 i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6451 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6452 j = i - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6453 while (++j < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6454 var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6455 if (source.value || target.value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6456 chords.push(source.value < target.value ? {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6457 source: target,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6458 target: source
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6459 } : {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6460 source: source,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6461 target: target
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6462 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6463 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6464 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6465 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6466 if (sortChords) resort();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6467 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6468 function resort() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6469 chords.sort(function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6470 return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6471 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6472 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6473 chord.matrix = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6474 if (!arguments.length) return matrix;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6475 n = (matrix = x) && matrix.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6476 chords = groups = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6477 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6478 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6479 chord.padding = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6480 if (!arguments.length) return padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6481 padding = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6482 chords = groups = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6483 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6484 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6485 chord.sortGroups = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6486 if (!arguments.length) return sortGroups;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6487 sortGroups = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6488 chords = groups = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6489 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6490 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6491 chord.sortSubgroups = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6492 if (!arguments.length) return sortSubgroups;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6493 sortSubgroups = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6494 chords = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6495 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6496 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6497 chord.sortChords = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6498 if (!arguments.length) return sortChords;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6499 sortChords = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6500 if (chords) resort();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6501 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6502 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6503 chord.chords = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6504 if (!chords) relayout();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6505 return chords;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6506 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6507 chord.groups = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6508 if (!groups) relayout();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6509 return groups;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6510 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6511 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6512 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6513 d3.layout.force = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6514 var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6515 function repulse(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6516 return function(quad, x1, _, x2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6517 if (quad.point !== node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6518 var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6519 if (dw * dw / theta2 < dn) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6520 if (dn < chargeDistance2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6521 var k = quad.charge / dn;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6522 node.px -= dx * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6523 node.py -= dy * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6524 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6525 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6526 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6527 if (quad.point && dn && dn < chargeDistance2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6528 var k = quad.pointCharge / dn;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6529 node.px -= dx * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6530 node.py -= dy * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6531 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6532 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6533 return !quad.charge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6534 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6535 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6536 force.tick = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6537 if ((alpha *= .99) < .005) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6538 event.end({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6539 type: "end",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6540 alpha: alpha = 0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6541 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6542 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6543 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6544 var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6545 for (i = 0; i < m; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6546 o = links[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6547 s = o.source;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6548 t = o.target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6549 x = t.x - s.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6550 y = t.y - s.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6551 if (l = x * x + y * y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6552 l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6553 x *= l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6554 y *= l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6555 t.x -= x * (k = s.weight / (t.weight + s.weight));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6556 t.y -= y * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6557 s.x += x * (k = 1 - k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6558 s.y += y * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6559 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6560 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6561 if (k = alpha * gravity) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6562 x = size[0] / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6563 y = size[1] / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6564 i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6565 if (k) while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6566 o = nodes[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6567 o.x += (x - o.x) * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6568 o.y += (y - o.y) * k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6569 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6570 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6571 if (charge) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6572 d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6573 i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6574 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6575 if (!(o = nodes[i]).fixed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6576 q.visit(repulse(o));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6577 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6578 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6579 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6580 i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6581 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6582 o = nodes[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6583 if (o.fixed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6584 o.x = o.px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6585 o.y = o.py;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6586 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6587 o.x -= (o.px - (o.px = o.x)) * friction;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6588 o.y -= (o.py - (o.py = o.y)) * friction;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6589 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6590 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6591 event.tick({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6592 type: "tick",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6593 alpha: alpha
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6594 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6595 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6596 force.nodes = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6597 if (!arguments.length) return nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6598 nodes = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6599 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6600 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6601 force.links = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6602 if (!arguments.length) return links;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6603 links = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6604 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6605 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6606 force.size = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6607 if (!arguments.length) return size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6608 size = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6609 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6610 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6611 force.linkDistance = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6612 if (!arguments.length) return linkDistance;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6613 linkDistance = typeof x === "function" ? x : +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6614 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6615 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6616 force.distance = force.linkDistance;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6617 force.linkStrength = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6618 if (!arguments.length) return linkStrength;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6619 linkStrength = typeof x === "function" ? x : +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6620 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6621 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6622 force.friction = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6623 if (!arguments.length) return friction;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6624 friction = +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6625 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6626 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6627 force.charge = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6628 if (!arguments.length) return charge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6629 charge = typeof x === "function" ? x : +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6630 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6631 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6632 force.chargeDistance = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6633 if (!arguments.length) return Math.sqrt(chargeDistance2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6634 chargeDistance2 = x * x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6635 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6636 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6637 force.gravity = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6638 if (!arguments.length) return gravity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6639 gravity = +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6640 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6641 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6642 force.theta = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6643 if (!arguments.length) return Math.sqrt(theta2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6644 theta2 = x * x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6645 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6646 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6647 force.alpha = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6648 if (!arguments.length) return alpha;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6649 x = +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6650 if (alpha) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6651 if (x > 0) alpha = x; else alpha = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6652 } else if (x > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6653 event.start({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6654 type: "start",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6655 alpha: alpha = x
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6656 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6657 d3.timer(force.tick);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6658 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6659 return force;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6660 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6661 force.start = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6662 var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6663 for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6664 (o = nodes[i]).index = i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6665 o.weight = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6666 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6667 for (i = 0; i < m; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6668 o = links[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6669 if (typeof o.source == "number") o.source = nodes[o.source];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6670 if (typeof o.target == "number") o.target = nodes[o.target];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6671 ++o.source.weight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6672 ++o.target.weight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6673 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6674 for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6675 o = nodes[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6676 if (isNaN(o.x)) o.x = position("x", w);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6677 if (isNaN(o.y)) o.y = position("y", h);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6678 if (isNaN(o.px)) o.px = o.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6679 if (isNaN(o.py)) o.py = o.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6680 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6681 distances = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6682 if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6683 strengths = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6684 if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6685 charges = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6686 if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6687 function position(dimension, size) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6688 if (!neighbors) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6689 neighbors = new Array(n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6690 for (j = 0; j < n; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6691 neighbors[j] = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6692 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6693 for (j = 0; j < m; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6694 var o = links[j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6695 neighbors[o.source.index].push(o.target);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6696 neighbors[o.target.index].push(o.source);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6697 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6698 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6699 var candidates = neighbors[i], j = -1, m = candidates.length, x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6700 while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6701 return Math.random() * size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6702 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6703 return force.resume();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6704 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6705 force.resume = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6706 return force.alpha(.1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6707 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6708 force.stop = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6709 return force.alpha(0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6710 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6711 force.drag = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6712 if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6713 if (!arguments.length) return drag;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6714 this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6715 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6716 function dragmove(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6717 d.px = d3.event.x, d.py = d3.event.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6718 force.resume();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6719 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6720 return d3.rebind(force, event, "on");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6721 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6722 function d3_layout_forceDragstart(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6723 d.fixed |= 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6724 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6725 function d3_layout_forceDragend(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6726 d.fixed &= ~6;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6727 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6728 function d3_layout_forceMouseover(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6729 d.fixed |= 4;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6730 d.px = d.x, d.py = d.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6731 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6732 function d3_layout_forceMouseout(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6733 d.fixed &= ~4;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6734 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6735 function d3_layout_forceAccumulate(quad, alpha, charges) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6736 var cx = 0, cy = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6737 quad.charge = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6738 if (!quad.leaf) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6739 var nodes = quad.nodes, n = nodes.length, i = -1, c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6740 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6741 c = nodes[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6742 if (c == null) continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6743 d3_layout_forceAccumulate(c, alpha, charges);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6744 quad.charge += c.charge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6745 cx += c.charge * c.cx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6746 cy += c.charge * c.cy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6747 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6748 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6749 if (quad.point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6750 if (!quad.leaf) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6751 quad.point.x += Math.random() - .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6752 quad.point.y += Math.random() - .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6753 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6754 var k = alpha * charges[quad.point.index];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6755 quad.charge += quad.pointCharge = k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6756 cx += k * quad.point.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6757 cy += k * quad.point.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6758 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6759 quad.cx = cx / quad.charge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6760 quad.cy = cy / quad.charge;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6761 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6762 var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6763 d3.layout.hierarchy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6764 var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6765 function hierarchy(root) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6766 var stack = [ root ], nodes = [], node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6767 root.depth = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6768 while ((node = stack.pop()) != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6769 nodes.push(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6770 if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6771 var n, childs, child;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6772 while (--n >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6773 stack.push(child = childs[n]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6774 child.parent = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6775 child.depth = node.depth + 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6776 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6777 if (value) node.value = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6778 node.children = childs;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6779 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6780 if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6781 delete node.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6782 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6783 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6784 d3_layout_hierarchyVisitAfter(root, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6785 var childs, parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6786 if (sort && (childs = node.children)) childs.sort(sort);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6787 if (value && (parent = node.parent)) parent.value += node.value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6788 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6789 return nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6790 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6791 hierarchy.sort = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6792 if (!arguments.length) return sort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6793 sort = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6794 return hierarchy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6795 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6796 hierarchy.children = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6797 if (!arguments.length) return children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6798 children = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6799 return hierarchy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6800 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6801 hierarchy.value = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6802 if (!arguments.length) return value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6803 value = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6804 return hierarchy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6805 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6806 hierarchy.revalue = function(root) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6807 if (value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6808 d3_layout_hierarchyVisitBefore(root, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6809 if (node.children) node.value = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6810 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6811 d3_layout_hierarchyVisitAfter(root, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6812 var parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6813 if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6814 if (parent = node.parent) parent.value += node.value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6815 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6816 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6817 return root;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6818 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6819 return hierarchy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6820 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6821 function d3_layout_hierarchyRebind(object, hierarchy) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6822 d3.rebind(object, hierarchy, "sort", "children", "value");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6823 object.nodes = object;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6824 object.links = d3_layout_hierarchyLinks;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6825 return object;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6826 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6827 function d3_layout_hierarchyVisitBefore(node, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6828 var nodes = [ node ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6829 while ((node = nodes.pop()) != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6830 callback(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6831 if ((children = node.children) && (n = children.length)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6832 var n, children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6833 while (--n >= 0) nodes.push(children[n]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6834 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6835 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6836 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6837 function d3_layout_hierarchyVisitAfter(node, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6838 var nodes = [ node ], nodes2 = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6839 while ((node = nodes.pop()) != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6840 nodes2.push(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6841 if ((children = node.children) && (n = children.length)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6842 var i = -1, n, children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6843 while (++i < n) nodes.push(children[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6844 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6845 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6846 while ((node = nodes2.pop()) != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6847 callback(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6848 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6849 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6850 function d3_layout_hierarchyChildren(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6851 return d.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6852 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6853 function d3_layout_hierarchyValue(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6854 return d.value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6855 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6856 function d3_layout_hierarchySort(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6857 return b.value - a.value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6858 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6859 function d3_layout_hierarchyLinks(nodes) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6860 return d3.merge(nodes.map(function(parent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6861 return (parent.children || []).map(function(child) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6862 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6863 source: parent,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6864 target: child
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6865 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6866 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6867 }));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6868 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6869 d3.layout.partition = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6870 var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6871 function position(node, x, dx, dy) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6872 var children = node.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6873 node.x = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6874 node.y = node.depth * dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6875 node.dx = dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6876 node.dy = dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6877 if (children && (n = children.length)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6878 var i = -1, n, c, d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6879 dx = node.value ? dx / node.value : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6880 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6881 position(c = children[i], x, d = c.value * dx, dy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6882 x += d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6883 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6884 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6885 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6886 function depth(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6887 var children = node.children, d = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6888 if (children && (n = children.length)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6889 var i = -1, n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6890 while (++i < n) d = Math.max(d, depth(children[i]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6891 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6892 return 1 + d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6893 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6894 function partition(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6895 var nodes = hierarchy.call(this, d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6896 position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6897 return nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6898 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6899 partition.size = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6900 if (!arguments.length) return size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6901 size = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6902 return partition;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6903 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6904 return d3_layout_hierarchyRebind(partition, hierarchy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6905 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6906 d3.layout.pie = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6907 var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6908 function pie(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6909 var n = data.length, values = data.map(function(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6910 return +value.call(pie, d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6911 }), a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === "function" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), k = (da - n * pa) / d3.sum(values), index = d3.range(n), arcs = [], v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6912 if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6913 return values[j] - values[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6914 } : function(i, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6915 return sort(data[i], data[j]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6916 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6917 index.forEach(function(i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6918 arcs[i] = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6919 data: data[i],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6920 value: v = values[i],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6921 startAngle: a,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6922 endAngle: a += v * k + pa,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6923 padAngle: p
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6924 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6925 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6926 return arcs;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6927 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6928 pie.value = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6929 if (!arguments.length) return value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6930 value = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6931 return pie;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6932 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6933 pie.sort = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6934 if (!arguments.length) return sort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6935 sort = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6936 return pie;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6937 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6938 pie.startAngle = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6939 if (!arguments.length) return startAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6940 startAngle = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6941 return pie;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6942 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6943 pie.endAngle = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6944 if (!arguments.length) return endAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6945 endAngle = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6946 return pie;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6947 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6948 pie.padAngle = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6949 if (!arguments.length) return padAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6950 padAngle = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6951 return pie;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6952 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6953 return pie;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6954 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6955 var d3_layout_pieSortByValue = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6956 d3.layout.stack = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6957 var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6958 function stack(data, index) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6959 if (!(n = data.length)) return data;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6960 var series = data.map(function(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6961 return values.call(stack, d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6962 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6963 var points = series.map(function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6964 return d.map(function(v, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6965 return [ x.call(stack, v, i), y.call(stack, v, i) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6966 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6967 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6968 var orders = order.call(stack, points, index);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6969 series = d3.permute(series, orders);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6970 points = d3.permute(points, orders);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6971 var offsets = offset.call(stack, points, index);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6972 var m = series[0].length, n, i, j, o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6973 for (j = 0; j < m; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6974 out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6975 for (i = 1; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6976 out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6977 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6978 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6979 return data;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6980 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6981 stack.values = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6982 if (!arguments.length) return values;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6983 values = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6984 return stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6985 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6986 stack.order = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6987 if (!arguments.length) return order;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6988 order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6989 return stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6990 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6991 stack.offset = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6992 if (!arguments.length) return offset;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6993 offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6994 return stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6995 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6996 stack.x = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6997 if (!arguments.length) return x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6998 x = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
6999 return stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7000 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7001 stack.y = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7002 if (!arguments.length) return y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7003 y = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7004 return stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7005 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7006 stack.out = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7007 if (!arguments.length) return out;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7008 out = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7009 return stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7010 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7011 return stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7012 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7013 function d3_layout_stackX(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7014 return d.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7015 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7016 function d3_layout_stackY(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7017 return d.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7018 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7019 function d3_layout_stackOut(d, y0, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7020 d.y0 = y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7021 d.y = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7022 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7023 var d3_layout_stackOrders = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7024 "inside-out": function(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7025 var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7026 return max[a] - max[b];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7027 }), top = 0, bottom = 0, tops = [], bottoms = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7028 for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7029 j = index[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7030 if (top < bottom) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7031 top += sums[j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7032 tops.push(j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7033 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7034 bottom += sums[j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7035 bottoms.push(j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7036 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7037 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7038 return bottoms.reverse().concat(tops);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7039 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7040 reverse: function(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7041 return d3.range(data.length).reverse();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7042 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7043 "default": d3_layout_stackOrderDefault
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7044 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7045 var d3_layout_stackOffsets = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7046 silhouette: function(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7047 var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7048 for (j = 0; j < m; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7049 for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7050 if (o > max) max = o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7051 sums.push(o);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7052 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7053 for (j = 0; j < m; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7054 y0[j] = (max - sums[j]) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7055 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7056 return y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7057 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7058 wiggle: function(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7059 var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7060 y0[0] = o = o0 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7061 for (j = 1; j < m; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7062 for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7063 for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7064 for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7065 s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7066 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7067 s2 += s3 * data[i][j][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7068 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7069 y0[j] = o -= s1 ? s2 / s1 * dx : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7070 if (o < o0) o0 = o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7071 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7072 for (j = 0; j < m; ++j) y0[j] -= o0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7073 return y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7074 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7075 expand: function(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7076 var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7077 for (j = 0; j < m; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7078 for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7079 if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7080 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7081 for (j = 0; j < m; ++j) y0[j] = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7082 return y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7083 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7084 zero: d3_layout_stackOffsetZero
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7085 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7086 function d3_layout_stackOrderDefault(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7087 return d3.range(data.length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7088 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7089 function d3_layout_stackOffsetZero(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7090 var j = -1, m = data[0].length, y0 = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7091 while (++j < m) y0[j] = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7092 return y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7093 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7094 function d3_layout_stackMaxIndex(array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7095 var i = 1, j = 0, v = array[0][1], k, n = array.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7096 for (;i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7097 if ((k = array[i][1]) > v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7098 j = i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7099 v = k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7100 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7101 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7102 return j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7103 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7104 function d3_layout_stackReduceSum(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7105 return d.reduce(d3_layout_stackSum, 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7106 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7107 function d3_layout_stackSum(p, d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7108 return p + d[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7109 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7110 d3.layout.histogram = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7111 var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7112 function histogram(data, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7113 var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7114 while (++i < m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7115 bin = bins[i] = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7116 bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7117 bin.y = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7118 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7119 if (m > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7120 i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7121 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7122 x = values[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7123 if (x >= range[0] && x <= range[1]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7124 bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7125 bin.y += k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7126 bin.push(data[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7127 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7128 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7129 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7130 return bins;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7131 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7132 histogram.value = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7133 if (!arguments.length) return valuer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7134 valuer = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7135 return histogram;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7136 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7137 histogram.range = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7138 if (!arguments.length) return ranger;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7139 ranger = d3_functor(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7140 return histogram;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7141 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7142 histogram.bins = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7143 if (!arguments.length) return binner;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7144 binner = typeof x === "number" ? function(range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7145 return d3_layout_histogramBinFixed(range, x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7146 } : d3_functor(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7147 return histogram;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7148 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7149 histogram.frequency = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7150 if (!arguments.length) return frequency;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7151 frequency = !!x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7152 return histogram;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7153 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7154 return histogram;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7155 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7156 function d3_layout_histogramBinSturges(range, values) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7157 return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7158 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7159 function d3_layout_histogramBinFixed(range, n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7160 var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7161 while (++x <= n) f[x] = m * x + b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7162 return f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7163 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7164 function d3_layout_histogramRange(values) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7165 return [ d3.min(values), d3.max(values) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7166 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7167 d3.layout.pack = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7168 var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7169 function pack(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7170 var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7171 return radius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7172 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7173 root.x = root.y = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7174 d3_layout_hierarchyVisitAfter(root, function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7175 d.r = +r(d.value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7176 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7177 d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7178 if (padding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7179 var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7180 d3_layout_hierarchyVisitAfter(root, function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7181 d.r += dr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7182 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7183 d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7184 d3_layout_hierarchyVisitAfter(root, function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7185 d.r -= dr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7186 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7187 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7188 d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7189 return nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7190 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7191 pack.size = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7192 if (!arguments.length) return size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7193 size = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7194 return pack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7195 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7196 pack.radius = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7197 if (!arguments.length) return radius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7198 radius = _ == null || typeof _ === "function" ? _ : +_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7199 return pack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7200 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7201 pack.padding = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7202 if (!arguments.length) return padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7203 padding = +_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7204 return pack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7205 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7206 return d3_layout_hierarchyRebind(pack, hierarchy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7207 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7208 function d3_layout_packSort(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7209 return a.value - b.value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7210 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7211 function d3_layout_packInsert(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7212 var c = a._pack_next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7213 a._pack_next = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7214 b._pack_prev = a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7215 b._pack_next = c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7216 c._pack_prev = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7217 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7218 function d3_layout_packSplice(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7219 a._pack_next = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7220 b._pack_prev = a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7221 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7222 function d3_layout_packIntersects(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7223 var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7224 return .999 * dr * dr > dx * dx + dy * dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7225 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7226 function d3_layout_packSiblings(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7227 if (!(nodes = node.children) || !(n = nodes.length)) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7228 var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7229 function bound(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7230 xMin = Math.min(node.x - node.r, xMin);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7231 xMax = Math.max(node.x + node.r, xMax);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7232 yMin = Math.min(node.y - node.r, yMin);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7233 yMax = Math.max(node.y + node.r, yMax);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7234 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7235 nodes.forEach(d3_layout_packLink);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7236 a = nodes[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7237 a.x = -a.r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7238 a.y = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7239 bound(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7240 if (n > 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7241 b = nodes[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7242 b.x = b.r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7243 b.y = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7244 bound(b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7245 if (n > 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7246 c = nodes[2];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7247 d3_layout_packPlace(a, b, c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7248 bound(c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7249 d3_layout_packInsert(a, c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7250 a._pack_prev = c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7251 d3_layout_packInsert(c, b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7252 b = a._pack_next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7253 for (i = 3; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7254 d3_layout_packPlace(a, b, c = nodes[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7255 var isect = 0, s1 = 1, s2 = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7256 for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7257 if (d3_layout_packIntersects(j, c)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7258 isect = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7259 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7260 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7261 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7262 if (isect == 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7263 for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7264 if (d3_layout_packIntersects(k, c)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7265 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7266 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7267 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7268 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7269 if (isect) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7270 if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7271 i--;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7272 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7273 d3_layout_packInsert(a, c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7274 b = c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7275 bound(c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7276 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7277 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7278 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7279 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7280 var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7281 for (i = 0; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7282 c = nodes[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7283 c.x -= cx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7284 c.y -= cy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7285 cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7286 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7287 node.r = cr;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7288 nodes.forEach(d3_layout_packUnlink);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7289 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7290 function d3_layout_packLink(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7291 node._pack_next = node._pack_prev = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7292 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7293 function d3_layout_packUnlink(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7294 delete node._pack_next;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7295 delete node._pack_prev;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7296 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7297 function d3_layout_packTransform(node, x, y, k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7298 var children = node.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7299 node.x = x += k * node.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7300 node.y = y += k * node.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7301 node.r *= k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7302 if (children) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7303 var i = -1, n = children.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7304 while (++i < n) d3_layout_packTransform(children[i], x, y, k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7305 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7306 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7307 function d3_layout_packPlace(a, b, c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7308 var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7309 if (db && (dx || dy)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7310 var da = b.r + c.r, dc = dx * dx + dy * dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7311 da *= da;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7312 db *= db;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7313 var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7314 c.x = a.x + x * dx + y * dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7315 c.y = a.y + x * dy - y * dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7316 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7317 c.x = a.x + db;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7318 c.y = a.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7319 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7320 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7321 d3.layout.tree = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7322 var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7323 function tree(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7324 var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7325 d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7326 d3_layout_hierarchyVisitBefore(root1, secondWalk);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7327 if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7328 var left = root0, right = root0, bottom = root0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7329 d3_layout_hierarchyVisitBefore(root0, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7330 if (node.x < left.x) left = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7331 if (node.x > right.x) right = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7332 if (node.depth > bottom.depth) bottom = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7333 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7334 var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7335 d3_layout_hierarchyVisitBefore(root0, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7336 node.x = (node.x + tx) * kx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7337 node.y = node.depth * ky;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7338 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7339 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7340 return nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7341 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7342 function wrapTree(root0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7343 var root1 = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7344 A: null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7345 children: [ root0 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7346 }, queue = [ root1 ], node1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7347 while ((node1 = queue.pop()) != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7348 for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7349 queue.push((children[i] = child = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7350 _: children[i],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7351 parent: node1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7352 children: (child = children[i].children) && child.slice() || [],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7353 A: null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7354 a: null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7355 z: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7356 m: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7357 c: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7358 s: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7359 t: null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7360 i: i
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7361 }).a = child);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7362 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7363 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7364 return root1.children[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7365 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7366 function firstWalk(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7367 var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7368 if (children.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7369 d3_layout_treeShift(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7370 var midpoint = (children[0].z + children[children.length - 1].z) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7371 if (w) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7372 v.z = w.z + separation(v._, w._);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7373 v.m = v.z - midpoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7374 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7375 v.z = midpoint;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7376 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7377 } else if (w) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7378 v.z = w.z + separation(v._, w._);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7379 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7380 v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7381 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7382 function secondWalk(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7383 v._.x = v.z + v.parent.m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7384 v.m += v.parent.m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7385 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7386 function apportion(v, w, ancestor) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7387 if (w) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7388 var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7389 while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7390 vom = d3_layout_treeLeft(vom);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7391 vop = d3_layout_treeRight(vop);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7392 vop.a = v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7393 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7394 if (shift > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7395 d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7396 sip += shift;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7397 sop += shift;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7398 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7399 sim += vim.m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7400 sip += vip.m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7401 som += vom.m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7402 sop += vop.m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7403 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7404 if (vim && !d3_layout_treeRight(vop)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7405 vop.t = vim;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7406 vop.m += sim - sop;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7407 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7408 if (vip && !d3_layout_treeLeft(vom)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7409 vom.t = vip;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7410 vom.m += sip - som;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7411 ancestor = v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7412 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7413 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7414 return ancestor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7415 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7416 function sizeNode(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7417 node.x *= size[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7418 node.y = node.depth * size[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7419 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7420 tree.separation = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7421 if (!arguments.length) return separation;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7422 separation = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7423 return tree;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7424 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7425 tree.size = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7426 if (!arguments.length) return nodeSize ? null : size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7427 nodeSize = (size = x) == null ? sizeNode : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7428 return tree;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7429 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7430 tree.nodeSize = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7431 if (!arguments.length) return nodeSize ? size : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7432 nodeSize = (size = x) == null ? null : sizeNode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7433 return tree;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7434 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7435 return d3_layout_hierarchyRebind(tree, hierarchy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7436 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7437 function d3_layout_treeSeparation(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7438 return a.parent == b.parent ? 1 : 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7439 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7440 function d3_layout_treeLeft(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7441 var children = v.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7442 return children.length ? children[0] : v.t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7443 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7444 function d3_layout_treeRight(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7445 var children = v.children, n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7446 return (n = children.length) ? children[n - 1] : v.t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7447 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7448 function d3_layout_treeMove(wm, wp, shift) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7449 var change = shift / (wp.i - wm.i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7450 wp.c -= change;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7451 wp.s += shift;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7452 wm.c += change;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7453 wp.z += shift;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7454 wp.m += shift;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7455 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7456 function d3_layout_treeShift(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7457 var shift = 0, change = 0, children = v.children, i = children.length, w;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7458 while (--i >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7459 w = children[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7460 w.z += shift;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7461 w.m += shift;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7462 shift += w.s + (change += w.c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7463 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7464 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7465 function d3_layout_treeAncestor(vim, v, ancestor) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7466 return vim.a.parent === v.parent ? vim.a : ancestor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7467 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7468 d3.layout.cluster = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7469 var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7470 function cluster(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7471 var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7472 d3_layout_hierarchyVisitAfter(root, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7473 var children = node.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7474 if (children && children.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7475 node.x = d3_layout_clusterX(children);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7476 node.y = d3_layout_clusterY(children);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7477 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7478 node.x = previousNode ? x += separation(node, previousNode) : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7479 node.y = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7480 previousNode = node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7481 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7482 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7483 var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7484 d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7485 node.x = (node.x - root.x) * size[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7486 node.y = (root.y - node.y) * size[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7487 } : function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7488 node.x = (node.x - x0) / (x1 - x0) * size[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7489 node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7490 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7491 return nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7492 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7493 cluster.separation = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7494 if (!arguments.length) return separation;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7495 separation = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7496 return cluster;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7497 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7498 cluster.size = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7499 if (!arguments.length) return nodeSize ? null : size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7500 nodeSize = (size = x) == null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7501 return cluster;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7502 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7503 cluster.nodeSize = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7504 if (!arguments.length) return nodeSize ? size : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7505 nodeSize = (size = x) != null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7506 return cluster;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7507 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7508 return d3_layout_hierarchyRebind(cluster, hierarchy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7509 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7510 function d3_layout_clusterY(children) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7511 return 1 + d3.max(children, function(child) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7512 return child.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7513 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7514 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7515 function d3_layout_clusterX(children) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7516 return children.reduce(function(x, child) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7517 return x + child.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7518 }, 0) / children.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7519 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7520 function d3_layout_clusterLeft(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7521 var children = node.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7522 return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7523 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7524 function d3_layout_clusterRight(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7525 var children = node.children, n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7526 return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7527 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7528 d3.layout.treemap = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7529 var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7530 function scale(children, k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7531 var i = -1, n = children.length, child, area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7532 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7533 area = (child = children[i]).value * (k < 0 ? 0 : k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7534 child.area = isNaN(area) || area <= 0 ? 0 : area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7535 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7536 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7537 function squarify(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7538 var children = node.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7539 if (children && children.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7540 var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7541 scale(remaining, rect.dx * rect.dy / node.value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7542 row.area = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7543 while ((n = remaining.length) > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7544 row.push(child = remaining[n - 1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7545 row.area += child.area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7546 if (mode !== "squarify" || (score = worst(row, u)) <= best) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7547 remaining.pop();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7548 best = score;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7549 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7550 row.area -= row.pop().area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7551 position(row, u, rect, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7552 u = Math.min(rect.dx, rect.dy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7553 row.length = row.area = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7554 best = Infinity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7555 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7556 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7557 if (row.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7558 position(row, u, rect, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7559 row.length = row.area = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7560 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7561 children.forEach(squarify);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7562 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7563 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7564 function stickify(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7565 var children = node.children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7566 if (children && children.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7567 var rect = pad(node), remaining = children.slice(), child, row = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7568 scale(remaining, rect.dx * rect.dy / node.value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7569 row.area = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7570 while (child = remaining.pop()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7571 row.push(child);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7572 row.area += child.area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7573 if (child.z != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7574 position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7575 row.length = row.area = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7576 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7577 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7578 children.forEach(stickify);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7579 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7580 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7581 function worst(row, u) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7582 var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7583 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7584 if (!(r = row[i].area)) continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7585 if (r < rmin) rmin = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7586 if (r > rmax) rmax = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7587 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7588 s *= s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7589 u *= u;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7590 return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7591 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7592 function position(row, u, rect, flush) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7593 var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7594 if (u == rect.dx) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7595 if (flush || v > rect.dy) v = rect.dy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7596 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7597 o = row[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7598 o.x = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7599 o.y = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7600 o.dy = v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7601 x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7602 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7603 o.z = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7604 o.dx += rect.x + rect.dx - x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7605 rect.y += v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7606 rect.dy -= v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7607 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7608 if (flush || v > rect.dx) v = rect.dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7609 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7610 o = row[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7611 o.x = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7612 o.y = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7613 o.dx = v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7614 y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7615 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7616 o.z = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7617 o.dy += rect.y + rect.dy - y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7618 rect.x += v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7619 rect.dx -= v;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7620 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7621 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7622 function treemap(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7623 var nodes = stickies || hierarchy(d), root = nodes[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7624 root.x = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7625 root.y = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7626 root.dx = size[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7627 root.dy = size[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7628 if (stickies) hierarchy.revalue(root);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7629 scale([ root ], root.dx * root.dy / root.value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7630 (stickies ? stickify : squarify)(root);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7631 if (sticky) stickies = nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7632 return nodes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7633 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7634 treemap.size = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7635 if (!arguments.length) return size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7636 size = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7637 return treemap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7638 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7639 treemap.padding = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7640 if (!arguments.length) return padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7641 function padFunction(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7642 var p = x.call(treemap, node, node.depth);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7643 return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7644 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7645 function padConstant(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7646 return d3_layout_treemapPad(node, x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7647 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7648 var type;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7649 pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7650 padConstant) : padConstant;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7651 return treemap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7652 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7653 treemap.round = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7654 if (!arguments.length) return round != Number;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7655 round = x ? Math.round : Number;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7656 return treemap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7657 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7658 treemap.sticky = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7659 if (!arguments.length) return sticky;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7660 sticky = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7661 stickies = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7662 return treemap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7663 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7664 treemap.ratio = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7665 if (!arguments.length) return ratio;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7666 ratio = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7667 return treemap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7668 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7669 treemap.mode = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7670 if (!arguments.length) return mode;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7671 mode = x + "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7672 return treemap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7673 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7674 return d3_layout_hierarchyRebind(treemap, hierarchy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7675 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7676 function d3_layout_treemapPadNull(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7677 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7678 x: node.x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7679 y: node.y,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7680 dx: node.dx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7681 dy: node.dy
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7682 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7683 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7684 function d3_layout_treemapPad(node, padding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7685 var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7686 if (dx < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7687 x += dx / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7688 dx = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7689 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7690 if (dy < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7691 y += dy / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7692 dy = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7693 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7694 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7695 x: x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7696 y: y,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7697 dx: dx,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7698 dy: dy
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7699 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7700 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7701 d3.random = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7702 normal: function(µ, σ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7703 var n = arguments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7704 if (n < 2) σ = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7705 if (n < 1) µ = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7706 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7707 var x, y, r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7708 do {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7709 x = Math.random() * 2 - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7710 y = Math.random() * 2 - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7711 r = x * x + y * y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7712 } while (!r || r > 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7713 return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7714 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7715 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7716 logNormal: function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7717 var random = d3.random.normal.apply(d3, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7718 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7719 return Math.exp(random());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7720 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7721 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7722 bates: function(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7723 var random = d3.random.irwinHall(m);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7724 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7725 return random() / m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7726 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7727 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7728 irwinHall: function(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7729 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7730 for (var s = 0, j = 0; j < m; j++) s += Math.random();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7731 return s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7732 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7733 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7734 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7735 d3.scale = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7736 function d3_scaleExtent(domain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7737 var start = domain[0], stop = domain[domain.length - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7738 return start < stop ? [ start, stop ] : [ stop, start ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7739 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7740 function d3_scaleRange(scale) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7741 return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7742 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7743 function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7744 var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7745 return function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7746 return i(u(x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7747 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7748 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7749 function d3_scale_nice(domain, nice) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7750 var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7751 if (x1 < x0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7752 dx = i0, i0 = i1, i1 = dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7753 dx = x0, x0 = x1, x1 = dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7754 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7755 domain[i0] = nice.floor(x0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7756 domain[i1] = nice.ceil(x1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7757 return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7758 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7759 function d3_scale_niceStep(step) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7760 return step ? {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7761 floor: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7762 return Math.floor(x / step) * step;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7763 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7764 ceil: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7765 return Math.ceil(x / step) * step;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7766 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7767 } : d3_scale_niceIdentity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7768 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7769 var d3_scale_niceIdentity = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7770 floor: d3_identity,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7771 ceil: d3_identity
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7772 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7773 function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7774 var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7775 if (domain[k] < domain[0]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7776 domain = domain.slice().reverse();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7777 range = range.slice().reverse();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7778 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7779 while (++j <= k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7780 u.push(uninterpolate(domain[j - 1], domain[j]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7781 i.push(interpolate(range[j - 1], range[j]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7782 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7783 return function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7784 var j = d3.bisect(domain, x, 1, k) - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7785 return i[j](u[j](x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7786 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7787 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7788 d3.scale.linear = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7789 return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7790 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7791 function d3_scale_linear(domain, range, interpolate, clamp) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7792 var output, input;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7793 function rescale() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7794 var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7795 output = linear(domain, range, uninterpolate, interpolate);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7796 input = linear(range, domain, uninterpolate, d3_interpolate);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7797 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7798 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7799 function scale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7800 return output(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7801 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7802 scale.invert = function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7803 return input(y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7804 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7805 scale.domain = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7806 if (!arguments.length) return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7807 domain = x.map(Number);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7808 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7809 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7810 scale.range = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7811 if (!arguments.length) return range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7812 range = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7813 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7814 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7815 scale.rangeRound = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7816 return scale.range(x).interpolate(d3_interpolateRound);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7817 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7818 scale.clamp = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7819 if (!arguments.length) return clamp;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7820 clamp = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7821 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7822 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7823 scale.interpolate = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7824 if (!arguments.length) return interpolate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7825 interpolate = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7826 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7827 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7828 scale.ticks = function(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7829 return d3_scale_linearTicks(domain, m);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7830 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7831 scale.tickFormat = function(m, format) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7832 return d3_scale_linearTickFormat(domain, m, format);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7833 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7834 scale.nice = function(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7835 d3_scale_linearNice(domain, m);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7836 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7837 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7838 scale.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7839 return d3_scale_linear(domain, range, interpolate, clamp);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7840 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7841 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7842 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7843 function d3_scale_linearRebind(scale, linear) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7844 return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7845 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7846 function d3_scale_linearNice(domain, m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7847 return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7848 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7849 function d3_scale_linearTickRange(domain, m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7850 if (m == null) m = 10;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7851 var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7852 if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7853 extent[0] = Math.ceil(extent[0] / step) * step;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7854 extent[1] = Math.floor(extent[1] / step) * step + step * .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7855 extent[2] = step;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7856 return extent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7857 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7858 function d3_scale_linearTicks(domain, m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7859 return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7860 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7861 function d3_scale_linearTickFormat(domain, m, format) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7862 var range = d3_scale_linearTickRange(domain, m);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7863 if (format) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7864 var match = d3_format_re.exec(format);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7865 match.shift();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7866 if (match[8] === "s") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7867 var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7868 if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7869 match[8] = "f";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7870 format = d3.format(match.join(""));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7871 return function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7872 return format(prefix.scale(d)) + prefix.symbol;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7873 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7874 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7875 if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7876 format = match.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7877 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7878 format = ",." + d3_scale_linearPrecision(range[2]) + "f";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7879 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7880 return d3.format(format);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7881 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7882 var d3_scale_linearFormatSignificant = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7883 s: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7884 g: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7885 p: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7886 r: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7887 e: 1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7888 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7889 function d3_scale_linearPrecision(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7890 return -Math.floor(Math.log(value) / Math.LN10 + .01);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7891 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7892 function d3_scale_linearFormatPrecision(type, range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7893 var p = d3_scale_linearPrecision(range[2]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7894 return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7895 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7896 d3.scale.log = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7897 return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7898 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7899 function d3_scale_log(linear, base, positive, domain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7900 function log(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7901 return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7902 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7903 function pow(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7904 return positive ? Math.pow(base, x) : -Math.pow(base, -x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7905 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7906 function scale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7907 return linear(log(x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7908 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7909 scale.invert = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7910 return pow(linear.invert(x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7911 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7912 scale.domain = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7913 if (!arguments.length) return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7914 positive = x[0] >= 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7915 linear.domain((domain = x.map(Number)).map(log));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7916 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7917 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7918 scale.base = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7919 if (!arguments.length) return base;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7920 base = +_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7921 linear.domain(domain.map(log));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7922 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7923 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7924 scale.nice = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7925 var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7926 linear.domain(niced);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7927 domain = niced.map(pow);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7928 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7929 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7930 scale.ticks = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7931 var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7932 if (isFinite(j - i)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7933 if (positive) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7934 for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7935 ticks.push(pow(i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7936 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7937 ticks.push(pow(i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7938 for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7939 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7940 for (i = 0; ticks[i] < u; i++) {}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7941 for (j = ticks.length; ticks[j - 1] > v; j--) {}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7942 ticks = ticks.slice(i, j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7943 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7944 return ticks;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7945 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7946 scale.tickFormat = function(n, format) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7947 if (!arguments.length) return d3_scale_logFormat;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7948 if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7949 var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7950 Math.floor), e;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7951 return function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7952 return d / pow(f(log(d) + e)) <= k ? format(d) : "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7953 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7954 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7955 scale.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7956 return d3_scale_log(linear.copy(), base, positive, domain);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7957 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7958 return d3_scale_linearRebind(scale, linear);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7959 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7960 var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7961 floor: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7962 return -Math.ceil(-x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7963 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7964 ceil: function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7965 return -Math.floor(-x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7966 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7967 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7968 d3.scale.pow = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7969 return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7970 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7971 function d3_scale_pow(linear, exponent, domain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7972 var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7973 function scale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7974 return linear(powp(x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7975 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7976 scale.invert = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7977 return powb(linear.invert(x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7978 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7979 scale.domain = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7980 if (!arguments.length) return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7981 linear.domain((domain = x.map(Number)).map(powp));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7982 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7983 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7984 scale.ticks = function(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7985 return d3_scale_linearTicks(domain, m);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7986 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7987 scale.tickFormat = function(m, format) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7988 return d3_scale_linearTickFormat(domain, m, format);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7989 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7990 scale.nice = function(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7991 return scale.domain(d3_scale_linearNice(domain, m));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7992 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7993 scale.exponent = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7994 if (!arguments.length) return exponent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7995 powp = d3_scale_powPow(exponent = x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7996 powb = d3_scale_powPow(1 / exponent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7997 linear.domain(domain.map(powp));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7998 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
7999 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8000 scale.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8001 return d3_scale_pow(linear.copy(), exponent, domain);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8002 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8003 return d3_scale_linearRebind(scale, linear);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8004 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8005 function d3_scale_powPow(e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8006 return function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8007 return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8008 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8009 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8010 d3.scale.sqrt = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8011 return d3.scale.pow().exponent(.5);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8012 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8013 d3.scale.ordinal = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8014 return d3_scale_ordinal([], {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8015 t: "range",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8016 a: [ [] ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8017 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8018 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8019 function d3_scale_ordinal(domain, ranger) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8020 var index, range, rangeBand;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8021 function scale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8022 return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8023 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8024 function steps(start, step) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8025 return d3.range(domain.length).map(function(i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8026 return start + step * i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8027 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8028 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8029 scale.domain = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8030 if (!arguments.length) return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8031 domain = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8032 index = new d3_Map();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8033 var i = -1, n = x.length, xi;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8034 while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8035 return scale[ranger.t].apply(scale, ranger.a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8036 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8037 scale.range = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8038 if (!arguments.length) return range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8039 range = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8040 rangeBand = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8041 ranger = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8042 t: "range",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8043 a: arguments
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8044 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8045 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8046 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8047 scale.rangePoints = function(x, padding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8048 if (arguments.length < 2) padding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8049 var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8050 0) : (stop - start) / (domain.length - 1 + padding);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8051 range = steps(start + step * padding / 2, step);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8052 rangeBand = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8053 ranger = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8054 t: "rangePoints",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8055 a: arguments
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8056 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8057 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8058 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8059 scale.rangeRoundPoints = function(x, padding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8060 if (arguments.length < 2) padding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8061 var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8062 0) : (stop - start) / (domain.length - 1 + padding) | 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8063 range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8064 rangeBand = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8065 ranger = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8066 t: "rangeRoundPoints",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8067 a: arguments
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8068 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8069 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8070 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8071 scale.rangeBands = function(x, padding, outerPadding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8072 if (arguments.length < 2) padding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8073 if (arguments.length < 3) outerPadding = padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8074 var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8075 range = steps(start + step * outerPadding, step);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8076 if (reverse) range.reverse();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8077 rangeBand = step * (1 - padding);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8078 ranger = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8079 t: "rangeBands",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8080 a: arguments
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8081 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8082 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8083 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8084 scale.rangeRoundBands = function(x, padding, outerPadding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8085 if (arguments.length < 2) padding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8086 if (arguments.length < 3) outerPadding = padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8087 var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8088 range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8089 if (reverse) range.reverse();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8090 rangeBand = Math.round(step * (1 - padding));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8091 ranger = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8092 t: "rangeRoundBands",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8093 a: arguments
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8094 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8095 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8096 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8097 scale.rangeBand = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8098 return rangeBand;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8099 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8100 scale.rangeExtent = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8101 return d3_scaleExtent(ranger.a[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8102 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8103 scale.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8104 return d3_scale_ordinal(domain, ranger);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8105 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8106 return scale.domain(domain);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8107 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8108 d3.scale.category10 = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8109 return d3.scale.ordinal().range(d3_category10);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8110 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8111 d3.scale.category20 = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8112 return d3.scale.ordinal().range(d3_category20);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8113 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8114 d3.scale.category20b = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8115 return d3.scale.ordinal().range(d3_category20b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8116 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8117 d3.scale.category20c = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8118 return d3.scale.ordinal().range(d3_category20c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8119 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8120 var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8121 var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8122 var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8123 var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8124 d3.scale.quantile = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8125 return d3_scale_quantile([], []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8126 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8127 function d3_scale_quantile(domain, range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8128 var thresholds;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8129 function rescale() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8130 var k = 0, q = range.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8131 thresholds = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8132 while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8133 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8134 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8135 function scale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8136 if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8137 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8138 scale.domain = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8139 if (!arguments.length) return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8140 domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8141 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8142 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8143 scale.range = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8144 if (!arguments.length) return range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8145 range = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8146 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8147 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8148 scale.quantiles = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8149 return thresholds;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8150 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8151 scale.invertExtent = function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8152 y = range.indexOf(y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8153 return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8154 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8155 scale.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8156 return d3_scale_quantile(domain, range);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8157 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8158 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8159 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8160 d3.scale.quantize = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8161 return d3_scale_quantize(0, 1, [ 0, 1 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8162 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8163 function d3_scale_quantize(x0, x1, range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8164 var kx, i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8165 function scale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8166 return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8167 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8168 function rescale() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8169 kx = range.length / (x1 - x0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8170 i = range.length - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8171 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8172 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8173 scale.domain = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8174 if (!arguments.length) return [ x0, x1 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8175 x0 = +x[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8176 x1 = +x[x.length - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8177 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8178 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8179 scale.range = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8180 if (!arguments.length) return range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8181 range = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8182 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8183 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8184 scale.invertExtent = function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8185 y = range.indexOf(y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8186 y = y < 0 ? NaN : y / kx + x0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8187 return [ y, y + 1 / kx ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8188 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8189 scale.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8190 return d3_scale_quantize(x0, x1, range);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8191 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8192 return rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8193 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8194 d3.scale.threshold = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8195 return d3_scale_threshold([ .5 ], [ 0, 1 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8196 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8197 function d3_scale_threshold(domain, range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8198 function scale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8199 if (x <= x) return range[d3.bisect(domain, x)];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8200 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8201 scale.domain = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8202 if (!arguments.length) return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8203 domain = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8204 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8205 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8206 scale.range = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8207 if (!arguments.length) return range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8208 range = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8209 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8210 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8211 scale.invertExtent = function(y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8212 y = range.indexOf(y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8213 return [ domain[y - 1], domain[y] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8214 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8215 scale.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8216 return d3_scale_threshold(domain, range);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8217 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8218 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8219 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8220 d3.scale.identity = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8221 return d3_scale_identity([ 0, 1 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8222 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8223 function d3_scale_identity(domain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8224 function identity(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8225 return +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8226 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8227 identity.invert = identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8228 identity.domain = identity.range = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8229 if (!arguments.length) return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8230 domain = x.map(identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8231 return identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8232 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8233 identity.ticks = function(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8234 return d3_scale_linearTicks(domain, m);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8235 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8236 identity.tickFormat = function(m, format) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8237 return d3_scale_linearTickFormat(domain, m, format);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8238 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8239 identity.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8240 return d3_scale_identity(domain);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8241 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8242 return identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8243 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8244 d3.svg = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8245 function d3_zero() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8246 return 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8247 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8248 d3.svg.arc = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8249 var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8250 function arc() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8251 var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8252 if (r1 < r0) rc = r1, r1 = r0, r0 = rc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8253 if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : "") + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8254 var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8255 if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8256 rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8257 if (!cw) p1 *= -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8258 if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8259 if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8260 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8261 if (r1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8262 x0 = r1 * Math.cos(a0 + p1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8263 y0 = r1 * Math.sin(a0 + p1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8264 x1 = r1 * Math.cos(a1 - p1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8265 y1 = r1 * Math.sin(a1 - p1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8266 var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8267 if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8268 var h1 = (a0 + a1) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8269 x0 = r1 * Math.cos(h1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8270 y0 = r1 * Math.sin(h1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8271 x1 = y1 = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8272 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8273 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8274 x0 = y0 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8275 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8276 if (r0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8277 x2 = r0 * Math.cos(a1 - p0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8278 y2 = r0 * Math.sin(a1 - p0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8279 x3 = r0 * Math.cos(a0 + p0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8280 y3 = r0 * Math.sin(a0 + p0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8281 var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8282 if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8283 var h0 = (a0 + a1) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8284 x2 = r0 * Math.cos(h0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8285 y2 = r0 * Math.sin(h0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8286 x3 = y3 = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8287 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8288 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8289 x2 = y2 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8290 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8291 if ((rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8292 cr = r0 < r1 ^ cw ? 0 : 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8293 var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8294 if (x1 != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8295 var rc1 = Math.min(rc, (r1 - lc) / (kc + 1)), t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8296 if (rc === rc1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8297 path.push("M", t30[0], "A", rc1, ",", rc1, " 0 0,", cr, " ", t30[1], "A", r1, ",", r1, " 0 ", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), ",", cw, " ", t12[1], "A", rc1, ",", rc1, " 0 0,", cr, " ", t12[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8298 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8299 path.push("M", t30[0], "A", rc1, ",", rc1, " 0 1,", cr, " ", t12[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8300 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8301 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8302 path.push("M", x0, ",", y0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8303 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8304 if (x3 != null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8305 var rc0 = Math.min(rc, (r0 - lc) / (kc - 1)), t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8306 if (rc === rc0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8307 path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t21[1], "A", r0, ",", r0, " 0 ", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), ",", 1 - cw, " ", t03[1], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8308 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8309 path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8310 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8311 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8312 path.push("L", x2, ",", y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8313 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8314 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8315 path.push("M", x0, ",", y0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8316 if (x1 != null) path.push("A", r1, ",", r1, " 0 ", l1, ",", cw, " ", x1, ",", y1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8317 path.push("L", x2, ",", y2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8318 if (x3 != null) path.push("A", r0, ",", r0, " 0 ", l0, ",", 1 - cw, " ", x3, ",", y3);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8319 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8320 path.push("Z");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8321 return path.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8322 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8323 function circleSegment(r1, cw) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8324 return "M0," + r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + -r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + r1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8325 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8326 arc.innerRadius = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8327 if (!arguments.length) return innerRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8328 innerRadius = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8329 return arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8330 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8331 arc.outerRadius = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8332 if (!arguments.length) return outerRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8333 outerRadius = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8334 return arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8335 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8336 arc.cornerRadius = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8337 if (!arguments.length) return cornerRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8338 cornerRadius = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8339 return arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8340 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8341 arc.padRadius = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8342 if (!arguments.length) return padRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8343 padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8344 return arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8345 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8346 arc.startAngle = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8347 if (!arguments.length) return startAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8348 startAngle = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8349 return arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8350 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8351 arc.endAngle = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8352 if (!arguments.length) return endAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8353 endAngle = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8354 return arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8355 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8356 arc.padAngle = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8357 if (!arguments.length) return padAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8358 padAngle = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8359 return arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8360 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8361 arc.centroid = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8362 var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8363 return [ Math.cos(a) * r, Math.sin(a) * r ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8364 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8365 return arc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8366 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8367 var d3_svg_arcAuto = "auto";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8368 function d3_svg_arcInnerRadius(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8369 return d.innerRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8370 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8371 function d3_svg_arcOuterRadius(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8372 return d.outerRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8373 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8374 function d3_svg_arcStartAngle(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8375 return d.startAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8376 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8377 function d3_svg_arcEndAngle(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8378 return d.endAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8379 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8380 function d3_svg_arcPadAngle(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8381 return d && d.padAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8382 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8383 function d3_svg_arcSweep(x0, y0, x1, y1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8384 return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8385 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8386 function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8387 var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(r * r * d2 - D * D), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8388 if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8389 return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8390 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8391 function d3_svg_line(projection) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8392 var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8393 function line(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8394 var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8395 function segment() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8396 segments.push("M", interpolate(projection(points), tension));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8397 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8398 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8399 if (defined.call(this, d = data[i], i)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8400 points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8401 } else if (points.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8402 segment();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8403 points = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8404 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8405 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8406 if (points.length) segment();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8407 return segments.length ? segments.join("") : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8408 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8409 line.x = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8410 if (!arguments.length) return x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8411 x = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8412 return line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8413 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8414 line.y = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8415 if (!arguments.length) return y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8416 y = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8417 return line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8418 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8419 line.defined = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8420 if (!arguments.length) return defined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8421 defined = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8422 return line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8423 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8424 line.interpolate = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8425 if (!arguments.length) return interpolateKey;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8426 if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8427 return line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8428 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8429 line.tension = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8430 if (!arguments.length) return tension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8431 tension = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8432 return line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8433 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8434 return line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8435 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8436 d3.svg.line = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8437 return d3_svg_line(d3_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8438 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8439 var d3_svg_lineInterpolators = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8440 linear: d3_svg_lineLinear,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8441 "linear-closed": d3_svg_lineLinearClosed,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8442 step: d3_svg_lineStep,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8443 "step-before": d3_svg_lineStepBefore,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8444 "step-after": d3_svg_lineStepAfter,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8445 basis: d3_svg_lineBasis,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8446 "basis-open": d3_svg_lineBasisOpen,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8447 "basis-closed": d3_svg_lineBasisClosed,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8448 bundle: d3_svg_lineBundle,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8449 cardinal: d3_svg_lineCardinal,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8450 "cardinal-open": d3_svg_lineCardinalOpen,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8451 "cardinal-closed": d3_svg_lineCardinalClosed,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8452 monotone: d3_svg_lineMonotone
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8453 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8454 d3_svg_lineInterpolators.forEach(function(key, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8455 value.key = key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8456 value.closed = /-closed$/.test(key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8457 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8458 function d3_svg_lineLinear(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8459 return points.join("L");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8460 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8461 function d3_svg_lineLinearClosed(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8462 return d3_svg_lineLinear(points) + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8463 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8464 function d3_svg_lineStep(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8465 var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8466 while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8467 if (n > 1) path.push("H", p[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8468 return path.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8469 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8470 function d3_svg_lineStepBefore(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8471 var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8472 while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8473 return path.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8474 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8475 function d3_svg_lineStepAfter(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8476 var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8477 while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8478 return path.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8479 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8480 function d3_svg_lineCardinalOpen(points, tension) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8481 return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8482 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8483 function d3_svg_lineCardinalClosed(points, tension) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8484 return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8485 points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8486 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8487 function d3_svg_lineCardinal(points, tension) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8488 return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8489 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8490 function d3_svg_lineHermite(points, tangents) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8491 if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8492 return d3_svg_lineLinear(points);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8493 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8494 var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8495 if (quad) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8496 path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8497 p0 = points[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8498 pi = 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8499 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8500 if (tangents.length > 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8501 t = tangents[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8502 p = points[pi];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8503 pi++;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8504 path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8505 for (var i = 2; i < tangents.length; i++, pi++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8506 p = points[pi];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8507 t = tangents[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8508 path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8509 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8510 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8511 if (quad) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8512 var lp = points[pi];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8513 path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8514 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8515 return path;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8516 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8517 function d3_svg_lineCardinalTangents(points, tension) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8518 var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8519 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8520 p0 = p1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8521 p1 = p2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8522 p2 = points[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8523 tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8524 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8525 return tangents;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8526 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8527 function d3_svg_lineBasis(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8528 if (points.length < 3) return d3_svg_lineLinear(points);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8529 var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8530 points.push(points[n - 1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8531 while (++i <= n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8532 pi = points[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8533 px.shift();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8534 px.push(pi[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8535 py.shift();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8536 py.push(pi[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8537 d3_svg_lineBasisBezier(path, px, py);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8538 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8539 points.pop();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8540 path.push("L", pi);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8541 return path.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8542 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8543 function d3_svg_lineBasisOpen(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8544 if (points.length < 4) return d3_svg_lineLinear(points);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8545 var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8546 while (++i < 3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8547 pi = points[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8548 px.push(pi[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8549 py.push(pi[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8550 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8551 path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8552 --i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8553 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8554 pi = points[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8555 px.shift();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8556 px.push(pi[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8557 py.shift();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8558 py.push(pi[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8559 d3_svg_lineBasisBezier(path, px, py);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8560 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8561 return path.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8562 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8563 function d3_svg_lineBasisClosed(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8564 var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8565 while (++i < 4) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8566 pi = points[i % n];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8567 px.push(pi[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8568 py.push(pi[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8569 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8570 path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8571 --i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8572 while (++i < m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8573 pi = points[i % n];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8574 px.shift();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8575 px.push(pi[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8576 py.shift();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8577 py.push(pi[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8578 d3_svg_lineBasisBezier(path, px, py);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8579 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8580 return path.join("");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8581 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8582 function d3_svg_lineBundle(points, tension) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8583 var n = points.length - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8584 if (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8585 var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8586 while (++i <= n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8587 p = points[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8588 t = i / n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8589 p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8590 p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8591 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8592 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8593 return d3_svg_lineBasis(points);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8594 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8595 function d3_svg_lineDot4(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8596 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8597 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8598 var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8599 function d3_svg_lineBasisBezier(path, x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8600 path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8601 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8602 function d3_svg_lineSlope(p0, p1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8603 return (p1[1] - p0[1]) / (p1[0] - p0[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8604 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8605 function d3_svg_lineFiniteDifferences(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8606 var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8607 while (++i < j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8608 m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8609 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8610 m[i] = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8611 return m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8612 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8613 function d3_svg_lineMonotoneTangents(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8614 var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8615 while (++i < j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8616 d = d3_svg_lineSlope(points[i], points[i + 1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8617 if (abs(d) < ε) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8618 m[i] = m[i + 1] = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8619 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8620 a = m[i] / d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8621 b = m[i + 1] / d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8622 s = a * a + b * b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8623 if (s > 9) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8624 s = d * 3 / Math.sqrt(s);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8625 m[i] = s * a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8626 m[i + 1] = s * b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8627 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8628 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8629 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8630 i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8631 while (++i <= j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8632 s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8633 tangents.push([ s || 0, m[i] * s || 0 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8634 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8635 return tangents;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8636 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8637 function d3_svg_lineMonotone(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8638 return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8639 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8640 d3.svg.line.radial = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8641 var line = d3_svg_line(d3_svg_lineRadial);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8642 line.radius = line.x, delete line.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8643 line.angle = line.y, delete line.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8644 return line;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8645 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8646 function d3_svg_lineRadial(points) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8647 var point, i = -1, n = points.length, r, a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8648 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8649 point = points[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8650 r = point[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8651 a = point[1] - halfπ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8652 point[0] = r * Math.cos(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8653 point[1] = r * Math.sin(a);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8654 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8655 return points;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8656 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8657 function d3_svg_area(projection) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8658 var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8659 function area(data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8660 var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8661 return x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8662 } : d3_functor(x1), fy1 = y0 === y1 ? function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8663 return y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8664 } : d3_functor(y1), x, y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8665 function segment() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8666 segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8667 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8668 while (++i < n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8669 if (defined.call(this, d = data[i], i)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8670 points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8671 points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8672 } else if (points0.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8673 segment();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8674 points0 = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8675 points1 = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8676 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8677 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8678 if (points0.length) segment();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8679 return segments.length ? segments.join("") : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8680 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8681 area.x = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8682 if (!arguments.length) return x1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8683 x0 = x1 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8684 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8685 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8686 area.x0 = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8687 if (!arguments.length) return x0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8688 x0 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8689 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8690 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8691 area.x1 = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8692 if (!arguments.length) return x1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8693 x1 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8694 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8695 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8696 area.y = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8697 if (!arguments.length) return y1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8698 y0 = y1 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8699 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8700 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8701 area.y0 = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8702 if (!arguments.length) return y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8703 y0 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8704 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8705 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8706 area.y1 = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8707 if (!arguments.length) return y1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8708 y1 = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8709 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8710 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8711 area.defined = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8712 if (!arguments.length) return defined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8713 defined = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8714 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8715 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8716 area.interpolate = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8717 if (!arguments.length) return interpolateKey;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8718 if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8719 interpolateReverse = interpolate.reverse || interpolate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8720 L = interpolate.closed ? "M" : "L";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8721 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8722 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8723 area.tension = function(_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8724 if (!arguments.length) return tension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8725 tension = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8726 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8727 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8728 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8729 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8730 d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8731 d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8732 d3.svg.area = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8733 return d3_svg_area(d3_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8734 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8735 d3.svg.area.radial = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8736 var area = d3_svg_area(d3_svg_lineRadial);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8737 area.radius = area.x, delete area.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8738 area.innerRadius = area.x0, delete area.x0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8739 area.outerRadius = area.x1, delete area.x1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8740 area.angle = area.y, delete area.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8741 area.startAngle = area.y0, delete area.y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8742 area.endAngle = area.y1, delete area.y1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8743 return area;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8744 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8745 d3.svg.chord = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8746 var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8747 function chord(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8748 var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8749 return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8750 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8751 function subgroup(self, f, d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8752 var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8753 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8754 r: r,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8755 a0: a0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8756 a1: a1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8757 p0: [ r * Math.cos(a0), r * Math.sin(a0) ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8758 p1: [ r * Math.cos(a1), r * Math.sin(a1) ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8759 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8760 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8761 function equals(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8762 return a.a0 == b.a0 && a.a1 == b.a1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8763 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8764 function arc(r, p, a) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8765 return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8766 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8767 function curve(r0, p0, r1, p1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8768 return "Q 0,0 " + p1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8769 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8770 chord.radius = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8771 if (!arguments.length) return radius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8772 radius = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8773 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8774 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8775 chord.source = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8776 if (!arguments.length) return source;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8777 source = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8778 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8779 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8780 chord.target = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8781 if (!arguments.length) return target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8782 target = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8783 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8784 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8785 chord.startAngle = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8786 if (!arguments.length) return startAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8787 startAngle = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8788 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8789 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8790 chord.endAngle = function(v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8791 if (!arguments.length) return endAngle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8792 endAngle = d3_functor(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8793 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8794 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8795 return chord;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8796 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8797 function d3_svg_chordRadius(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8798 return d.radius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8799 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8800 d3.svg.diagonal = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8801 var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8802 function diagonal(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8803 var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8804 x: p0.x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8805 y: m
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8806 }, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8807 x: p3.x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8808 y: m
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8809 }, p3 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8810 p = p.map(projection);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8811 return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8812 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8813 diagonal.source = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8814 if (!arguments.length) return source;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8815 source = d3_functor(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8816 return diagonal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8817 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8818 diagonal.target = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8819 if (!arguments.length) return target;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8820 target = d3_functor(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8821 return diagonal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8822 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8823 diagonal.projection = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8824 if (!arguments.length) return projection;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8825 projection = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8826 return diagonal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8827 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8828 return diagonal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8829 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8830 function d3_svg_diagonalProjection(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8831 return [ d.x, d.y ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8832 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8833 d3.svg.diagonal.radial = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8834 var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8835 diagonal.projection = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8836 return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8837 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8838 return diagonal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8839 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8840 function d3_svg_diagonalRadialProjection(projection) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8841 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8842 var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8843 return [ r * Math.cos(a), r * Math.sin(a) ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8844 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8845 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8846 d3.svg.symbol = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8847 var type = d3_svg_symbolType, size = d3_svg_symbolSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8848 function symbol(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8849 return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8850 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8851 symbol.type = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8852 if (!arguments.length) return type;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8853 type = d3_functor(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8854 return symbol;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8855 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8856 symbol.size = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8857 if (!arguments.length) return size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8858 size = d3_functor(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8859 return symbol;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8860 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8861 return symbol;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8862 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8863 function d3_svg_symbolSize() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8864 return 64;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8865 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8866 function d3_svg_symbolType() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8867 return "circle";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8868 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8869 function d3_svg_symbolCircle(size) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8870 var r = Math.sqrt(size / π);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8871 return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8872 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8873 var d3_svg_symbols = d3.map({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8874 circle: d3_svg_symbolCircle,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8875 cross: function(size) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8876 var r = Math.sqrt(size / 5) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8877 return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8878 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8879 diamond: function(size) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8880 var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8881 return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8882 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8883 square: function(size) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8884 var r = Math.sqrt(size) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8885 return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8886 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8887 "triangle-down": function(size) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8888 var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8889 return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8890 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8891 "triangle-up": function(size) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8892 var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8893 return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8894 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8895 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8896 d3.svg.symbolTypes = d3_svg_symbols.keys();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8897 var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8898 d3_selectionPrototype.transition = function(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8899 var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8900 time: Date.now(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8901 ease: d3_ease_cubicInOut,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8902 delay: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8903 duration: 250
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8904 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8905 for (var j = -1, m = this.length; ++j < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8906 subgroups.push(subgroup = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8907 for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8908 if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8909 subgroup.push(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8910 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8911 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8912 return d3_transition(subgroups, ns, id);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8913 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8914 d3_selectionPrototype.interrupt = function(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8915 return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8916 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8917 var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8918 function d3_selection_interruptNS(ns) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8919 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8920 var lock, active;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8921 if ((lock = this[ns]) && (active = lock[lock.active])) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8922 if (--lock.count) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8923 delete lock[lock.active];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8924 lock.active += .5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8925 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8926 delete this[ns];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8927 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8928 active.event && active.event.interrupt.call(this, this.__data__, active.index);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8929 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8930 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8931 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8932 function d3_transition(groups, ns, id) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8933 d3_subclass(groups, d3_transitionPrototype);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8934 groups.namespace = ns;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8935 groups.id = id;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8936 return groups;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8937 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8938 var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8939 d3_transitionPrototype.call = d3_selectionPrototype.call;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8940 d3_transitionPrototype.empty = d3_selectionPrototype.empty;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8941 d3_transitionPrototype.node = d3_selectionPrototype.node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8942 d3_transitionPrototype.size = d3_selectionPrototype.size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8943 d3.transition = function(selection, name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8944 return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3_selectionRoot.transition(selection);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8945 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8946 d3.transition.prototype = d3_transitionPrototype;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8947 d3_transitionPrototype.select = function(selector) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8948 var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8949 selector = d3_selection_selector(selector);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8950 for (var j = -1, m = this.length; ++j < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8951 subgroups.push(subgroup = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8952 for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8953 if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8954 if ("__data__" in node) subnode.__data__ = node.__data__;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8955 d3_transitionNode(subnode, i, ns, id, node[ns][id]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8956 subgroup.push(subnode);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8957 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8958 subgroup.push(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8959 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8960 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8961 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8962 return d3_transition(subgroups, ns, id);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8963 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8964 d3_transitionPrototype.selectAll = function(selector) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8965 var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8966 selector = d3_selection_selectorAll(selector);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8967 for (var j = -1, m = this.length; ++j < m; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8968 for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8969 if (node = group[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8970 transition = node[ns][id];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8971 subnodes = selector.call(node, node.__data__, i, j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8972 subgroups.push(subgroup = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8973 for (var k = -1, o = subnodes.length; ++k < o; ) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8974 if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8975 subgroup.push(subnode);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8976 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8977 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8978 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8979 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8980 return d3_transition(subgroups, ns, id);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8981 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8982 d3_transitionPrototype.filter = function(filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8983 var subgroups = [], subgroup, group, node;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8984 if (typeof filter !== "function") filter = d3_selection_filter(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8985 for (var j = 0, m = this.length; j < m; j++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8986 subgroups.push(subgroup = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8987 for (var group = this[j], i = 0, n = group.length; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8988 if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8989 subgroup.push(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8990 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8991 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8992 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8993 return d3_transition(subgroups, this.namespace, this.id);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8994 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8995 d3_transitionPrototype.tween = function(name, tween) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8996 var id = this.id, ns = this.namespace;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8997 if (arguments.length < 2) return this.node()[ns][id].tween.get(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8998 return d3_selection_each(this, tween == null ? function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
8999 node[ns][id].tween.remove(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9000 } : function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9001 node[ns][id].tween.set(name, tween);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9002 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9003 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9004 function d3_transition_tween(groups, name, value, tween) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9005 var id = groups.id, ns = groups.namespace;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9006 return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9007 node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9008 } : (value = tween(value), function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9009 node[ns][id].tween.set(name, value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9010 }));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9011 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9012 d3_transitionPrototype.attr = function(nameNS, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9013 if (arguments.length < 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9014 for (value in nameNS) this.attr(value, nameNS[value]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9015 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9016 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9017 var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9018 function attrNull() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9019 this.removeAttribute(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9020 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9021 function attrNullNS() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9022 this.removeAttributeNS(name.space, name.local);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9023 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9024 function attrTween(b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9025 return b == null ? attrNull : (b += "", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9026 var a = this.getAttribute(name), i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9027 return a !== b && (i = interpolate(a, b), function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9028 this.setAttribute(name, i(t));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9029 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9030 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9031 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9032 function attrTweenNS(b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9033 return b == null ? attrNullNS : (b += "", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9034 var a = this.getAttributeNS(name.space, name.local), i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9035 return a !== b && (i = interpolate(a, b), function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9036 this.setAttributeNS(name.space, name.local, i(t));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9037 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9038 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9039 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9040 return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9041 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9042 d3_transitionPrototype.attrTween = function(nameNS, tween) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9043 var name = d3.ns.qualify(nameNS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9044 function attrTween(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9045 var f = tween.call(this, d, i, this.getAttribute(name));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9046 return f && function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9047 this.setAttribute(name, f(t));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9048 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9049 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9050 function attrTweenNS(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9051 var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9052 return f && function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9053 this.setAttributeNS(name.space, name.local, f(t));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9054 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9055 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9056 return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9057 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9058 d3_transitionPrototype.style = function(name, value, priority) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9059 var n = arguments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9060 if (n < 3) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9061 if (typeof name !== "string") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9062 if (n < 2) value = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9063 for (priority in name) this.style(priority, name[priority], value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9064 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9065 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9066 priority = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9067 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9068 function styleNull() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9069 this.style.removeProperty(name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9070 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9071 function styleString(b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9072 return b == null ? styleNull : (b += "", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9073 var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9074 return a !== b && (i = d3_interpolate(a, b), function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9075 this.style.setProperty(name, i(t), priority);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9076 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9077 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9078 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9079 return d3_transition_tween(this, "style." + name, value, styleString);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9080 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9081 d3_transitionPrototype.styleTween = function(name, tween, priority) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9082 if (arguments.length < 3) priority = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9083 function styleTween(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9084 var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9085 return f && function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9086 this.style.setProperty(name, f(t), priority);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9087 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9088 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9089 return this.tween("style." + name, styleTween);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9090 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9091 d3_transitionPrototype.text = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9092 return d3_transition_tween(this, "text", value, d3_transition_text);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9093 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9094 function d3_transition_text(b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9095 if (b == null) b = "";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9096 return function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9097 this.textContent = b;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9098 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9099 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9100 d3_transitionPrototype.remove = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9101 var ns = this.namespace;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9102 return this.each("end.transition", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9103 var p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9104 if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9105 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9106 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9107 d3_transitionPrototype.ease = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9108 var id = this.id, ns = this.namespace;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9109 if (arguments.length < 1) return this.node()[ns][id].ease;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9110 if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9111 return d3_selection_each(this, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9112 node[ns][id].ease = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9113 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9114 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9115 d3_transitionPrototype.delay = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9116 var id = this.id, ns = this.namespace;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9117 if (arguments.length < 1) return this.node()[ns][id].delay;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9118 return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9119 node[ns][id].delay = +value.call(node, node.__data__, i, j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9120 } : (value = +value, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9121 node[ns][id].delay = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9122 }));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9123 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9124 d3_transitionPrototype.duration = function(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9125 var id = this.id, ns = this.namespace;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9126 if (arguments.length < 1) return this.node()[ns][id].duration;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9127 return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9128 node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9129 } : (value = Math.max(1, value), function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9130 node[ns][id].duration = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9131 }));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9132 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9133 d3_transitionPrototype.each = function(type, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9134 var id = this.id, ns = this.namespace;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9135 if (arguments.length < 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9136 var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9137 try {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9138 d3_transitionInheritId = id;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9139 d3_selection_each(this, function(node, i, j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9140 d3_transitionInherit = node[ns][id];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9141 type.call(node, node.__data__, i, j);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9142 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9143 } finally {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9144 d3_transitionInherit = inherit;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9145 d3_transitionInheritId = inheritId;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9146 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9147 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9148 d3_selection_each(this, function(node) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9149 var transition = node[ns][id];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9150 (transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9151 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9152 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9153 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9154 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9155 d3_transitionPrototype.transition = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9156 var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9157 for (var j = 0, m = this.length; j < m; j++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9158 subgroups.push(subgroup = []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9159 for (var group = this[j], i = 0, n = group.length; i < n; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9160 if (node = group[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9161 transition = node[ns][id0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9162 d3_transitionNode(node, i, ns, id1, {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9163 time: transition.time,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9164 ease: transition.ease,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9165 delay: transition.delay + transition.duration,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9166 duration: transition.duration
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9167 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9168 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9169 subgroup.push(node);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9170 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9171 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9172 return d3_transition(subgroups, ns, id1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9173 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9174 function d3_transitionNamespace(name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9175 return name == null ? "__transition__" : "__transition_" + name + "__";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9176 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9177 function d3_transitionNode(node, i, ns, id, inherit) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9178 var lock = node[ns] || (node[ns] = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9179 active: 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9180 count: 0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9181 }), transition = lock[id];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9182 if (!transition) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9183 var time = inherit.time;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9184 transition = lock[id] = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9185 tween: new d3_Map(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9186 time: time,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9187 delay: inherit.delay,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9188 duration: inherit.duration,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9189 ease: inherit.ease,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9190 index: i
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9191 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9192 inherit = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9193 ++lock.count;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9194 d3.timer(function(elapsed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9195 var delay = transition.delay, duration, ease, timer = d3_timer_active, tweened = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9196 timer.t = delay + time;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9197 if (delay <= elapsed) return start(elapsed - delay);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9198 timer.c = start;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9199 function start(elapsed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9200 if (lock.active > id) return stop();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9201 var active = lock[lock.active];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9202 if (active) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9203 --lock.count;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9204 delete lock[lock.active];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9205 active.event && active.event.interrupt.call(node, node.__data__, active.index);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9206 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9207 lock.active = id;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9208 transition.event && transition.event.start.call(node, node.__data__, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9209 transition.tween.forEach(function(key, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9210 if (value = value.call(node, node.__data__, i)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9211 tweened.push(value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9212 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9213 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9214 ease = transition.ease;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9215 duration = transition.duration;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9216 d3.timer(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9217 timer.c = tick(elapsed || 1) ? d3_true : tick;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9218 return 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9219 }, 0, time);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9220 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9221 function tick(elapsed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9222 if (lock.active !== id) return 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9223 var t = elapsed / duration, e = ease(t), n = tweened.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9224 while (n > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9225 tweened[--n].call(node, e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9226 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9227 if (t >= 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9228 transition.event && transition.event.end.call(node, node.__data__, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9229 return stop();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9230 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9231 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9232 function stop() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9233 if (--lock.count) delete lock[id]; else delete node[ns];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9234 return 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9235 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9236 }, 0, time);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9237 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9238 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9239 d3.svg.axis = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9240 var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9241 function axis(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9242 g.each(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9243 var g = d3.select(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9244 var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9245 var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9246 var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9247 d3.transition(path));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9248 tickEnter.append("line");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9249 tickEnter.append("text");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9250 var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"), sign = orient === "top" || orient === "left" ? -1 : 1, x1, x2, y1, y2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9251 if (orient === "bottom" || orient === "top") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9252 tickTransform = d3_svg_axisX, x1 = "x", y1 = "y", x2 = "x2", y2 = "y2";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9253 text.attr("dy", sign < 0 ? "0em" : ".71em").style("text-anchor", "middle");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9254 pathUpdate.attr("d", "M" + range[0] + "," + sign * outerTickSize + "V0H" + range[1] + "V" + sign * outerTickSize);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9255 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9256 tickTransform = d3_svg_axisY, x1 = "y", y1 = "x", x2 = "y2", y2 = "x2";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9257 text.attr("dy", ".32em").style("text-anchor", sign < 0 ? "end" : "start");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9258 pathUpdate.attr("d", "M" + sign * outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + sign * outerTickSize);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9259 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9260 lineEnter.attr(y2, sign * innerTickSize);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9261 textEnter.attr(y1, sign * tickSpacing);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9262 lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9263 textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9264 if (scale1.rangeBand) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9265 var x = scale1, dx = x.rangeBand() / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9266 scale0 = scale1 = function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9267 return x(d) + dx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9268 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9269 } else if (scale0.rangeBand) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9270 scale0 = scale1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9271 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9272 tickExit.call(tickTransform, scale1, scale0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9273 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9274 tickEnter.call(tickTransform, scale0, scale1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9275 tickUpdate.call(tickTransform, scale1, scale1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9276 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9277 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9278 axis.scale = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9279 if (!arguments.length) return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9280 scale = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9281 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9282 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9283 axis.orient = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9284 if (!arguments.length) return orient;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9285 orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9286 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9287 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9288 axis.ticks = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9289 if (!arguments.length) return tickArguments_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9290 tickArguments_ = arguments;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9291 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9292 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9293 axis.tickValues = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9294 if (!arguments.length) return tickValues;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9295 tickValues = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9296 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9297 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9298 axis.tickFormat = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9299 if (!arguments.length) return tickFormat_;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9300 tickFormat_ = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9301 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9302 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9303 axis.tickSize = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9304 var n = arguments.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9305 if (!n) return innerTickSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9306 innerTickSize = +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9307 outerTickSize = +arguments[n - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9308 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9309 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9310 axis.innerTickSize = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9311 if (!arguments.length) return innerTickSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9312 innerTickSize = +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9313 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9314 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9315 axis.outerTickSize = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9316 if (!arguments.length) return outerTickSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9317 outerTickSize = +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9318 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9319 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9320 axis.tickPadding = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9321 if (!arguments.length) return tickPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9322 tickPadding = +x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9323 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9324 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9325 axis.tickSubdivide = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9326 return arguments.length && axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9327 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9328 return axis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9329 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9330 var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9331 top: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9332 right: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9333 bottom: 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9334 left: 1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9335 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9336 function d3_svg_axisX(selection, x0, x1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9337 selection.attr("transform", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9338 var v0 = x0(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9339 return "translate(" + (isFinite(v0) ? v0 : x1(d)) + ",0)";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9340 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9341 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9342 function d3_svg_axisY(selection, y0, y1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9343 selection.attr("transform", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9344 var v0 = y0(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9345 return "translate(0," + (isFinite(v0) ? v0 : y1(d)) + ")";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9346 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9347 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9348 d3.svg.brush = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9349 var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9350 function brush(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9351 g.each(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9352 var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9353 var background = g.selectAll(".background").data([ 0 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9354 background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9355 g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9356 var resize = g.selectAll(".resize").data(resizes, d3_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9357 resize.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9358 resize.enter().append("g").attr("class", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9359 return "resize " + d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9360 }).style("cursor", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9361 return d3_svg_brushCursor[d];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9362 }).append("rect").attr("x", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9363 return /[ew]$/.test(d) ? -3 : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9364 }).attr("y", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9365 return /^[ns]/.test(d) ? -3 : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9366 }).attr("width", 6).attr("height", 6).style("visibility", "hidden");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9367 resize.style("display", brush.empty() ? "none" : null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9368 var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9369 if (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9370 range = d3_scaleRange(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9371 backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9372 redrawX(gUpdate);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9373 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9374 if (y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9375 range = d3_scaleRange(y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9376 backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9377 redrawY(gUpdate);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9378 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9379 redraw(gUpdate);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9380 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9381 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9382 brush.event = function(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9383 g.each(function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9384 var event_ = event.of(this, arguments), extent1 = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9385 x: xExtent,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9386 y: yExtent,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9387 i: xExtentDomain,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9388 j: yExtentDomain
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9389 }, extent0 = this.__chart__ || extent1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9390 this.__chart__ = extent1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9391 if (d3_transitionInheritId) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9392 d3.select(this).transition().each("start.brush", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9393 xExtentDomain = extent0.i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9394 yExtentDomain = extent0.j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9395 xExtent = extent0.x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9396 yExtent = extent0.y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9397 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9398 type: "brushstart"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9399 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9400 }).tween("brush:brush", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9401 var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9402 xExtentDomain = yExtentDomain = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9403 return function(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9404 xExtent = extent1.x = xi(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9405 yExtent = extent1.y = yi(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9406 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9407 type: "brush",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9408 mode: "resize"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9409 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9410 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9411 }).each("end.brush", function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9412 xExtentDomain = extent1.i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9413 yExtentDomain = extent1.j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9414 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9415 type: "brush",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9416 mode: "resize"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9417 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9418 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9419 type: "brushend"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9420 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9421 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9422 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9423 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9424 type: "brushstart"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9425 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9426 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9427 type: "brush",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9428 mode: "resize"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9429 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9430 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9431 type: "brushend"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9432 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9433 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9434 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9435 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9436 function redraw(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9437 g.selectAll(".resize").attr("transform", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9438 return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9439 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9440 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9441 function redrawX(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9442 g.select(".extent").attr("x", xExtent[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9443 g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9444 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9445 function redrawY(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9446 g.select(".extent").attr("y", yExtent[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9447 g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9448 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9449 function brushstart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9450 var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9451 var w = d3.select(d3_window).on("keydown.brush", keydown).on("keyup.brush", keyup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9452 if (d3.event.changedTouches) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9453 w.on("touchmove.brush", brushmove).on("touchend.brush", brushend);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9454 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9455 w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9456 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9457 g.interrupt().selectAll("*").interrupt();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9458 if (dragging) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9459 origin[0] = xExtent[0] - origin[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9460 origin[1] = yExtent[0] - origin[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9461 } else if (resizing) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9462 var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9463 offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9464 origin[0] = xExtent[ex];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9465 origin[1] = yExtent[ey];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9466 } else if (d3.event.altKey) center = origin.slice();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9467 g.style("pointer-events", "none").selectAll(".resize").style("display", null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9468 d3.select("body").style("cursor", eventTarget.style("cursor"));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9469 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9470 type: "brushstart"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9471 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9472 brushmove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9473 function keydown() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9474 if (d3.event.keyCode == 32) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9475 if (!dragging) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9476 center = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9477 origin[0] -= xExtent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9478 origin[1] -= yExtent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9479 dragging = 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9480 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9481 d3_eventPreventDefault();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9482 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9483 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9484 function keyup() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9485 if (d3.event.keyCode == 32 && dragging == 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9486 origin[0] += xExtent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9487 origin[1] += yExtent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9488 dragging = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9489 d3_eventPreventDefault();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9490 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9491 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9492 function brushmove() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9493 var point = d3.mouse(target), moved = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9494 if (offset) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9495 point[0] += offset[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9496 point[1] += offset[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9497 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9498 if (!dragging) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9499 if (d3.event.altKey) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9500 if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9501 origin[0] = xExtent[+(point[0] < center[0])];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9502 origin[1] = yExtent[+(point[1] < center[1])];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9503 } else center = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9504 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9505 if (resizingX && move1(point, x, 0)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9506 redrawX(g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9507 moved = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9508 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9509 if (resizingY && move1(point, y, 1)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9510 redrawY(g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9511 moved = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9512 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9513 if (moved) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9514 redraw(g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9515 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9516 type: "brush",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9517 mode: dragging ? "move" : "resize"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9518 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9519 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9520 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9521 function move1(point, scale, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9522 var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9523 if (dragging) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9524 r0 -= position;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9525 r1 -= size + position;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9526 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9527 min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9528 if (dragging) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9529 max = (min += position) + size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9530 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9531 if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9532 if (position < min) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9533 max = min;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9534 min = position;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9535 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9536 max = position;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9537 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9538 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9539 if (extent[0] != min || extent[1] != max) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9540 if (i) yExtentDomain = null; else xExtentDomain = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9541 extent[0] = min;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9542 extent[1] = max;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9543 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9544 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9545 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9546 function brushend() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9547 brushmove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9548 g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9549 d3.select("body").style("cursor", null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9550 w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9551 dragRestore();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9552 event_({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9553 type: "brushend"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9554 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9555 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9556 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9557 brush.x = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9558 if (!arguments.length) return x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9559 x = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9560 resizes = d3_svg_brushResizes[!x << 1 | !y];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9561 return brush;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9562 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9563 brush.y = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9564 if (!arguments.length) return y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9565 y = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9566 resizes = d3_svg_brushResizes[!x << 1 | !y];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9567 return brush;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9568 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9569 brush.clamp = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9570 if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9571 if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9572 return brush;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9573 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9574 brush.extent = function(z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9575 var x0, x1, y0, y1, t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9576 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9577 if (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9578 if (xExtentDomain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9579 x0 = xExtentDomain[0], x1 = xExtentDomain[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9580 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9581 x0 = xExtent[0], x1 = xExtent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9582 if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9583 if (x1 < x0) t = x0, x0 = x1, x1 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9584 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9585 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9586 if (y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9587 if (yExtentDomain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9588 y0 = yExtentDomain[0], y1 = yExtentDomain[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9589 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9590 y0 = yExtent[0], y1 = yExtent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9591 if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9592 if (y1 < y0) t = y0, y0 = y1, y1 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9593 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9594 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9595 return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9596 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9597 if (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9598 x0 = z[0], x1 = z[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9599 if (y) x0 = x0[0], x1 = x1[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9600 xExtentDomain = [ x0, x1 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9601 if (x.invert) x0 = x(x0), x1 = x(x1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9602 if (x1 < x0) t = x0, x0 = x1, x1 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9603 if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9604 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9605 if (y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9606 y0 = z[0], y1 = z[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9607 if (x) y0 = y0[1], y1 = y1[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9608 yExtentDomain = [ y0, y1 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9609 if (y.invert) y0 = y(y0), y1 = y(y1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9610 if (y1 < y0) t = y0, y0 = y1, y1 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9611 if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9612 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9613 return brush;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9614 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9615 brush.clear = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9616 if (!brush.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9617 xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9618 xExtentDomain = yExtentDomain = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9619 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9620 return brush;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9621 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9622 brush.empty = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9623 return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9624 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9625 return d3.rebind(brush, event, "on");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9626 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9627 var d3_svg_brushCursor = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9628 n: "ns-resize",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9629 e: "ew-resize",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9630 s: "ns-resize",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9631 w: "ew-resize",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9632 nw: "nwse-resize",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9633 ne: "nesw-resize",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9634 se: "nwse-resize",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9635 sw: "nesw-resize"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9636 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9637 var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9638 var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9639 var d3_time_formatUtc = d3_time_format.utc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9640 var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9641 d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9642 function d3_time_formatIsoNative(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9643 return date.toISOString();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9644 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9645 d3_time_formatIsoNative.parse = function(string) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9646 var date = new Date(string);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9647 return isNaN(date) ? null : date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9648 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9649 d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9650 d3_time.second = d3_time_interval(function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9651 return new d3_date(Math.floor(date / 1e3) * 1e3);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9652 }, function(date, offset) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9653 date.setTime(date.getTime() + Math.floor(offset) * 1e3);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9654 }, function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9655 return date.getSeconds();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9656 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9657 d3_time.seconds = d3_time.second.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9658 d3_time.seconds.utc = d3_time.second.utc.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9659 d3_time.minute = d3_time_interval(function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9660 return new d3_date(Math.floor(date / 6e4) * 6e4);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9661 }, function(date, offset) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9662 date.setTime(date.getTime() + Math.floor(offset) * 6e4);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9663 }, function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9664 return date.getMinutes();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9665 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9666 d3_time.minutes = d3_time.minute.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9667 d3_time.minutes.utc = d3_time.minute.utc.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9668 d3_time.hour = d3_time_interval(function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9669 var timezone = date.getTimezoneOffset() / 60;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9670 return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9671 }, function(date, offset) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9672 date.setTime(date.getTime() + Math.floor(offset) * 36e5);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9673 }, function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9674 return date.getHours();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9675 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9676 d3_time.hours = d3_time.hour.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9677 d3_time.hours.utc = d3_time.hour.utc.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9678 d3_time.month = d3_time_interval(function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9679 date = d3_time.day(date);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9680 date.setDate(1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9681 return date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9682 }, function(date, offset) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9683 date.setMonth(date.getMonth() + offset);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9684 }, function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9685 return date.getMonth();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9686 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9687 d3_time.months = d3_time.month.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9688 d3_time.months.utc = d3_time.month.utc.range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9689 function d3_time_scale(linear, methods, format) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9690 function scale(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9691 return linear(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9692 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9693 scale.invert = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9694 return d3_time_scaleDate(linear.invert(x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9695 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9696 scale.domain = function(x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9697 if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9698 linear.domain(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9699 return scale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9700 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9701 function tickMethod(extent, count) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9702 var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9703 return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9704 return d / 31536e6;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9705 }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9706 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9707 scale.nice = function(interval, skip) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9708 var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9709 if (method) interval = method[0], skip = method[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9710 function skipped(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9711 return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9712 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9713 return scale.domain(d3_scale_nice(domain, skip > 1 ? {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9714 floor: function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9715 while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9716 return date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9717 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9718 ceil: function(date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9719 while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9720 return date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9721 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9722 } : interval));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9723 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9724 scale.ticks = function(interval, skip) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9725 var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9726 range: interval
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9727 }, skip ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9728 if (method) interval = method[0], skip = method[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9729 return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9730 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9731 scale.tickFormat = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9732 return format;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9733 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9734 scale.copy = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9735 return d3_time_scale(linear.copy(), methods, format);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9736 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9737 return d3_scale_linearRebind(scale, linear);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9738 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9739 function d3_time_scaleDate(t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9740 return new Date(t);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9741 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9742 var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9743 var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9744 var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9745 return d.getMilliseconds();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9746 } ], [ ":%S", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9747 return d.getSeconds();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9748 } ], [ "%I:%M", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9749 return d.getMinutes();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9750 } ], [ "%I %p", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9751 return d.getHours();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9752 } ], [ "%a %d", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9753 return d.getDay() && d.getDate() != 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9754 } ], [ "%b %d", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9755 return d.getDate() != 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9756 } ], [ "%B", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9757 return d.getMonth();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9758 } ], [ "%Y", d3_true ] ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9759 var d3_time_scaleMilliseconds = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9760 range: function(start, stop, step) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9761 return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9762 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9763 floor: d3_identity,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9764 ceil: d3_identity
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9765 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9766 d3_time_scaleLocalMethods.year = d3_time.year;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9767 d3_time.scale = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9768 return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9769 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9770 var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9771 return [ m[0].utc, m[1] ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9772 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9773 var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9774 return d.getUTCMilliseconds();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9775 } ], [ ":%S", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9776 return d.getUTCSeconds();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9777 } ], [ "%I:%M", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9778 return d.getUTCMinutes();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9779 } ], [ "%I %p", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9780 return d.getUTCHours();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9781 } ], [ "%a %d", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9782 return d.getUTCDay() && d.getUTCDate() != 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9783 } ], [ "%b %d", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9784 return d.getUTCDate() != 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9785 } ], [ "%B", function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9786 return d.getUTCMonth();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9787 } ], [ "%Y", d3_true ] ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9788 d3_time_scaleUtcMethods.year = d3_time.year.utc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9789 d3_time.scale.utc = function() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9790 return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9791 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9792 d3.text = d3_xhrType(function(request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9793 return request.responseText;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9794 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9795 d3.json = function(url, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9796 return d3_xhr(url, "application/json", d3_json, callback);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9797 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9798 function d3_json(request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9799 return JSON.parse(request.responseText);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9800 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9801 d3.html = function(url, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9802 return d3_xhr(url, "text/html", d3_html, callback);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9803 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9804 function d3_html(request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9805 var range = d3_document.createRange();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9806 range.selectNode(d3_document.body);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9807 return range.createContextualFragment(request.responseText);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9808 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9809 d3.xml = d3_xhrType(function(request) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9810 return request.responseXML;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9811 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9812 if (typeof define === "function" && define.amd) define(d3); else if (typeof module === "object" && module.exports) module.exports = d3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9813 this.d3 = d3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9814 }();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9815 (function(exports){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9816 crossfilter.version = "1.3.11";
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9817 function crossfilter_identity(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9818 return d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9819 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9820 crossfilter.permute = permute;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9821
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9822 function permute(array, index) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9823 for (var i = 0, n = index.length, copy = new Array(n); i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9824 copy[i] = array[index[i]];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9825 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9826 return copy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9827 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9828 var bisect = crossfilter.bisect = bisect_by(crossfilter_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9829
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9830 bisect.by = bisect_by;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9831
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9832 function bisect_by(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9833
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9834 // Locate the insertion point for x in a to maintain sorted order. The
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9835 // arguments lo and hi may be used to specify a subset of the array which
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9836 // should be considered; by default the entire array is used. If x is already
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9837 // present in a, the insertion point will be before (to the left of) any
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9838 // existing entries. The return value is suitable for use as the first
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9839 // argument to `array.splice` assuming that a is already sorted.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9840 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9841 // The returned insertion point i partitions the array a into two halves so
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9842 // that all v < x for v in a[lo:i] for the left side and all v >= x for v in
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9843 // a[i:hi] for the right side.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9844 function bisectLeft(a, x, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9845 while (lo < hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9846 var mid = lo + hi >>> 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9847 if (f(a[mid]) < x) lo = mid + 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9848 else hi = mid;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9849 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9850 return lo;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9851 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9852
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9853 // Similar to bisectLeft, but returns an insertion point which comes after (to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9854 // the right of) any existing entries of x in a.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9855 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9856 // The returned insertion point i partitions the array into two halves so that
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9857 // all v <= x for v in a[lo:i] for the left side and all v > x for v in
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9858 // a[i:hi] for the right side.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9859 function bisectRight(a, x, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9860 while (lo < hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9861 var mid = lo + hi >>> 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9862 if (x < f(a[mid])) hi = mid;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9863 else lo = mid + 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9864 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9865 return lo;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9866 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9867
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9868 bisectRight.right = bisectRight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9869 bisectRight.left = bisectLeft;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9870 return bisectRight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9871 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9872 var heap = crossfilter.heap = heap_by(crossfilter_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9873
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9874 heap.by = heap_by;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9875
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9876 function heap_by(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9877
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9878 // Builds a binary heap within the specified array a[lo:hi]. The heap has the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9879 // property such that the parent a[lo+i] is always less than or equal to its
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9880 // two children: a[lo+2*i+1] and a[lo+2*i+2].
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9881 function heap(a, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9882 var n = hi - lo,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9883 i = (n >>> 1) + 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9884 while (--i > 0) sift(a, i, n, lo);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9885 return a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9886 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9887
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9888 // Sorts the specified array a[lo:hi] in descending order, assuming it is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9889 // already a heap.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9890 function sort(a, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9891 var n = hi - lo,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9892 t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9893 while (--n > 0) t = a[lo], a[lo] = a[lo + n], a[lo + n] = t, sift(a, 1, n, lo);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9894 return a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9895 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9896
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9897 // Sifts the element a[lo+i-1] down the heap, where the heap is the contiguous
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9898 // slice of array a[lo:lo+n]. This method can also be used to update the heap
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9899 // incrementally, without incurring the full cost of reconstructing the heap.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9900 function sift(a, i, n, lo) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9901 var d = a[--lo + i],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9902 x = f(d),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9903 child;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9904 while ((child = i << 1) <= n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9905 if (child < n && f(a[lo + child]) > f(a[lo + child + 1])) child++;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9906 if (x <= f(a[lo + child])) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9907 a[lo + i] = a[lo + child];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9908 i = child;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9909 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9910 a[lo + i] = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9911 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9912
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9913 heap.sort = sort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9914 return heap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9915 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9916 var heapselect = crossfilter.heapselect = heapselect_by(crossfilter_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9917
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9918 heapselect.by = heapselect_by;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9919
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9920 function heapselect_by(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9921 var heap = heap_by(f);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9922
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9923 // Returns a new array containing the top k elements in the array a[lo:hi].
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9924 // The returned array is not sorted, but maintains the heap property. If k is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9925 // greater than hi - lo, then fewer than k elements will be returned. The
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9926 // order of elements in a is unchanged by this operation.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9927 function heapselect(a, lo, hi, k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9928 var queue = new Array(k = Math.min(hi - lo, k)),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9929 min,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9930 i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9931 x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9932 d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9933
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9934 for (i = 0; i < k; ++i) queue[i] = a[lo++];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9935 heap(queue, 0, k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9936
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9937 if (lo < hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9938 min = f(queue[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9939 do {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9940 if (x = f(d = a[lo]) > min) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9941 queue[0] = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9942 min = f(heap(queue, 0, k)[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9943 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9944 } while (++lo < hi);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9945 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9946
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9947 return queue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9948 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9949
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9950 return heapselect;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9951 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9952 var insertionsort = crossfilter.insertionsort = insertionsort_by(crossfilter_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9953
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9954 insertionsort.by = insertionsort_by;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9955
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9956 function insertionsort_by(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9957
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9958 function insertionsort(a, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9959 for (var i = lo + 1; i < hi; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9960 for (var j = i, t = a[i], x = f(t); j > lo && f(a[j - 1]) > x; --j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9961 a[j] = a[j - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9962 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9963 a[j] = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9964 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9965 return a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9966 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9967
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9968 return insertionsort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9969 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9970 // Algorithm designed by Vladimir Yaroslavskiy.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9971 // Implementation based on the Dart project; see lib/dart/LICENSE for details.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9972
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9973 var quicksort = crossfilter.quicksort = quicksort_by(crossfilter_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9974
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9975 quicksort.by = quicksort_by;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9976
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9977 function quicksort_by(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9978 var insertionsort = insertionsort_by(f);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9979
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9980 function sort(a, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9981 return (hi - lo < quicksort_sizeThreshold
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9982 ? insertionsort
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9983 : quicksort)(a, lo, hi);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9984 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9985
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9986 function quicksort(a, lo, hi) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9987 // Compute the two pivots by looking at 5 elements.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9988 var sixth = (hi - lo) / 6 | 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9989 i1 = lo + sixth,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9990 i5 = hi - 1 - sixth,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9991 i3 = lo + hi - 1 >> 1, // The midpoint.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9992 i2 = i3 - sixth,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9993 i4 = i3 + sixth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9994
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9995 var e1 = a[i1], x1 = f(e1),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9996 e2 = a[i2], x2 = f(e2),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9997 e3 = a[i3], x3 = f(e3),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9998 e4 = a[i4], x4 = f(e4),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
9999 e5 = a[i5], x5 = f(e5);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10000
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10001 var t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10002
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10003 // Sort the selected 5 elements using a sorting network.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10004 if (x1 > x2) t = e1, e1 = e2, e2 = t, t = x1, x1 = x2, x2 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10005 if (x4 > x5) t = e4, e4 = e5, e5 = t, t = x4, x4 = x5, x5 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10006 if (x1 > x3) t = e1, e1 = e3, e3 = t, t = x1, x1 = x3, x3 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10007 if (x2 > x3) t = e2, e2 = e3, e3 = t, t = x2, x2 = x3, x3 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10008 if (x1 > x4) t = e1, e1 = e4, e4 = t, t = x1, x1 = x4, x4 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10009 if (x3 > x4) t = e3, e3 = e4, e4 = t, t = x3, x3 = x4, x4 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10010 if (x2 > x5) t = e2, e2 = e5, e5 = t, t = x2, x2 = x5, x5 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10011 if (x2 > x3) t = e2, e2 = e3, e3 = t, t = x2, x2 = x3, x3 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10012 if (x4 > x5) t = e4, e4 = e5, e5 = t, t = x4, x4 = x5, x5 = t;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10013
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10014 var pivot1 = e2, pivotValue1 = x2,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10015 pivot2 = e4, pivotValue2 = x4;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10016
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10017 // e2 and e4 have been saved in the pivot variables. They will be written
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10018 // back, once the partitioning is finished.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10019 a[i1] = e1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10020 a[i2] = a[lo];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10021 a[i3] = e3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10022 a[i4] = a[hi - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10023 a[i5] = e5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10024
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10025 var less = lo + 1, // First element in the middle partition.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10026 great = hi - 2; // Last element in the middle partition.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10027
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10028 // Note that for value comparison, <, <=, >= and > coerce to a primitive via
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10029 // Object.prototype.valueOf; == and === do not, so in order to be consistent
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10030 // with natural order (such as for Date objects), we must do two compares.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10031 var pivotsEqual = pivotValue1 <= pivotValue2 && pivotValue1 >= pivotValue2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10032 if (pivotsEqual) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10033
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10034 // Degenerated case where the partitioning becomes a dutch national flag
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10035 // problem.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10036 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10037 // [ | < pivot | == pivot | unpartitioned | > pivot | ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10038 // ^ ^ ^ ^ ^
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10039 // left less k great right
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10040 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10041 // a[left] and a[right] are undefined and are filled after the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10042 // partitioning.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10043 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10044 // Invariants:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10045 // 1) for x in ]left, less[ : x < pivot.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10046 // 2) for x in [less, k[ : x == pivot.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10047 // 3) for x in ]great, right[ : x > pivot.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10048 for (var k = less; k <= great; ++k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10049 var ek = a[k], xk = f(ek);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10050 if (xk < pivotValue1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10051 if (k !== less) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10052 a[k] = a[less];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10053 a[less] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10054 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10055 ++less;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10056 } else if (xk > pivotValue1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10057
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10058 // Find the first element <= pivot in the range [k - 1, great] and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10059 // put [:ek:] there. We know that such an element must exist:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10060 // When k == less, then el3 (which is equal to pivot) lies in the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10061 // interval. Otherwise a[k - 1] == pivot and the search stops at k-1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10062 // Note that in the latter case invariant 2 will be violated for a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10063 // short amount of time. The invariant will be restored when the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10064 // pivots are put into their final positions.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10065 while (true) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10066 var greatValue = f(a[great]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10067 if (greatValue > pivotValue1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10068 great--;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10069 // This is the only location in the while-loop where a new
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10070 // iteration is started.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10071 continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10072 } else if (greatValue < pivotValue1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10073 // Triple exchange.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10074 a[k] = a[less];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10075 a[less++] = a[great];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10076 a[great--] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10077 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10078 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10079 a[k] = a[great];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10080 a[great--] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10081 // Note: if great < k then we will exit the outer loop and fix
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10082 // invariant 2 (which we just violated).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10083 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10084 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10085 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10086 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10087 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10088 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10089
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10090 // We partition the list into three parts:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10091 // 1. < pivot1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10092 // 2. >= pivot1 && <= pivot2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10093 // 3. > pivot2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10094 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10095 // During the loop we have:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10096 // [ | < pivot1 | >= pivot1 && <= pivot2 | unpartitioned | > pivot2 | ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10097 // ^ ^ ^ ^ ^
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10098 // left less k great right
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10099 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10100 // a[left] and a[right] are undefined and are filled after the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10101 // partitioning.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10102 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10103 // Invariants:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10104 // 1. for x in ]left, less[ : x < pivot1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10105 // 2. for x in [less, k[ : pivot1 <= x && x <= pivot2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10106 // 3. for x in ]great, right[ : x > pivot2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10107 for (var k = less; k <= great; k++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10108 var ek = a[k], xk = f(ek);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10109 if (xk < pivotValue1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10110 if (k !== less) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10111 a[k] = a[less];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10112 a[less] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10113 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10114 ++less;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10115 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10116 if (xk > pivotValue2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10117 while (true) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10118 var greatValue = f(a[great]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10119 if (greatValue > pivotValue2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10120 great--;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10121 if (great < k) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10122 // This is the only location inside the loop where a new
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10123 // iteration is started.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10124 continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10125 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10126 // a[great] <= pivot2.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10127 if (greatValue < pivotValue1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10128 // Triple exchange.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10129 a[k] = a[less];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10130 a[less++] = a[great];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10131 a[great--] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10132 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10133 // a[great] >= pivot1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10134 a[k] = a[great];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10135 a[great--] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10136 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10137 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10138 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10139 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10140 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10141 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10142 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10143 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10144
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10145 // Move pivots into their final positions.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10146 // We shrunk the list from both sides (a[left] and a[right] have
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10147 // meaningless values in them) and now we move elements from the first
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10148 // and third partition into these locations so that we can store the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10149 // pivots.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10150 a[lo] = a[less - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10151 a[less - 1] = pivot1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10152 a[hi - 1] = a[great + 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10153 a[great + 1] = pivot2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10154
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10155 // The list is now partitioned into three partitions:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10156 // [ < pivot1 | >= pivot1 && <= pivot2 | > pivot2 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10157 // ^ ^ ^ ^
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10158 // left less great right
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10159
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10160 // Recursive descent. (Don't include the pivot values.)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10161 sort(a, lo, less - 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10162 sort(a, great + 2, hi);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10163
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10164 if (pivotsEqual) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10165 // All elements in the second partition are equal to the pivot. No
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10166 // need to sort them.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10167 return a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10168 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10169
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10170 // In theory it should be enough to call _doSort recursively on the second
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10171 // partition.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10172 // The Android source however removes the pivot elements from the recursive
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10173 // call if the second partition is too large (more than 2/3 of the list).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10174 if (less < i1 && great > i5) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10175 var lessValue, greatValue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10176 while ((lessValue = f(a[less])) <= pivotValue1 && lessValue >= pivotValue1) ++less;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10177 while ((greatValue = f(a[great])) <= pivotValue2 && greatValue >= pivotValue2) --great;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10178
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10179 // Copy paste of the previous 3-way partitioning with adaptions.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10180 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10181 // We partition the list into three parts:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10182 // 1. == pivot1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10183 // 2. > pivot1 && < pivot2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10184 // 3. == pivot2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10185 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10186 // During the loop we have:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10187 // [ == pivot1 | > pivot1 && < pivot2 | unpartitioned | == pivot2 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10188 // ^ ^ ^
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10189 // less k great
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10190 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10191 // Invariants:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10192 // 1. for x in [ *, less[ : x == pivot1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10193 // 2. for x in [less, k[ : pivot1 < x && x < pivot2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10194 // 3. for x in ]great, * ] : x == pivot2
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10195 for (var k = less; k <= great; k++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10196 var ek = a[k], xk = f(ek);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10197 if (xk <= pivotValue1 && xk >= pivotValue1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10198 if (k !== less) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10199 a[k] = a[less];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10200 a[less] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10201 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10202 less++;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10203 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10204 if (xk <= pivotValue2 && xk >= pivotValue2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10205 while (true) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10206 var greatValue = f(a[great]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10207 if (greatValue <= pivotValue2 && greatValue >= pivotValue2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10208 great--;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10209 if (great < k) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10210 // This is the only location inside the loop where a new
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10211 // iteration is started.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10212 continue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10213 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10214 // a[great] < pivot2.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10215 if (greatValue < pivotValue1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10216 // Triple exchange.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10217 a[k] = a[less];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10218 a[less++] = a[great];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10219 a[great--] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10220 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10221 // a[great] == pivot1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10222 a[k] = a[great];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10223 a[great--] = ek;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10224 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10225 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10226 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10227 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10228 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10229 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10230 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10231 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10232
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10233 // The second partition has now been cleared of pivot elements and looks
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10234 // as follows:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10235 // [ * | > pivot1 && < pivot2 | * ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10236 // ^ ^
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10237 // less great
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10238 // Sort the second partition using recursive descent.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10239
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10240 // The second partition looks as follows:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10241 // [ * | >= pivot1 && <= pivot2 | * ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10242 // ^ ^
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10243 // less great
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10244 // Simply sort it by recursive descent.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10245
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10246 return sort(a, less, great + 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10247 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10248
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10249 return sort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10250 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10251
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10252 var quicksort_sizeThreshold = 32;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10253 var crossfilter_array8 = crossfilter_arrayUntyped,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10254 crossfilter_array16 = crossfilter_arrayUntyped,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10255 crossfilter_array32 = crossfilter_arrayUntyped,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10256 crossfilter_arrayLengthen = crossfilter_arrayLengthenUntyped,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10257 crossfilter_arrayWiden = crossfilter_arrayWidenUntyped;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10258
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10259 if (typeof Uint8Array !== "undefined") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10260 crossfilter_array8 = function(n) { return new Uint8Array(n); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10261 crossfilter_array16 = function(n) { return new Uint16Array(n); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10262 crossfilter_array32 = function(n) { return new Uint32Array(n); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10263
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10264 crossfilter_arrayLengthen = function(array, length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10265 if (array.length >= length) return array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10266 var copy = new array.constructor(length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10267 copy.set(array);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10268 return copy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10269 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10270
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10271 crossfilter_arrayWiden = function(array, width) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10272 var copy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10273 switch (width) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10274 case 16: copy = crossfilter_array16(array.length); break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10275 case 32: copy = crossfilter_array32(array.length); break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10276 default: throw new Error("invalid array width!");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10277 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10278 copy.set(array);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10279 return copy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10280 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10281 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10282
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10283 function crossfilter_arrayUntyped(n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10284 var array = new Array(n), i = -1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10285 while (++i < n) array[i] = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10286 return array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10287 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10288
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10289 function crossfilter_arrayLengthenUntyped(array, length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10290 var n = array.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10291 while (n < length) array[n++] = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10292 return array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10293 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10294
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10295 function crossfilter_arrayWidenUntyped(array, width) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10296 if (width > 32) throw new Error("invalid array width!");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10297 return array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10298 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10299 function crossfilter_filterExact(bisect, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10300 return function(values) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10301 var n = values.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10302 return [bisect.left(values, value, 0, n), bisect.right(values, value, 0, n)];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10303 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10304 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10305
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10306 function crossfilter_filterRange(bisect, range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10307 var min = range[0],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10308 max = range[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10309 return function(values) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10310 var n = values.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10311 return [bisect.left(values, min, 0, n), bisect.left(values, max, 0, n)];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10312 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10313 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10314
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10315 function crossfilter_filterAll(values) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10316 return [0, values.length];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10317 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10318 function crossfilter_null() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10319 return null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10320 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10321 function crossfilter_zero() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10322 return 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10323 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10324 function crossfilter_reduceIncrement(p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10325 return p + 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10326 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10327
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10328 function crossfilter_reduceDecrement(p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10329 return p - 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10330 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10331
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10332 function crossfilter_reduceAdd(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10333 return function(p, v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10334 return p + +f(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10335 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10336 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10337
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10338 function crossfilter_reduceSubtract(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10339 return function(p, v) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10340 return p - f(v);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10341 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10342 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10343 exports.crossfilter = crossfilter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10344
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10345 function crossfilter() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10346 var crossfilter = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10347 add: add,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10348 remove: removeData,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10349 dimension: dimension,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10350 groupAll: groupAll,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10351 size: size
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10352 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10353
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10354 var data = [], // the records
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10355 n = 0, // the number of records; data.length
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10356 m = 0, // a bit mask representing which dimensions are in use
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10357 M = 8, // number of dimensions that can fit in `filters`
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10358 filters = crossfilter_array8(0), // M bits per record; 1 is filtered out
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10359 filterListeners = [], // when the filters change
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10360 dataListeners = [], // when data is added
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10361 removeDataListeners = []; // when data is removed
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10362
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10363 // Adds the specified new records to this crossfilter.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10364 function add(newData) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10365 var n0 = n,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10366 n1 = newData.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10367
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10368 // If there's actually new data to add…
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10369 // Merge the new data into the existing data.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10370 // Lengthen the filter bitset to handle the new records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10371 // Notify listeners (dimensions and groups) that new data is available.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10372 if (n1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10373 data = data.concat(newData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10374 filters = crossfilter_arrayLengthen(filters, n += n1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10375 dataListeners.forEach(function(l) { l(newData, n0, n1); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10376 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10377
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10378 return crossfilter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10379 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10380
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10381 // Removes all records that match the current filters.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10382 function removeData() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10383 var newIndex = crossfilter_index(n, n),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10384 removed = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10385 for (var i = 0, j = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10386 if (filters[i]) newIndex[i] = j++;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10387 else removed.push(i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10388 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10389
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10390 // Remove all matching records from groups.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10391 filterListeners.forEach(function(l) { l(0, [], removed); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10392
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10393 // Update indexes.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10394 removeDataListeners.forEach(function(l) { l(newIndex); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10395
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10396 // Remove old filters and data by overwriting.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10397 for (var i = 0, j = 0, k; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10398 if (k = filters[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10399 if (i !== j) filters[j] = k, data[j] = data[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10400 ++j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10401 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10402 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10403 data.length = j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10404 while (n > j) filters[--n] = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10405 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10406
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10407 // Adds a new dimension with the specified value accessor function.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10408 function dimension(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10409 var dimension = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10410 filter: filter,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10411 filterExact: filterExact,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10412 filterRange: filterRange,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10413 filterFunction: filterFunction,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10414 filterAll: filterAll,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10415 top: top,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10416 bottom: bottom,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10417 group: group,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10418 groupAll: groupAll,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10419 dispose: dispose,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10420 remove: dispose // for backwards-compatibility
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10421 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10422
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10423 var one = ~m & -~m, // lowest unset bit as mask, e.g., 00001000
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10424 zero = ~one, // inverted one, e.g., 11110111
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10425 values, // sorted, cached array
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10426 index, // value rank ↦ object id
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10427 newValues, // temporary array storing newly-added values
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10428 newIndex, // temporary array storing newly-added index
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10429 sort = quicksort_by(function(i) { return newValues[i]; }),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10430 refilter = crossfilter_filterAll, // for recomputing filter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10431 refilterFunction, // the custom filter function in use
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10432 indexListeners = [], // when data is added
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10433 dimensionGroups = [],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10434 lo0 = 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10435 hi0 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10436
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10437 // Updating a dimension is a two-stage process. First, we must update the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10438 // associated filters for the newly-added records. Once all dimensions have
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10439 // updated their filters, the groups are notified to update.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10440 dataListeners.unshift(preAdd);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10441 dataListeners.push(postAdd);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10442
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10443 removeDataListeners.push(removeData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10444
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10445 // Incorporate any existing data into this dimension, and make sure that the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10446 // filter bitset is wide enough to handle the new dimension.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10447 m |= one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10448 if (M >= 32 ? !one : m & (1 << M) - 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10449 filters = crossfilter_arrayWiden(filters, M <<= 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10450 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10451 preAdd(data, 0, n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10452 postAdd(data, 0, n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10453
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10454 // Incorporates the specified new records into this dimension.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10455 // This function is responsible for updating filters, values, and index.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10456 function preAdd(newData, n0, n1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10457
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10458 // Permute new values into natural order using a sorted index.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10459 newValues = newData.map(value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10460 newIndex = sort(crossfilter_range(n1), 0, n1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10461 newValues = permute(newValues, newIndex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10462
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10463 // Bisect newValues to determine which new records are selected.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10464 var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1], i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10465 if (refilterFunction) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10466 for (i = 0; i < n1; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10467 if (!refilterFunction(newValues[i], i)) filters[newIndex[i] + n0] |= one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10468 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10469 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10470 for (i = 0; i < lo1; ++i) filters[newIndex[i] + n0] |= one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10471 for (i = hi1; i < n1; ++i) filters[newIndex[i] + n0] |= one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10472 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10473
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10474 // If this dimension previously had no data, then we don't need to do the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10475 // more expensive merge operation; use the new values and index as-is.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10476 if (!n0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10477 values = newValues;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10478 index = newIndex;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10479 lo0 = lo1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10480 hi0 = hi1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10481 return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10482 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10483
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10484 var oldValues = values,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10485 oldIndex = index,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10486 i0 = 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10487 i1 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10488
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10489 // Otherwise, create new arrays into which to merge new and old.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10490 values = new Array(n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10491 index = crossfilter_index(n, n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10492
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10493 // Merge the old and new sorted values, and old and new index.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10494 for (i = 0; i0 < n0 && i1 < n1; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10495 if (oldValues[i0] < newValues[i1]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10496 values[i] = oldValues[i0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10497 index[i] = oldIndex[i0++];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10498 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10499 values[i] = newValues[i1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10500 index[i] = newIndex[i1++] + n0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10501 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10502 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10503
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10504 // Add any remaining old values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10505 for (; i0 < n0; ++i0, ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10506 values[i] = oldValues[i0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10507 index[i] = oldIndex[i0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10508 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10509
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10510 // Add any remaining new values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10511 for (; i1 < n1; ++i1, ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10512 values[i] = newValues[i1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10513 index[i] = newIndex[i1] + n0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10514 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10515
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10516 // Bisect again to recompute lo0 and hi0.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10517 bounds = refilter(values), lo0 = bounds[0], hi0 = bounds[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10518 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10519
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10520 // When all filters have updated, notify index listeners of the new values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10521 function postAdd(newData, n0, n1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10522 indexListeners.forEach(function(l) { l(newValues, newIndex, n0, n1); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10523 newValues = newIndex = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10524 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10525
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10526 function removeData(reIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10527 for (var i = 0, j = 0, k; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10528 if (filters[k = index[i]]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10529 if (i !== j) values[j] = values[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10530 index[j] = reIndex[k];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10531 ++j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10532 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10533 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10534 values.length = j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10535 while (j < n) index[j++] = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10536
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10537 // Bisect again to recompute lo0 and hi0.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10538 var bounds = refilter(values);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10539 lo0 = bounds[0], hi0 = bounds[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10540 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10541
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10542 // Updates the selected values based on the specified bounds [lo, hi].
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10543 // This implementation is used by all the public filter methods.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10544 function filterIndexBounds(bounds) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10545 var lo1 = bounds[0],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10546 hi1 = bounds[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10547
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10548 if (refilterFunction) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10549 refilterFunction = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10550 filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10551 lo0 = lo1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10552 hi0 = hi1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10553 return dimension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10554 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10555
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10556 var i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10557 j,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10558 k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10559 added = [],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10560 removed = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10561
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10562 // Fast incremental update based on previous lo index.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10563 if (lo1 < lo0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10564 for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10565 filters[k = index[i]] ^= one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10566 added.push(k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10567 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10568 } else if (lo1 > lo0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10569 for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10570 filters[k = index[i]] ^= one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10571 removed.push(k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10572 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10573 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10574
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10575 // Fast incremental update based on previous hi index.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10576 if (hi1 > hi0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10577 for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10578 filters[k = index[i]] ^= one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10579 added.push(k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10580 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10581 } else if (hi1 < hi0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10582 for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10583 filters[k = index[i]] ^= one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10584 removed.push(k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10585 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10586 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10587
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10588 lo0 = lo1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10589 hi0 = hi1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10590 filterListeners.forEach(function(l) { l(one, added, removed); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10591 return dimension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10592 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10593
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10594 // Filters this dimension using the specified range, value, or null.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10595 // If the range is null, this is equivalent to filterAll.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10596 // If the range is an array, this is equivalent to filterRange.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10597 // Otherwise, this is equivalent to filterExact.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10598 function filter(range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10599 return range == null
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10600 ? filterAll() : Array.isArray(range)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10601 ? filterRange(range) : typeof range === "function"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10602 ? filterFunction(range)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10603 : filterExact(range);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10604 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10605
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10606 // Filters this dimension to select the exact value.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10607 function filterExact(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10608 return filterIndexBounds((refilter = crossfilter_filterExact(bisect, value))(values));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10609 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10610
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10611 // Filters this dimension to select the specified range [lo, hi].
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10612 // The lower bound is inclusive, and the upper bound is exclusive.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10613 function filterRange(range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10614 return filterIndexBounds((refilter = crossfilter_filterRange(bisect, range))(values));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10615 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10616
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10617 // Clears any filters on this dimension.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10618 function filterAll() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10619 return filterIndexBounds((refilter = crossfilter_filterAll)(values));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10620 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10621
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10622 // Filters this dimension using an arbitrary function.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10623 function filterFunction(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10624 refilter = crossfilter_filterAll;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10625
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10626 filterIndexFunction(refilterFunction = f);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10627
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10628 lo0 = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10629 hi0 = n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10630
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10631 return dimension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10632 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10633
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10634 function filterIndexFunction(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10635 var i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10636 k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10637 x,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10638 added = [],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10639 removed = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10640
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10641 for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10642 if (!(filters[k = index[i]] & one) ^ !!(x = f(values[i], i))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10643 if (x) filters[k] &= zero, added.push(k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10644 else filters[k] |= one, removed.push(k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10645 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10646 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10647 filterListeners.forEach(function(l) { l(one, added, removed); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10648 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10649
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10650 // Returns the top K selected records based on this dimension's order.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10651 // Note: observes this dimension's filter, unlike group and groupAll.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10652 function top(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10653 var array = [],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10654 i = hi0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10655 j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10656
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10657 while (--i >= lo0 && k > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10658 if (!filters[j = index[i]]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10659 array.push(data[j]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10660 --k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10661 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10662 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10663
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10664 return array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10665 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10666
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10667 // Returns the bottom K selected records based on this dimension's order.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10668 // Note: observes this dimension's filter, unlike group and groupAll.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10669 function bottom(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10670 var array = [],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10671 i = lo0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10672 j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10673
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10674 while (i < hi0 && k > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10675 if (!filters[j = index[i]]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10676 array.push(data[j]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10677 --k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10678 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10679 i++;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10680 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10681
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10682 return array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10683 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10684
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10685 // Adds a new group to this dimension, using the specified key function.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10686 function group(key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10687 var group = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10688 top: top,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10689 all: all,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10690 reduce: reduce,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10691 reduceCount: reduceCount,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10692 reduceSum: reduceSum,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10693 order: order,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10694 orderNatural: orderNatural,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10695 size: size,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10696 dispose: dispose,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10697 remove: dispose // for backwards-compatibility
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10698 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10699
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10700 // Ensure that this group will be removed when the dimension is removed.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10701 dimensionGroups.push(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10702
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10703 var groups, // array of {key, value}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10704 groupIndex, // object id ↦ group id
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10705 groupWidth = 8,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10706 groupCapacity = crossfilter_capacity(groupWidth),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10707 k = 0, // cardinality
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10708 select,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10709 heap,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10710 reduceAdd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10711 reduceRemove,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10712 reduceInitial,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10713 update = crossfilter_null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10714 reset = crossfilter_null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10715 resetNeeded = true,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10716 groupAll = key === crossfilter_null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10717
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10718 if (arguments.length < 1) key = crossfilter_identity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10719
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10720 // The group listens to the crossfilter for when any dimension changes, so
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10721 // that it can update the associated reduce values. It must also listen to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10722 // the parent dimension for when data is added, and compute new keys.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10723 filterListeners.push(update);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10724 indexListeners.push(add);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10725 removeDataListeners.push(removeData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10726
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10727 // Incorporate any existing data into the grouping.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10728 add(values, index, 0, n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10729
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10730 // Incorporates the specified new values into this group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10731 // This function is responsible for updating groups and groupIndex.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10732 function add(newValues, newIndex, n0, n1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10733 var oldGroups = groups,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10734 reIndex = crossfilter_index(k, groupCapacity),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10735 add = reduceAdd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10736 initial = reduceInitial,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10737 k0 = k, // old cardinality
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10738 i0 = 0, // index of old group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10739 i1 = 0, // index of new record
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10740 j, // object id
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10741 g0, // old group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10742 x0, // old key
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10743 x1, // new key
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10744 g, // group to add
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10745 x; // key of group to add
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10746
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10747 // If a reset is needed, we don't need to update the reduce values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10748 if (resetNeeded) add = initial = crossfilter_null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10749
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10750 // Reset the new groups (k is a lower bound).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10751 // Also, make sure that groupIndex exists and is long enough.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10752 groups = new Array(k), k = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10753 groupIndex = k0 > 1 ? crossfilter_arrayLengthen(groupIndex, n) : crossfilter_index(n, groupCapacity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10754
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10755 // Get the first old key (x0 of g0), if it exists.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10756 if (k0) x0 = (g0 = oldGroups[0]).key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10757
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10758 // Find the first new key (x1), skipping NaN keys.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10759 while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10760
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10761 // While new keys remain…
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10762 while (i1 < n1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10763
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10764 // Determine the lesser of the two current keys; new and old.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10765 // If there are no old keys remaining, then always add the new key.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10766 if (g0 && x0 <= x1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10767 g = g0, x = x0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10768
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10769 // Record the new index of the old group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10770 reIndex[i0] = k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10771
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10772 // Retrieve the next old key.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10773 if (g0 = oldGroups[++i0]) x0 = g0.key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10774 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10775 g = {key: x1, value: initial()}, x = x1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10776 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10777
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10778 // Add the lesser group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10779 groups[k] = g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10780
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10781 // Add any selected records belonging to the added group, while
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10782 // advancing the new key and populating the associated group index.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10783 while (!(x1 > x)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10784 groupIndex[j = newIndex[i1] + n0] = k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10785 if (!(filters[j] & zero)) g.value = add(g.value, data[j]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10786 if (++i1 >= n1) break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10787 x1 = key(newValues[i1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10788 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10789
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10790 groupIncrement();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10791 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10792
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10793 // Add any remaining old groups that were greater than all new keys.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10794 // No incremental reduce is needed; these groups have no new records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10795 // Also record the new index of the old group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10796 while (i0 < k0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10797 groups[reIndex[i0] = k] = oldGroups[i0++];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10798 groupIncrement();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10799 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10800
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10801 // If we added any new groups before any old groups,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10802 // update the group index of all the old records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10803 if (k > i0) for (i0 = 0; i0 < n0; ++i0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10804 groupIndex[i0] = reIndex[groupIndex[i0]];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10805 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10806
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10807 // Modify the update and reset behavior based on the cardinality.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10808 // If the cardinality is less than or equal to one, then the groupIndex
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10809 // is not needed. If the cardinality is zero, then there are no records
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10810 // and therefore no groups to update or reset. Note that we also must
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10811 // change the registered listener to point to the new method.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10812 j = filterListeners.indexOf(update);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10813 if (k > 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10814 update = updateMany;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10815 reset = resetMany;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10816 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10817 if (!k && groupAll) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10818 k = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10819 groups = [{key: null, value: initial()}];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10820 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10821 if (k === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10822 update = updateOne;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10823 reset = resetOne;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10824 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10825 update = crossfilter_null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10826 reset = crossfilter_null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10827 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10828 groupIndex = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10829 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10830 filterListeners[j] = update;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10831
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10832 // Count the number of added groups,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10833 // and widen the group index as needed.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10834 function groupIncrement() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10835 if (++k === groupCapacity) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10836 reIndex = crossfilter_arrayWiden(reIndex, groupWidth <<= 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10837 groupIndex = crossfilter_arrayWiden(groupIndex, groupWidth);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10838 groupCapacity = crossfilter_capacity(groupWidth);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10839 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10840 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10841 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10842
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10843 function removeData() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10844 if (k > 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10845 var oldK = k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10846 oldGroups = groups,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10847 seenGroups = crossfilter_index(oldK, oldK);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10848
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10849 // Filter out non-matches by copying matching group index entries to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10850 // the beginning of the array.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10851 for (var i = 0, j = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10852 if (filters[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10853 seenGroups[groupIndex[j] = groupIndex[i]] = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10854 ++j;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10855 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10856 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10857
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10858 // Reassemble groups including only those groups that were referred
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10859 // to by matching group index entries. Note the new group index in
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10860 // seenGroups.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10861 groups = [], k = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10862 for (i = 0; i < oldK; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10863 if (seenGroups[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10864 seenGroups[i] = k++;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10865 groups.push(oldGroups[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10866 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10867 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10868
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10869 if (k > 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10870 // Reindex the group index using seenGroups to find the new index.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10871 for (var i = 0; i < j; ++i) groupIndex[i] = seenGroups[groupIndex[i]];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10872 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10873 groupIndex = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10874 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10875 filterListeners[filterListeners.indexOf(update)] = k > 1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10876 ? (reset = resetMany, update = updateMany)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10877 : k === 1 ? (reset = resetOne, update = updateOne)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10878 : reset = update = crossfilter_null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10879 } else if (k === 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10880 if (groupAll) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10881 for (var i = 0; i < n; ++i) if (filters[i]) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10882 groups = [], k = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10883 filterListeners[filterListeners.indexOf(update)] =
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10884 update = reset = crossfilter_null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10885 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10886 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10887
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10888 // Reduces the specified selected or deselected records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10889 // This function is only used when the cardinality is greater than 1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10890 function updateMany(filterOne, added, removed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10891 if (filterOne === one || resetNeeded) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10892
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10893 var i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10894 k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10895 n,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10896 g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10897
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10898 // Add the added values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10899 for (i = 0, n = added.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10900 if (!(filters[k = added[i]] & zero)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10901 g = groups[groupIndex[k]];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10902 g.value = reduceAdd(g.value, data[k]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10903 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10904 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10905
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10906 // Remove the removed values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10907 for (i = 0, n = removed.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10908 if ((filters[k = removed[i]] & zero) === filterOne) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10909 g = groups[groupIndex[k]];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10910 g.value = reduceRemove(g.value, data[k]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10911 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10912 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10913 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10914
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10915 // Reduces the specified selected or deselected records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10916 // This function is only used when the cardinality is 1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10917 function updateOne(filterOne, added, removed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10918 if (filterOne === one || resetNeeded) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10919
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10920 var i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10921 k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10922 n,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10923 g = groups[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10924
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10925 // Add the added values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10926 for (i = 0, n = added.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10927 if (!(filters[k = added[i]] & zero)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10928 g.value = reduceAdd(g.value, data[k]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10929 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10930 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10931
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10932 // Remove the removed values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10933 for (i = 0, n = removed.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10934 if ((filters[k = removed[i]] & zero) === filterOne) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10935 g.value = reduceRemove(g.value, data[k]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10936 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10937 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10938 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10939
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10940 // Recomputes the group reduce values from scratch.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10941 // This function is only used when the cardinality is greater than 1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10942 function resetMany() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10943 var i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10944 g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10945
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10946 // Reset all group values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10947 for (i = 0; i < k; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10948 groups[i].value = reduceInitial();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10949 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10950
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10951 // Add any selected records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10952 for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10953 if (!(filters[i] & zero)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10954 g = groups[groupIndex[i]];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10955 g.value = reduceAdd(g.value, data[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10956 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10957 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10958 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10959
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10960 // Recomputes the group reduce values from scratch.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10961 // This function is only used when the cardinality is 1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10962 function resetOne() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10963 var i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10964 g = groups[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10965
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10966 // Reset the singleton group values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10967 g.value = reduceInitial();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10968
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10969 // Add any selected records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10970 for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10971 if (!(filters[i] & zero)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10972 g.value = reduceAdd(g.value, data[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10973 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10974 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10975 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10976
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10977 // Returns the array of group values, in the dimension's natural order.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10978 function all() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10979 if (resetNeeded) reset(), resetNeeded = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10980 return groups;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10981 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10982
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10983 // Returns a new array containing the top K group values, in reduce order.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10984 function top(k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10985 var top = select(all(), 0, groups.length, k);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10986 return heap.sort(top, 0, top.length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10987 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10988
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10989 // Sets the reduce behavior for this group to use the specified functions.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10990 // This method lazily recomputes the reduce values, waiting until needed.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10991 function reduce(add, remove, initial) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10992 reduceAdd = add;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10993 reduceRemove = remove;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10994 reduceInitial = initial;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10995 resetNeeded = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10996 return group;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10997 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10998
89592faa2875 Uploaded
chrisb
parents:
diff changeset
10999 // A convenience method for reducing by count.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11000 function reduceCount() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11001 return reduce(crossfilter_reduceIncrement, crossfilter_reduceDecrement, crossfilter_zero);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11002 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11003
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11004 // A convenience method for reducing by sum(value).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11005 function reduceSum(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11006 return reduce(crossfilter_reduceAdd(value), crossfilter_reduceSubtract(value), crossfilter_zero);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11007 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11008
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11009 // Sets the reduce order, using the specified accessor.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11010 function order(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11011 select = heapselect_by(valueOf);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11012 heap = heap_by(valueOf);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11013 function valueOf(d) { return value(d.value); }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11014 return group;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11015 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11016
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11017 // A convenience method for natural ordering by reduce value.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11018 function orderNatural() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11019 return order(crossfilter_identity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11020 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11021
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11022 // Returns the cardinality of this group, irrespective of any filters.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11023 function size() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11024 return k;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11025 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11026
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11027 // Removes this group and associated event listeners.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11028 function dispose() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11029 var i = filterListeners.indexOf(update);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11030 if (i >= 0) filterListeners.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11031 i = indexListeners.indexOf(add);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11032 if (i >= 0) indexListeners.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11033 i = removeDataListeners.indexOf(removeData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11034 if (i >= 0) removeDataListeners.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11035 return group;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11036 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11037
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11038 return reduceCount().orderNatural();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11039 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11040
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11041 // A convenience function for generating a singleton group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11042 function groupAll() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11043 var g = group(crossfilter_null), all = g.all;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11044 delete g.all;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11045 delete g.top;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11046 delete g.order;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11047 delete g.orderNatural;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11048 delete g.size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11049 g.value = function() { return all()[0].value; };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11050 return g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11051 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11052
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11053 // Removes this dimension and associated groups and event listeners.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11054 function dispose() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11055 dimensionGroups.forEach(function(group) { group.dispose(); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11056 var i = dataListeners.indexOf(preAdd);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11057 if (i >= 0) dataListeners.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11058 i = dataListeners.indexOf(postAdd);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11059 if (i >= 0) dataListeners.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11060 i = removeDataListeners.indexOf(removeData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11061 if (i >= 0) removeDataListeners.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11062 m &= zero;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11063 return filterAll();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11064 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11065
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11066 return dimension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11067 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11068
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11069 // A convenience method for groupAll on a dummy dimension.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11070 // This implementation can be optimized since it always has cardinality 1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11071 function groupAll() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11072 var group = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11073 reduce: reduce,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11074 reduceCount: reduceCount,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11075 reduceSum: reduceSum,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11076 value: value,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11077 dispose: dispose,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11078 remove: dispose // for backwards-compatibility
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11079 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11080
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11081 var reduceValue,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11082 reduceAdd,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11083 reduceRemove,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11084 reduceInitial,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11085 resetNeeded = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11086
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11087 // The group listens to the crossfilter for when any dimension changes, so
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11088 // that it can update the reduce value. It must also listen to the parent
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11089 // dimension for when data is added.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11090 filterListeners.push(update);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11091 dataListeners.push(add);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11092
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11093 // For consistency; actually a no-op since resetNeeded is true.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11094 add(data, 0, n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11095
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11096 // Incorporates the specified new values into this group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11097 function add(newData, n0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11098 var i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11099
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11100 if (resetNeeded) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11101
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11102 // Add the added values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11103 for (i = n0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11104 if (!filters[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11105 reduceValue = reduceAdd(reduceValue, data[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11106 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11107 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11108 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11109
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11110 // Reduces the specified selected or deselected records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11111 function update(filterOne, added, removed) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11112 var i,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11113 k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11114 n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11115
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11116 if (resetNeeded) return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11117
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11118 // Add the added values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11119 for (i = 0, n = added.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11120 if (!filters[k = added[i]]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11121 reduceValue = reduceAdd(reduceValue, data[k]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11122 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11123 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11124
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11125 // Remove the removed values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11126 for (i = 0, n = removed.length; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11127 if (filters[k = removed[i]] === filterOne) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11128 reduceValue = reduceRemove(reduceValue, data[k]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11129 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11130 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11131 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11132
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11133 // Recomputes the group reduce value from scratch.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11134 function reset() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11135 var i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11136
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11137 reduceValue = reduceInitial();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11138
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11139 for (i = 0; i < n; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11140 if (!filters[i]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11141 reduceValue = reduceAdd(reduceValue, data[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11142 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11143 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11144 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11145
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11146 // Sets the reduce behavior for this group to use the specified functions.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11147 // This method lazily recomputes the reduce value, waiting until needed.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11148 function reduce(add, remove, initial) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11149 reduceAdd = add;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11150 reduceRemove = remove;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11151 reduceInitial = initial;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11152 resetNeeded = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11153 return group;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11154 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11155
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11156 // A convenience method for reducing by count.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11157 function reduceCount() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11158 return reduce(crossfilter_reduceIncrement, crossfilter_reduceDecrement, crossfilter_zero);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11159 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11160
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11161 // A convenience method for reducing by sum(value).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11162 function reduceSum(value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11163 return reduce(crossfilter_reduceAdd(value), crossfilter_reduceSubtract(value), crossfilter_zero);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11164 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11165
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11166 // Returns the computed reduce value.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11167 function value() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11168 if (resetNeeded) reset(), resetNeeded = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11169 return reduceValue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11170 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11171
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11172 // Removes this group and associated event listeners.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11173 function dispose() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11174 var i = filterListeners.indexOf(update);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11175 if (i >= 0) filterListeners.splice(i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11176 i = dataListeners.indexOf(add);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11177 if (i >= 0) dataListeners.splice(i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11178 return group;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11179 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11180
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11181 return reduceCount();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11182 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11183
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11184 // Returns the number of records in this crossfilter, irrespective of any filters.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11185 function size() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11186 return n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11187 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11188
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11189 return arguments.length
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11190 ? add(arguments[0])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11191 : crossfilter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11192 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11193
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11194 // Returns an array of size n, big enough to store ids up to m.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11195 function crossfilter_index(n, m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11196 return (m < 0x101
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11197 ? crossfilter_array8 : m < 0x10001
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11198 ? crossfilter_array16
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11199 : crossfilter_array32)(n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11200 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11201
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11202 // Constructs a new array of size n, with sequential values from 0 to n - 1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11203 function crossfilter_range(n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11204 var range = crossfilter_index(n, n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11205 for (var i = -1; ++i < n;) range[i] = i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11206 return range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11207 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11208
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11209 function crossfilter_capacity(w) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11210 return w === 8
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11211 ? 0x100 : w === 16
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11212 ? 0x10000
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11213 : 0x100000000;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11214 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11215 })(typeof exports !== 'undefined' && exports || this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11216 /*!
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11217 * dc 2.0.0-alpha.5
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11218 * http://dc-js.github.io/dc.js/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11219 * Copyright 2012 Nick Zhu and other contributors
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11220 *
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11221 * Licensed under the Apache License, Version 2.0 (the "License");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11222 * you may not use this file except in compliance with the License.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11223 * You may obtain a copy of the License at
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11224 *
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11225 * http://www.apache.org/licenses/LICENSE-2.0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11226 *
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11227 * Unless required by applicable law or agreed to in writing, software
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11228 * distributed under the License is distributed on an "AS IS" BASIS,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11229 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11230 * See the License for the specific language governing permissions and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11231 * limitations under the License.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11232 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11233
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11234 (function() { function _dc(d3, crossfilter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11235 'use strict';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11236
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11237 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11238 #### Version 2.0.0-alpha.5
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11239 The entire dc.js library is scoped under the **dc** name space. It does not introduce anything else
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11240 into the global name space.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11241 #### Function Chaining
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11242 Most dc functions are designed to allow function chaining, meaning they return the current chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11243 instance whenever it is appropriate. This way chart configuration can be written in the following
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11244 style:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11245 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11246 chart.width(300)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11247 .height(300)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11248 .filter('sunday')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11249 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11250 The getter forms of functions do not participate in function chaining because they necessarily
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11251 return values that are not the chart. (Although some, such as `.svg` and `.xAxis`, return values
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11252 that are chainable d3 objects.)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11253
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11254 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11255
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11256 /*jshint -W062*/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11257 /*jshint -W079*/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11258 var dc = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11259 version: '2.0.0-alpha.5',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11260 constants: {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11261 CHART_CLASS: 'dc-chart',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11262 DEBUG_GROUP_CLASS: 'debug',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11263 STACK_CLASS: 'stack',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11264 DESELECTED_CLASS: 'deselected',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11265 SELECTED_CLASS: 'selected',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11266 NODE_INDEX_NAME: '__index__',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11267 GROUP_INDEX_NAME: '__group_index__',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11268 DEFAULT_CHART_GROUP: '__default_chart_group__',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11269 EVENT_DELAY: 40,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11270 NEGLIGIBLE_NUMBER: 1e-10
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11271 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11272 _renderlet: null
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11273 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11274
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11275 dc.chartRegistry = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11276 // chartGroup:string => charts:array
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11277 var _chartMap = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11278
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11279 function initializeChartGroup(group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11280 if (!group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11281 group = dc.constants.DEFAULT_CHART_GROUP;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11282 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11283
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11284 if (!_chartMap[group]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11285 _chartMap[group] = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11286 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11287
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11288 return group;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11289 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11290
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11291 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11292 has: function (chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11293 for (var e in _chartMap) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11294 if (_chartMap[e].indexOf(chart) >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11295 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11296 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11297 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11298 return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11299 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11300
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11301 register: function (chart, group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11302 group = initializeChartGroup(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11303 _chartMap[group].push(chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11304 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11305
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11306 deregister: function (chart, group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11307 group = initializeChartGroup(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11308 for (var i = 0; i < _chartMap[group].length; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11309 if (_chartMap[group][i].anchorName() === chart.anchorName()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11310 _chartMap[group].splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11311 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11312 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11313 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11314 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11315
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11316 clear: function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11317 if (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11318 delete _chartMap[group];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11319 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11320 _chartMap = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11321 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11322 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11323
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11324 list: function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11325 group = initializeChartGroup(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11326 return _chartMap[group];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11327 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11328 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11329 }();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11330 /*jshint +W062 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11331 /*jshint +W079*/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11332
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11333 dc.registerChart = function (chart, group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11334 dc.chartRegistry.register(chart, group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11335 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11336
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11337 dc.deregisterChart = function (chart, group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11338 dc.chartRegistry.deregister(chart, group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11339 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11340
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11341 dc.hasChart = function (chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11342 return dc.chartRegistry.has(chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11343 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11344
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11345 dc.deregisterAllCharts = function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11346 dc.chartRegistry.clear(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11347 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11348
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11349 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11350 ## Utilities
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11351 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11352
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11353 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11354 #### dc.filterAll([chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11355 Clear all filters on all charts within the given chart group. If the chart group is not given then
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11356 only charts that belong to the default chart group will be reset.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11357 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11358 dc.filterAll = function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11359 var charts = dc.chartRegistry.list(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11360 for (var i = 0; i < charts.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11361 charts[i].filterAll();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11362 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11363 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11364
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11365 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11366 #### dc.refocusAll([chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11367 Reset zoom level / focus on all charts that belong to the given chart group. If the chart group is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11368 not given then only charts that belong to the default chart group will be reset.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11369 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11370 dc.refocusAll = function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11371 var charts = dc.chartRegistry.list(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11372 for (var i = 0; i < charts.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11373 if (charts[i].focus) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11374 charts[i].focus();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11375 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11376 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11377 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11378
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11379 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11380 #### dc.renderAll([chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11381 Re-render all charts belong to the given chart group. If the chart group is not given then only
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11382 charts that belong to the default chart group will be re-rendered.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11383 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11384 dc.renderAll = function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11385 var charts = dc.chartRegistry.list(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11386 for (var i = 0; i < charts.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11387 charts[i].render();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11388 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11389
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11390 if (dc._renderlet !== null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11391 dc._renderlet(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11392 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11393 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11394
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11395 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11396 #### dc.redrawAll([chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11397 Redraw all charts belong to the given chart group. If the chart group is not given then only charts
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11398 that belong to the default chart group will be re-drawn. Redraw is different from re-render since
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11399 when redrawing dc tries to update the graphic incrementally, using transitions, instead of starting
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11400 from scratch.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11401 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11402 dc.redrawAll = function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11403 var charts = dc.chartRegistry.list(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11404 for (var i = 0; i < charts.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11405 charts[i].redraw();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11406 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11407
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11408 if (dc._renderlet !== null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11409 dc._renderlet(group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11410 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11411 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11412
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11413 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11414 #### dc.disableTransitions
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11415 If this boolean is set truthy, all transitions will be disabled, and changes to the charts will happen
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11416 immediately. Default: false
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11417 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11418 dc.disableTransitions = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11419
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11420 dc.transition = function (selections, duration, callback) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11421 if (duration <= 0 || duration === undefined || dc.disableTransitions) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11422 return selections;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11423 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11424
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11425 var s = selections
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11426 .transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11427 .duration(duration);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11428
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11429 if (typeof(callback) === 'function') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11430 callback(s);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11431 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11432
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11433 return s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11434 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11435
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11436 dc.units = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11437
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11438 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11439 #### dc.units.integers
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11440 `dc.units.integers` is the default value for `xUnits` for the [Coordinate Grid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11441 Chart](#coordinate-grid-chart) and should be used when the x values are a sequence of integers.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11442
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11443 It is a function that counts the number of integers in the range supplied in its start and end parameters.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11444
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11445 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11446 chart.xUnits(dc.units.integers) // already the default
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11447 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11448
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11449 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11450 dc.units.integers = function (s, e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11451 return Math.abs(e - s);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11452 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11453
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11454 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11455 #### dc.units.ordinal
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11456 This argument can be passed to the `xUnits` function of the to specify ordinal units for the x
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11457 axis. Usually this parameter is used in combination with passing `d3.scale.ordinal()` to `.x`.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11458
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11459 It just returns the domain passed to it, which for ordinal charts is an array of all values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11460
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11461 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11462 chart.xUnits(dc.units.ordinal)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11463 .x(d3.scale.ordinal())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11464 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11465
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11466 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11467 dc.units.ordinal = function (s, e, domain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11468 return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11469 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11470
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11471 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11472 #### dc.units.fp.precision(precision)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11473 This function generates an argument for the [Coordinate Grid Chart's](#coordinate-grid-chart)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11474 `xUnits` function specifying that the x values are floating-point numbers with the given
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11475 precision.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11476
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11477 The returned function determines how many values at the given precision will fit into the range
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11478 supplied in its start and end parameters.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11479
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11480 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11481 // specify values (and ticks) every 0.1 units
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11482 chart.xUnits(dc.units.fp.precision(0.1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11483 // there are 500 units between 0.5 and 1 if the precision is 0.001
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11484 var thousandths = dc.units.fp.precision(0.001);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11485 thousandths(0.5, 1.0) // returns 500
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11486 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11487 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11488 dc.units.fp = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11489 dc.units.fp.precision = function (precision) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11490 var _f = function (s, e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11491 var d = Math.abs((e - s) / _f.resolution);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11492 if (dc.utils.isNegligible(d - Math.floor(d))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11493 return Math.floor(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11494 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11495 return Math.ceil(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11496 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11497 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11498 _f.resolution = precision;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11499 return _f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11500 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11501
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11502 dc.round = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11503 dc.round.floor = function (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11504 return Math.floor(n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11505 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11506 dc.round.ceil = function (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11507 return Math.ceil(n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11508 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11509 dc.round.round = function (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11510 return Math.round(n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11511 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11512
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11513 dc.override = function (obj, functionName, newFunction) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11514 var existingFunction = obj[functionName];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11515 obj['_' + functionName] = existingFunction;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11516 obj[functionName] = newFunction;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11517 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11518
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11519 dc.renderlet = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11520 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11521 return dc._renderlet;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11522 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11523 dc._renderlet = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11524 return dc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11525 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11526
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11527 dc.instanceOfChart = function (o) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11528 return o instanceof Object && o.__dcFlag__ && true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11529 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11530
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11531 dc.errors = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11532
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11533 dc.errors.Exception = function (msg) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11534 var _msg = msg || 'Unexpected internal error';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11535
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11536 this.message = _msg;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11537
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11538 this.toString = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11539 return _msg;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11540 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11541 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11542
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11543 dc.errors.InvalidStateException = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11544 dc.errors.Exception.apply(this, arguments);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11545 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11546
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11547 dc.dateFormat = d3.time.format('%m/%d/%Y');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11548
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11549 dc.printers = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11550
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11551 dc.printers.filters = function (filters) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11552 var s = '';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11553
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11554 for (var i = 0; i < filters.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11555 if (i > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11556 s += ', ';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11557 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11558 s += dc.printers.filter(filters[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11559 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11560
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11561 return s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11562 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11563
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11564 dc.printers.filter = function (filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11565 var s = '';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11566
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11567 if (typeof filter !== 'undefined' && filter !== null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11568 if (filter instanceof Array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11569 if (filter.length >= 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11570 s = '[' + dc.utils.printSingleValue(filter[0]) + ' -> ' + dc.utils.printSingleValue(filter[1]) + ']';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11571 } else if (filter.length >= 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11572 s = dc.utils.printSingleValue(filter[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11573 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11574 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11575 s = dc.utils.printSingleValue(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11576 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11577 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11578
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11579 return s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11580 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11581
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11582 dc.pluck = function (n, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11583 if (!f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11584 return function (d) { return d[n]; };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11585 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11586 return function (d, i) { return f.call(d, d[n], i); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11587 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11588
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11589 dc.utils = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11590
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11591 dc.utils.printSingleValue = function (filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11592 var s = '' + filter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11593
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11594 if (filter instanceof Date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11595 s = dc.dateFormat(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11596 } else if (typeof(filter) === 'string') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11597 s = filter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11598 } else if (dc.utils.isFloat(filter)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11599 s = dc.utils.printSingleValue.fformat(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11600 } else if (dc.utils.isInteger(filter)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11601 s = Math.round(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11602 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11603
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11604 return s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11605 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11606 dc.utils.printSingleValue.fformat = d3.format('.2f');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11607
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11608 // FIXME: these assume than any string r is a percentage (whether or not it
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11609 // includes %). They also generate strange results if l is a string.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11610 dc.utils.add = function (l, r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11611 if (typeof r === 'string') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11612 r = r.replace('%', '');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11613 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11614
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11615 if (l instanceof Date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11616 if (typeof r === 'string') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11617 r = +r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11618 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11619 var d = new Date();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11620 d.setTime(l.getTime());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11621 d.setDate(l.getDate() + r);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11622 return d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11623 } else if (typeof r === 'string') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11624 var percentage = (+r / 100);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11625 return l > 0 ? l * (1 + percentage) : l * (1 - percentage);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11626 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11627 return l + r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11628 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11629 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11630
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11631 dc.utils.subtract = function (l, r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11632 if (typeof r === 'string') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11633 r = r.replace('%', '');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11634 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11635
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11636 if (l instanceof Date) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11637 if (typeof r === 'string') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11638 r = +r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11639 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11640 var d = new Date();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11641 d.setTime(l.getTime());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11642 d.setDate(l.getDate() - r);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11643 return d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11644 } else if (typeof r === 'string') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11645 var percentage = (+r / 100);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11646 return l < 0 ? l * (1 + percentage) : l * (1 - percentage);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11647 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11648 return l - r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11649 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11650 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11651
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11652 dc.utils.isNumber = function (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11653 return n === +n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11654 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11655
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11656 dc.utils.isFloat = function (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11657 return n === +n && n !== (n | 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11658 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11659
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11660 dc.utils.isInteger = function (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11661 return n === +n && n === (n | 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11662 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11663
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11664 dc.utils.isNegligible = function (n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11665 return !dc.utils.isNumber(n) || (n < dc.constants.NEGLIGIBLE_NUMBER && n > -dc.constants.NEGLIGIBLE_NUMBER);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11666 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11667
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11668 dc.utils.clamp = function (val, min, max) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11669 return val < min ? min : (val > max ? max : val);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11670 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11671
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11672 var _idCounter = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11673 dc.utils.uniqueId = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11674 return ++_idCounter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11675 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11676
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11677 dc.utils.nameToId = function (name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11678 return name.toLowerCase().replace(/[\s]/g, '_').replace(/[\.']/g, '');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11679 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11680
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11681 dc.utils.appendOrSelect = function (parent, selector, tag) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11682 tag = tag || selector;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11683 var element = parent.select(selector);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11684 if (element.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11685 element = parent.append(tag);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11686 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11687 return element;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11688 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11689
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11690 dc.utils.safeNumber = function (n) { return dc.utils.isNumber(+n) ? +n : 0;};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11691
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11692 dc.logger = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11693
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11694 dc.logger.enableDebugLog = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11695
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11696 dc.logger.warn = function (msg) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11697 if (console) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11698 if (console.warn) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11699 console.warn(msg);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11700 } else if (console.log) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11701 console.log(msg);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11702 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11703 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11704
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11705 return dc.logger;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11706 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11707
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11708 dc.logger.debug = function (msg) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11709 if (dc.logger.enableDebugLog && console) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11710 if (console.debug) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11711 console.debug(msg);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11712 } else if (console.log) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11713 console.log(msg);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11714 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11715 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11716
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11717 return dc.logger;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11718 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11719
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11720 dc.events = {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11721 current: null
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11722 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11723
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11724 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11725 #### dc.events.trigger(function[, delay])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11726 This function triggers a throttled event function with a specified delay (in milli-seconds). Events
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11727 that are triggered repetitively due to user interaction such brush dragging might flood the library
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11728 and invoke more renders than can be executed in time. Using this function to wrap your event
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11729 function allows the library to smooth out the rendering by throttling events and only responding to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11730 the most recent event.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11731
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11732 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11733 chart.renderlet(function(chart){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11734 // smooth the rendering through event throttling
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11735 dc.events.trigger(function(){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11736 // focus some other chart to the range selected by user on this chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11737 someOtherChart.focus(chart.filter());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11738 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11739 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11740 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11741 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11742 dc.events.trigger = function (closure, delay) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11743 if (!delay) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11744 closure();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11745 return;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11746 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11747
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11748 dc.events.current = closure;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11749
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11750 setTimeout(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11751 if (closure === dc.events.current) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11752 closure();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11753 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11754 }, delay);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11755 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11756
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11757 dc.filters = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11758
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11759 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11760 ## Filters
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11761 The dc.js filters are functions which are passed into crossfilter to chose which records will be
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11762 accumulated to produce values for the charts. In the crossfilter model, any filters applied on one
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11763 dimension will affect all the other dimensions but not that one. dc always applies a filter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11764 function to the dimension; the function combines multiple filters and if any of them accept a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11765 record, it is filtered in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11766
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11767 These filter constructors are used as appropriate by the various charts to implement brushing. We
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11768 mention below which chart uses which filter. In some cases, many instances of a filter will be added.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11769
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11770 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11771
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11772 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11773 #### dc.filters.RangedFilter(low, high)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11774 RangedFilter is a filter which accepts keys between `low` and `high`. It is used to implement X
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11775 axis brushing for the [coordinate grid charts](#coordinate-grid-mixin).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11776 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11777 dc.filters.RangedFilter = function (low, high) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11778 var range = new Array(low, high);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11779 range.isFiltered = function (value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11780 return value >= this[0] && value < this[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11781 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11782
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11783 return range;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11784 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11785
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11786 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11787 #### dc.filters.TwoDimensionalFilter(array)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11788 TwoDimensionalFilter is a filter which accepts a single two-dimensional value. It is used by the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11789 [heat map chart](#heat-map) to include particular cells as they are clicked. (Rows and columns are
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11790 filtered by filtering all the cells in the row or column.)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11791 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11792 dc.filters.TwoDimensionalFilter = function (array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11793 if (array === null) { return null; }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11794
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11795 var filter = array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11796 filter.isFiltered = function (value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11797 return value.length && value.length === filter.length &&
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11798 value[0] === filter[0] && value[1] === filter[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11799 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11800
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11801 return filter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11802 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11803
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11804 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11805 #### dc.filters.RangedTwoDimensionalFilter(array)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11806 The RangedTwoDimensionalFilter allows filtering all values which fit within a rectangular
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11807 region. It is used by the [scatter plot](#scatter-plot) to implement rectangular brushing.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11808
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11809 It takes two two-dimensional points in the form `[[x1,y1],[x2,y2]]`, and normalizes them so that
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11810 `x1 <= x2` and `y1 <- y2`. It then returns a filter which accepts any points which are in the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11811 rectangular range including the lower values but excluding the higher values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11812
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11813 If an array of two values are given to the RangedTwoDimensionalFilter, it interprets the values as
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11814 two x coordinates `x1` and `x2` and returns a filter which accepts any points for which `x1 <= x <
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11815 x2`.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11816 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11817 dc.filters.RangedTwoDimensionalFilter = function (array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11818 if (array === null) { return null; }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11819
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11820 var filter = array;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11821 var fromBottomLeft;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11822
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11823 if (filter[0] instanceof Array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11824 fromBottomLeft = [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11825 [Math.min(array[0][0], array[1][0]), Math.min(array[0][1], array[1][1])],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11826 [Math.max(array[0][0], array[1][0]), Math.max(array[0][1], array[1][1])]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11827 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11828 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11829 fromBottomLeft = [[array[0], -Infinity], [array[1], Infinity]];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11830 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11831
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11832 filter.isFiltered = function (value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11833 var x, y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11834
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11835 if (value instanceof Array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11836 if (value.length !== 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11837 return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11838 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11839 x = value[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11840 y = value[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11841 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11842 x = value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11843 y = fromBottomLeft[0][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11844 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11845
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11846 return x >= fromBottomLeft[0][0] && x < fromBottomLeft[1][0] &&
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11847 y >= fromBottomLeft[0][1] && y < fromBottomLeft[1][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11848 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11849
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11850 return filter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11851 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11852
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11853 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11854 ## Base Mixin
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11855 Base Mixin is an abstract functional object representing a basic dc chart object
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11856 for all chart and widget implementations. Methods from the Base Mixin are inherited
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11857 and available on all chart implementation in the DC library.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11858 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11859 dc.baseMixin = function (_chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11860 _chart.__dcFlag__ = dc.utils.uniqueId();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11861
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11862 var _dimension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11863 var _group;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11864
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11865 var _anchor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11866 var _root;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11867 var _svg;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11868
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11869 var _minWidth = 200;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11870 var _defaultWidth = function (element) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11871 var width = element && element.getBoundingClientRect && element.getBoundingClientRect().width;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11872 return (width && width > _minWidth) ? width : _minWidth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11873 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11874 var _width = _defaultWidth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11875
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11876 var _minHeight = 200;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11877 var _defaultHeight = function (element) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11878 var height = element && element.getBoundingClientRect && element.getBoundingClientRect().height;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11879 return (height && height > _minHeight) ? height : _minHeight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11880 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11881 var _height = _defaultHeight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11882
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11883 var _keyAccessor = dc.pluck('key');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11884 var _valueAccessor = dc.pluck('value');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11885 var _label = dc.pluck('key');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11886
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11887 var _ordering = dc.pluck('key');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11888 var _orderSort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11889
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11890 var _renderLabel = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11891
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11892 var _title = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11893 return _chart.keyAccessor()(d) + ': ' + _chart.valueAccessor()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11894 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11895 var _renderTitle = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11896
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11897 var _transitionDuration = 750;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11898
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11899 var _filterPrinter = dc.printers.filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11900
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11901 var _renderlets = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11902 var _mandatoryAttributes = ['dimension', 'group'];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11903
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11904 var _chartGroup = dc.constants.DEFAULT_CHART_GROUP;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11905
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11906 var _listeners = d3.dispatch(
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11907 'preRender',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11908 'postRender',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11909 'preRedraw',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11910 'postRedraw',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11911 'filtered',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11912 'zoomed');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11913
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11914 var _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11915
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11916 var _filters = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11917 var _filterHandler = function (dimension, filters) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11918 dimension.filter(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11919
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11920 if (filters.length === 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11921 dimension.filter(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11922 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11923 dimension.filterFunction(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11924 for (var i = 0; i < filters.length; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11925 var filter = filters[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11926 if (filter.isFiltered && filter.isFiltered(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11927 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11928 } else if (filter <= d && filter >= d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11929 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11930 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11931 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11932 return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11933 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11934 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11935 return filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11936 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11937
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11938 var _data = function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11939 return group.all();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11940 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11941
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11942 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11943 #### .width([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11944 Set or get the width attribute of a chart. See `.height` below for further description of the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11945 behavior.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11946
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11947 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11948 _chart.width = function (w) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11949 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11950 return _width(_root.node());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11951 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11952 _width = d3.functor(w || _defaultWidth);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11953 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11954 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11955
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11956 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11957 #### .height([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11958 Set or get the height attribute of a chart. The height is applied to the SVG element generated by
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11959 the chart when rendered (or rerendered). If a value is given, then it will be used to calculate
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11960 the new height and the chart returned for method chaining. The value can either be a numeric, a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11961 function, or falsy. If no value is specified then the value of the current height attribute will
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11962 be returned.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11963
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11964 By default, without an explicit height being given, the chart will select the width of its
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11965 anchor element. If that isn't possible it defaults to 200. Setting the value falsy will return
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11966 the chart to the default behavior
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11967
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11968 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11969
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11970 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11971 chart.height(250); // Set the chart's height to 250px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11972 chart.height(function(anchor) { return doSomethingWith(anchor); }); // set the chart's height with a function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11973 chart.height(null); // reset the height to the default auto calculation
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11974 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11975
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11976 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11977 _chart.height = function (h) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11978 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11979 return _height(_root.node());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11980 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11981 _height = d3.functor(h || _defaultHeight);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11982 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11983 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11984
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11985 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11986 #### .minWidth([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11987 Set or get the minimum width attribute of a chart. This only applicable if the width is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11988 calculated by dc.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11989
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11990 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11991 _chart.minWidth = function (w) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11992 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11993 return _minWidth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11994 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11995 _minWidth = w;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11996 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11997 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11998
89592faa2875 Uploaded
chrisb
parents:
diff changeset
11999 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12000 #### .minHeight([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12001 Set or get the minimum height attribute of a chart. This only applicable if the height is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12002 calculated by dc.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12003
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12004 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12005 _chart.minHeight = function (w) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12006 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12007 return _minHeight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12008 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12009 _minHeight = w;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12010 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12011 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12012
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12013 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12014 #### .dimension([value]) - **mandatory**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12015 Set or get the dimension attribute of a chart. In dc a dimension can be any valid [crossfilter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12016 dimension](https://github.com/square/crossfilter/wiki/API-Reference#wiki-dimension).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12017
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12018 If a value is given, then it will be used as the new dimension. If no value is specified then
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12019 the current dimension will be returned.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12020
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12021 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12022 _chart.dimension = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12023 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12024 return _dimension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12025 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12026 _dimension = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12027 _chart.expireCache();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12028 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12029 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12030
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12031 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12032 #### .data([callback])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12033 Set the data callback or retrieve the chart's data set. The data callback is passed the chart's
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12034 group and by default will return `group.all()`. This behavior may be modified to, for instance,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12035 return only the top 5 groups:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12036 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12037 chart.data(function(group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12038 return group.top(5);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12039 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12040 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12041 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12042 _chart.data = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12043 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12044 return _data.call(_chart, _group);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12045 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12046 _data = d3.functor(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12047 _chart.expireCache();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12048 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12049 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12050
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12051 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12052 #### .group([value, [name]]) - **mandatory**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12053 Set or get the group attribute of a chart. In dc a group is a [crossfilter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12054 group](https://github.com/square/crossfilter/wiki/API-Reference#wiki-group). Usually the group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12055 should be created from the particular dimension associated with the same chart. If a value is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12056 given, then it will be used as the new group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12057
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12058 If no value specified then the current group will be returned.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12059 If `name` is specified then it will be used to generate legend label.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12060
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12061 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12062 _chart.group = function (g, name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12063 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12064 return _group;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12065 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12066 _group = g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12067 _chart._groupName = name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12068 _chart.expireCache();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12069 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12070 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12071
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12072 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12073 #### .ordering([orderFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12074 Get or set an accessor to order ordinal charts
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12075 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12076 _chart.ordering = function (o) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12077 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12078 return _ordering;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12079 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12080 _ordering = o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12081 _orderSort = crossfilter.quicksort.by(_ordering);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12082 _chart.expireCache();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12083 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12084 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12085
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12086 _chart._computeOrderedGroups = function (data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12087 var dataCopy = data.slice(0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12088
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12089 if (dataCopy.length <= 1) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12090 return dataCopy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12091 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12092
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12093 if (!_orderSort) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12094 _orderSort = crossfilter.quicksort.by(_ordering);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12095 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12096
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12097 return _orderSort(dataCopy, 0, dataCopy.length);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12098 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12099
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12100 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12101 #### .filterAll()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12102 Clear all filters associated with this chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12103
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12104 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12105 _chart.filterAll = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12106 return _chart.filter(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12107 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12108
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12109 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12110 #### .select(selector)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12111 Execute d3 single selection in the chart's scope using the given selector and return the d3
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12112 selection. Roughly the same as:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12113 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12114 d3.select('#chart-id').select(selector);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12115 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12116 This function is **not chainable** since it does not return a chart instance; however the d3
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12117 selection result can be chained to d3 function calls.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12118
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12119 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12120 _chart.select = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12121 return _root.select(s);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12122 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12123
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12124 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12125 #### .selectAll(selector)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12126 Execute in scope d3 selectAll using the given selector and return d3 selection result. Roughly
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12127 the same as:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12128 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12129 d3.select('#chart-id').selectAll(selector);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12130 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12131 This function is **not chainable** since it does not return a chart instance; however the d3
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12132 selection result can be chained to d3 function calls.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12133
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12134 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12135 _chart.selectAll = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12136 return _root ? _root.selectAll(s) : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12137 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12138
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12139 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12140 #### .anchor([anchorChart|anchorSelector|anchorNode], [chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12141 Set the svg root to either be an existing chart's root; or any valid [d3 single
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12142 selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying a dom
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12143 block element such as a div; or a dom element or d3 selection. Optionally registers the chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12144 within the chartGroup. This class is called internally on chart initialization, but be called
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12145 again to relocate the chart. However, it will orphan any previously created SVG elements.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12146 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12147 _chart.anchor = function (a, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12148 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12149 return _anchor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12150 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12151 if (dc.instanceOfChart(a)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12152 _anchor = a.anchor();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12153 _root = a.root();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12154 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12155 _anchor = a;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12156 _root = d3.select(_anchor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12157 _root.classed(dc.constants.CHART_CLASS, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12158 dc.registerChart(_chart, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12159 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12160 _chartGroup = chartGroup;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12161 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12162 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12163
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12164 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12165 #### .anchorName()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12166 Returns the dom id for the chart's anchored location.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12167
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12168 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12169 _chart.anchorName = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12170 var a = _chart.anchor();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12171 if (a && a.id) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12172 return a.id;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12173 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12174 if (a && a.replace) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12175 return a.replace('#', '');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12176 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12177 return '' + _chart.chartID();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12178 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12179
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12180 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12181 #### .root([rootElement])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12182 Returns the root element where a chart resides. Usually it will be the parent div element where
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12183 the svg was created. You can also pass in a new root element however this is usually handled by
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12184 dc internally. Resetting the root element on a chart outside of dc internals may have
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12185 unexpected consequences.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12186
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12187 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12188 _chart.root = function (r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12189 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12190 return _root;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12191 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12192 _root = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12193 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12194 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12195
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12196 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12197 #### .svg([svgElement])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12198 Returns the top svg element for this specific chart. You can also pass in a new svg element,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12199 however this is usually handled by dc internally. Resetting the svg element on a chart outside
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12200 of dc internals may have unexpected consequences.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12201
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12202 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12203 _chart.svg = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12204 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12205 return _svg;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12206 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12207 _svg = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12208 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12209 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12210
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12211 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12212 #### .resetSvg()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12213 Remove the chart's SVG elements from the dom and recreate the container SVG element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12214 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12215 _chart.resetSvg = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12216 _chart.select('svg').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12217 return generateSvg();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12218 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12219
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12220 function generateSvg() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12221 _svg = _chart.root().append('svg')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12222 .attr('width', _chart.width())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12223 .attr('height', _chart.height());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12224 return _svg;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12225 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12226
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12227 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12228 #### .filterPrinter([filterPrinterFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12229 Set or get the filter printer function. The filter printer function is used to generate human
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12230 friendly text for filter value(s) associated with the chart instance. By default dc charts use a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12231 default filter printer `dc.printers.filter` that provides simple printing support for both
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12232 single value and ranged filters.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12233
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12234 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12235 _chart.filterPrinter = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12236 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12237 return _filterPrinter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12238 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12239 _filterPrinter = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12240 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12241 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12242
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12243 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12244 #### .turnOnControls() & .turnOffControls()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12245 Turn on/off optional control elements within the root element. dc currently supports the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12246 following html control elements.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12247
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12248 * root.selectAll('.reset') - elements are turned on if the chart has an active filter. This type
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12249 of control element is usually used to store a reset link to allow user to reset filter on a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12250 certain chart. This element will be turned off automatically if the filter is cleared.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12251 * root.selectAll('.filter') elements are turned on if the chart has an active filter. The text
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12252 content of this element is then replaced with the current filter value using the filter printer
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12253 function. This type of element will be turned off automatically if the filter is cleared.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12254
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12255 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12256 _chart.turnOnControls = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12257 if (_root) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12258 _chart.selectAll('.reset').style('display', null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12259 _chart.selectAll('.filter').text(_filterPrinter(_chart.filters())).style('display', null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12260 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12261 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12262 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12263
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12264 _chart.turnOffControls = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12265 if (_root) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12266 _chart.selectAll('.reset').style('display', 'none');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12267 _chart.selectAll('.filter').style('display', 'none').text(_chart.filter());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12268 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12269 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12270 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12271
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12272 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12273 #### .transitionDuration([duration])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12274 Set or get the animation transition duration(in milliseconds) for this chart instance. Default
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12275 duration is 750ms.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12276
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12277 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12278 _chart.transitionDuration = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12279 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12280 return _transitionDuration;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12281 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12282 _transitionDuration = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12283 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12284 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12285
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12286 _chart._mandatoryAttributes = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12287 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12288 return _mandatoryAttributes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12289 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12290 _mandatoryAttributes = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12291 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12292 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12293
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12294 function checkForMandatoryAttributes(a) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12295 if (!_chart[a] || !_chart[a]()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12296 throw new dc.errors.InvalidStateException('Mandatory attribute chart.' + a +
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12297 ' is missing on chart[#' + _chart.anchorName() + ']');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12298 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12299 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12300
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12301 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12302 #### .render()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12303 Invoking this method will force the chart to re-render everything from scratch. Generally it
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12304 should only be used to render the chart for the first time on the page or if you want to make
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12305 sure everything is redrawn from scratch instead of relying on the default incremental redrawing
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12306 behaviour.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12307
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12308 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12309 _chart.render = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12310 _listeners.preRender(_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12311
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12312 if (_mandatoryAttributes) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12313 _mandatoryAttributes.forEach(checkForMandatoryAttributes);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12314 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12315
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12316 var result = _chart._doRender();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12317
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12318 if (_legend) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12319 _legend.render();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12320 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12321
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12322 _chart._activateRenderlets('postRender');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12323
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12324 return result;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12325 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12326
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12327 _chart._activateRenderlets = function (event) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12328 if (_chart.transitionDuration() > 0 && _svg) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12329 _svg.transition().duration(_chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12330 .each('end', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12331 runAllRenderlets();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12332 if (event) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12333 _listeners[event](_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12334 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12335 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12336 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12337 runAllRenderlets();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12338 if (event) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12339 _listeners[event](_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12340 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12341 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12342 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12343
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12344 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12345 #### .redraw()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12346 Calling redraw will cause the chart to re-render data changes incrementally. If there is no
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12347 change in the underlying data dimension then calling this method will have no effect on the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12348 chart. Most chart interaction in dc will automatically trigger this method through internal
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12349 events (in particular [dc.redrawAll](#dcredrawallchartgroup)); therefore, you only need to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12350 manually invoke this function if data is manipulated outside of dc's control (for example if
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12351 data is loaded in the background using `crossfilter.add()`).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12352
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12353 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12354 _chart.redraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12355 _listeners.preRedraw(_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12356
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12357 var result = _chart._doRedraw();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12358
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12359 if (_legend) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12360 _legend.render();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12361 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12362
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12363 _chart._activateRenderlets('postRedraw');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12364
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12365 return result;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12366 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12367
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12368 _chart.redrawGroup = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12369 dc.redrawAll(_chart.chartGroup());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12370 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12371
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12372 _chart.renderGroup = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12373 dc.renderAll(_chart.chartGroup());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12374 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12375
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12376 _chart._invokeFilteredListener = function (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12377 if (f !== undefined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12378 _listeners.filtered(_chart, f);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12379 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12380 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12381
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12382 _chart._invokeZoomedListener = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12383 _listeners.zoomed(_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12384 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12385
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12386 var _hasFilterHandler = function (filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12387 if (filter === null || typeof(filter) === 'undefined') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12388 return filters.length > 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12389 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12390 return filters.some(function (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12391 return filter <= f && filter >= f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12392 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12393 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12394
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12395 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12396 #### .hasFilterHandler([function])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12397 Set or get the has filter handler. The has filter handler is a function that checks to see if
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12398 the chart's current filters include a specific filter. Using a custom has filter handler allows
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12399 you to change the way filters are checked for and replaced.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12400
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12401 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12402 // default has filter handler
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12403 function (filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12404 if (filter === null || typeof(filter) === 'undefined') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12405 return filters.length > 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12406 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12407 return filters.some(function (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12408 return filter <= f && filter >= f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12409 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12410 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12411
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12412 // custom filter handler (no-op)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12413 chart.hasFilterHandler(function(filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12414 return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12415 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12416 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12417 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12418 _chart.hasFilterHandler = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12419 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12420 return _hasFilterHandler;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12421 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12422 _hasFilterHandler = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12423 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12424 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12425
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12426 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12427 #### .hasFilter([filter])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12428 Check whether any active filter or a specific filter is associated with particular chart instance.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12429 This function is **not chainable**.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12430
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12431 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12432 _chart.hasFilter = function (filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12433 return _hasFilterHandler(_filters, filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12434 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12435
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12436 var _removeFilterHandler = function (filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12437 for (var i = 0; i < filters.length; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12438 if (filters[i] <= filter && filters[i] >= filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12439 filters.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12440 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12441 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12442 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12443 return filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12444 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12445
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12446 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12447 #### .removeFilterHandler([function])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12448 Set or get the remove filter handler. The remove filter handler is a function that removes a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12449 filter from the chart's current filters. Using a custom remove filter handler allows you to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12450 change how filters are removed or perform additional work when removing a filter, e.g. when
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12451 using a filter server other than crossfilter.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12452
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12453 Any changes should modify the `filters` array argument and return that array.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12454
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12455 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12456 // default remove filter handler
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12457 function (filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12458 for (var i = 0; i < filters.length; i++) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12459 if (filters[i] <= filter && filters[i] >= filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12460 filters.splice(i, 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12461 break;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12462 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12463 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12464 return filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12465 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12466
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12467 // custom filter handler (no-op)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12468 chart.removeFilterHandler(function(filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12469 return filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12470 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12471 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12472 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12473 _chart.removeFilterHandler = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12474 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12475 return _removeFilterHandler;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12476 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12477 _removeFilterHandler = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12478 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12479 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12480
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12481 var _addFilterHandler = function (filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12482 filters.push(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12483 return filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12484 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12485
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12486 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12487 #### .addFilterHandler([function])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12488 Set or get the add filter handler. The add filter handler is a function that adds a filter to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12489 the chart's filter list. Using a custom add filter handler allows you to change the way filters
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12490 are added or perform additional work when adding a filter, e.g. when using a filter server other
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12491 than crossfilter.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12492
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12493 Any changes should modify the `filters` array argument and return that array.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12494
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12495 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12496 // default add filter handler
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12497 function (filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12498 filters.push(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12499 return filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12500 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12501
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12502 // custom filter handler (no-op)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12503 chart.addFilterHandler(function(filters, filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12504 return filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12505 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12506 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12507 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12508 _chart.addFilterHandler = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12509 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12510 return _addFilterHandler;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12511 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12512 _addFilterHandler = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12513 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12514 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12515
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12516 var _resetFilterHandler = function (filters) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12517 return [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12518 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12519
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12520 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12521 #### .resetFilterHandler([function])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12522 Set or get the reset filter handler. The reset filter handler is a function that resets the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12523 chart's filter list by returning a new list. Using a custom reset filter handler allows you to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12524 change the way filters are reset, or perform additional work when resetting the filters,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12525 e.g. when using a filter server other than crossfilter.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12526
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12527 This function should return an array.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12528
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12529 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12530 // default remove filter handler
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12531 function (filters) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12532 return [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12533 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12534
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12535 // custom filter handler (no-op)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12536 chart.resetFilterHandler(function(filters) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12537 return filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12538 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12539 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12540 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12541 _chart.resetFilterHandler = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12542 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12543 return _resetFilterHandler;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12544 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12545 _resetFilterHandler = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12546 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12547 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12548
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12549 function applyFilters() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12550 if (_chart.dimension() && _chart.dimension().filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12551 var fs = _filterHandler(_chart.dimension(), _filters);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12552 _filters = fs ? fs : _filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12553 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12554 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12555
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12556 _chart.replaceFilter = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12557 _filters = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12558 _chart.filter(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12559 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12560
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12561 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12562 #### .filter([filterValue])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12563 Filter the chart by the given value or return the current filter if the input parameter is missing.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12564 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12565 // filter by a single string
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12566 chart.filter('Sunday');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12567 // filter by a single age
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12568 chart.filter(18);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12569 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12570 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12571 _chart.filter = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12572 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12573 return _filters.length > 0 ? _filters[0] : null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12574 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12575 if (_ instanceof Array && _[0] instanceof Array && !_.isFiltered) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12576 _[0].forEach(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12577 if (_chart.hasFilter(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12578 _removeFilterHandler(_filters, d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12579 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12580 _addFilterHandler(_filters, d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12581 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12582 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12583 } else if (_ === null) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12584 _filters = _resetFilterHandler(_filters);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12585 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12586 if (_chart.hasFilter(_)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12587 _removeFilterHandler(_filters, _);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12588 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12589 _addFilterHandler(_filters, _);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12590 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12591 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12592 applyFilters();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12593 _chart._invokeFilteredListener(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12594
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12595 if (_root !== null && _chart.hasFilter()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12596 _chart.turnOnControls();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12597 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12598 _chart.turnOffControls();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12599 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12600
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12601 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12602 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12603
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12604 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12605 #### .filters()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12606 Returns all current filters. This method does not perform defensive cloning of the internal
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12607 filter array before returning, therefore any modification of the returned array will effect the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12608 chart's internal filter storage.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12609
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12610 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12611 _chart.filters = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12612 return _filters;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12613 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12614
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12615 _chart.highlightSelected = function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12616 d3.select(e).classed(dc.constants.SELECTED_CLASS, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12617 d3.select(e).classed(dc.constants.DESELECTED_CLASS, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12618 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12619
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12620 _chart.fadeDeselected = function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12621 d3.select(e).classed(dc.constants.SELECTED_CLASS, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12622 d3.select(e).classed(dc.constants.DESELECTED_CLASS, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12623 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12624
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12625 _chart.resetHighlight = function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12626 d3.select(e).classed(dc.constants.SELECTED_CLASS, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12627 d3.select(e).classed(dc.constants.DESELECTED_CLASS, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12628 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12629
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12630 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12631 #### .onClick(datum)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12632 This function is passed to d3 as the onClick handler for each chart. The default behavior is to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12633 filter on the clicked datum (passed to the callback) and redraw the chart group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12634 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12635 _chart.onClick = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12636 var filter = _chart.keyAccessor()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12637 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12638 _chart.filter(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12639 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12640 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12641 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12642
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12643 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12644 #### .filterHandler([function])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12645 Set or get the filter handler. The filter handler is a function that performs the filter action
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12646 on a specific dimension. Using a custom filter handler allows you to perform additional logic
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12647 before or after filtering.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12648
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12649 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12650 // default filter handler
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12651 function(dimension, filter){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12652 dimension.filter(filter); // perform filtering
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12653 return filter; // return the actual filter value
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12654 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12655
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12656 // custom filter handler
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12657 chart.filterHandler(function(dimension, filter){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12658 var newFilter = filter + 10;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12659 dimension.filter(newFilter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12660 return newFilter; // set the actual filter value to the new value
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12661 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12662 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12663
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12664 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12665 _chart.filterHandler = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12666 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12667 return _filterHandler;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12668 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12669 _filterHandler = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12670 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12671 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12672
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12673 // abstract function stub
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12674 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12675 // do nothing in base, should be overridden by sub-function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12676 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12677 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12678
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12679 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12680 // do nothing in base, should be overridden by sub-function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12681 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12682 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12683
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12684 _chart.legendables = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12685 // do nothing in base, should be overridden by sub-function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12686 return [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12687 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12688
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12689 _chart.legendHighlight = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12690 // do nothing in base, should be overridden by sub-function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12691 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12692
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12693 _chart.legendReset = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12694 // do nothing in base, should be overridden by sub-function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12695 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12696
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12697 _chart.legendToggle = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12698 // do nothing in base, should be overriden by sub-function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12699 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12700
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12701 _chart.isLegendableHidden = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12702 // do nothing in base, should be overridden by sub-function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12703 return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12704 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12705
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12706 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12707 #### .keyAccessor([keyAccessorFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12708 Set or get the key accessor function. The key accessor function is used to retrieve the key
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12709 value from the crossfilter group. Key values are used differently in different charts, for
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12710 example keys correspond to slices in a pie chart and x axis positions in a grid coordinate chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12711 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12712 // default key accessor
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12713 chart.keyAccessor(function(d) { return d.key; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12714 // custom key accessor for a multi-value crossfilter reduction
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12715 chart.keyAccessor(function(p) { return p.value.absGain; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12716 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12717
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12718 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12719 _chart.keyAccessor = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12720 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12721 return _keyAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12722 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12723 _keyAccessor = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12724 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12725 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12726
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12727 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12728 #### .valueAccessor([valueAccessorFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12729 Set or get the value accessor function. The value accessor function is used to retrieve the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12730 value from the crossfilter group. Group values are used differently in different charts, for
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12731 example values correspond to slice sizes in a pie chart and y axis positions in a grid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12732 coordinate chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12733 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12734 // default value accessor
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12735 chart.valueAccessor(function(d) { return d.value; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12736 // custom value accessor for a multi-value crossfilter reduction
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12737 chart.valueAccessor(function(p) { return p.value.percentageGain; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12738 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12739
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12740 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12741 _chart.valueAccessor = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12742 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12743 return _valueAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12744 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12745 _valueAccessor = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12746 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12747 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12748
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12749 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12750 #### .label([labelFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12751 Set or get the label function. The chart class will use this function to render labels for each
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12752 child element in the chart, e.g. slices in a pie chart or bubbles in a bubble chart. Not every
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12753 chart supports the label function for example bar chart and line chart do not use this function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12754 at all.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12755 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12756 // default label function just return the key
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12757 chart.label(function(d) { return d.key; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12758 // label function has access to the standard d3 data binding and can get quite complicated
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12759 chart.label(function(d) { return d.data.key + '(' + Math.floor(d.data.value / all.value() * 100) + '%)'; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12760 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12761
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12762 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12763 _chart.label = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12764 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12765 return _label;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12766 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12767 _label = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12768 _renderLabel = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12769 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12770 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12771
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12772 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12773 #### .renderLabel(boolean)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12774 Turn on/off label rendering
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12775
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12776 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12777 _chart.renderLabel = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12778 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12779 return _renderLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12780 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12781 _renderLabel = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12782 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12783 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12784
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12785 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12786 #### .title([titleFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12787 Set or get the title function. The chart class will use this function to render the svg title
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12788 (usually interpreted by browser as tooltips) for each child element in the chart, e.g. a slice
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12789 in a pie chart or a bubble in a bubble chart. Almost every chart supports the title function;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12790 however in grid coordinate charts you need to turn off the brush in order to see titles, because
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12791 otherwise the brush layer will block tooltip triggering.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12792 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12793 // default title function just return the key
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12794 chart.title(function(d) { return d.key + ': ' + d.value; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12795 // title function has access to the standard d3 data binding and can get quite complicated
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12796 chart.title(function(p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12797 return p.key.getFullYear()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12798 + '\n'
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12799 + 'Index Gain: ' + numberFormat(p.value.absGain) + '\n'
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12800 + 'Index Gain in Percentage: ' + numberFormat(p.value.percentageGain) + '%\n'
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12801 + 'Fluctuation / Index Ratio: ' + numberFormat(p.value.fluctuationPercentage) + '%';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12802 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12803 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12804
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12805 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12806 _chart.title = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12807 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12808 return _title;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12809 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12810 _title = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12811 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12812 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12813
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12814 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12815 #### .renderTitle(boolean)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12816 Turn on/off title rendering, or return the state of the render title flag if no arguments are
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12817 given.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12818
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12819 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12820 _chart.renderTitle = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12821 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12822 return _renderTitle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12823 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12824 _renderTitle = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12825 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12826 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12827
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12828 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12829 #### .renderlet(renderletFunction)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12830 A renderlet is similar to an event listener on rendering event. Multiple renderlets can be added
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12831 to an individual chart. Each time a chart is rerendered or redrawn the renderlets are invoked
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12832 right after the chart finishes its own drawing routine, giving you a way to modify the svg
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12833 elements. Renderlet functions take the chart instance as the only input parameter and you can
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12834 use the dc API or use raw d3 to achieve pretty much any effect.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12835 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12836 // renderlet function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12837 chart.renderlet(function(chart){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12838 // mix of dc API and d3 manipulation
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12839 chart.select('g.y').style('display', 'none');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12840 // its a closure so you can also access other chart variable available in the closure scope
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12841 moveChart.filter(chart.filter());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12842 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12843 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12844
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12845 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12846 _chart.renderlet = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12847 _renderlets.push(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12848 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12849 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12850
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12851 function runAllRenderlets() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12852 for (var i = 0; i < _renderlets.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12853 _renderlets[i](_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12854 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12855 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12856
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12857 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12858 #### .chartGroup([group])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12859 Get or set the chart group to which this chart belongs. Chart groups are rendered or redrawn
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12860 together since it is expected they share the same underlying crossfilter data set.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12861 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12862 _chart.chartGroup = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12863 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12864 return _chartGroup;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12865 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12866 _chartGroup = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12867 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12868 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12869
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12870 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12871 #### .expireCache()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12872 Expire the internal chart cache. dc charts cache some data internally on a per chart basis to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12873 speed up rendering and avoid unnecessary calculation; however it might be useful to clear the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12874 cache if you have changed state which will affect rendering. For example if you invoke the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12875 `crossfilter.add` function or reset group or dimension after rendering it is a good idea to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12876 clear the cache to make sure charts are rendered properly.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12877
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12878 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12879 _chart.expireCache = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12880 // do nothing in base, should be overridden by sub-function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12881 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12882 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12883
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12884 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12885 #### .legend([dc.legend])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12886 Attach a dc.legend widget to this chart. The legend widget will automatically draw legend labels
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12887 based on the color setting and names associated with each group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12888
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12889 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12890 chart.legend(dc.legend().x(400).y(10).itemHeight(13).gap(5))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12891 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12892
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12893 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12894 _chart.legend = function (l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12895 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12896 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12897 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12898 _legend = l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12899 _legend.parent(_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12900 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12901 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12902
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12903 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12904 #### .chartID()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12905 Returns the internal numeric ID of the chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12906 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12907 _chart.chartID = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12908 return _chart.__dcFlag__;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12909 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12910
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12911 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12912 #### .options(optionsObject)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12913 Set chart options using a configuration object. Each key in the object will cause the method of
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12914 the same name to be called with the value to set that attribute for the chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12915
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12916 Example:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12917 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12918 chart.options({dimension: myDimension, group: myGroup});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12919 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12920 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12921 _chart.options = function (opts) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12922 for (var o in opts) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12923 if (typeof(_chart[o]) === 'function') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12924 _chart[o].call(_chart, opts[o]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12925 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12926 dc.logger.debug('Not a valid option setter name: ' + o);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12927 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12928 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12929 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12930 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12931
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12932 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12933 ## Listeners
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12934 All dc chart instance supports the following listeners.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12935
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12936 #### .on('preRender', function(chart){...})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12937 This listener function will be invoked before chart rendering.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12938
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12939 #### .on('postRender', function(chart){...})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12940 This listener function will be invoked after chart finish rendering including all renderlets' logic.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12941
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12942 #### .on('preRedraw', function(chart){...})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12943 This listener function will be invoked before chart redrawing.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12944
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12945 #### .on('postRedraw', function(chart){...})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12946 This listener function will be invoked after chart finish redrawing including all renderlets' logic.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12947
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12948 #### .on('filtered', function(chart, filter){...})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12949 This listener function will be invoked after a filter is applied, added or removed.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12950
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12951 #### .on('zoomed', function(chart, filter){...})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12952 This listener function will be invoked after a zoom is triggered.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12953
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12954 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12955 _chart.on = function (event, listener) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12956 _listeners.on(event, listener);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12957 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12958 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12959
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12960 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12961 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12962
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12963 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12964 ## Margin Mixin
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12965 Margin is a mixin that provides margin utility functions for both the Row Chart and Coordinate Grid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12966 Charts.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12967
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12968 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12969 dc.marginMixin = function (_chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12970 var _margin = {top: 10, right: 50, bottom: 30, left: 30};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12971
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12972 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12973 #### .margins([margins])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12974 Get or set the margins for a particular coordinate grid chart instance. The margins is stored as
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12975 an associative Javascript array. Default margins: {top: 10, right: 50, bottom: 30, left: 30}.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12976
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12977 The margins can be accessed directly from the getter.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12978 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12979 var leftMargin = chart.margins().left; // 30 by default
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12980 chart.margins().left = 50;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12981 leftMargin = chart.margins().left; // now 50
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12982 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12983
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12984 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12985 _chart.margins = function (m) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12986 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12987 return _margin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12988 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12989 _margin = m;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12990 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12991 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12992
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12993 _chart.effectiveWidth = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12994 return _chart.width() - _chart.margins().left - _chart.margins().right;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12995 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12996
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12997 _chart.effectiveHeight = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12998 return _chart.height() - _chart.margins().top - _chart.margins().bottom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
12999 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13000
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13001 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13002 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13003
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13004 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13005 ## Color Mixin
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13006 The Color Mixin is an abstract chart functional class providing universal coloring support
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13007 as a mix-in for any concrete chart implementation.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13008
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13009 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13010
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13011 dc.colorMixin = function (_chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13012 var _colors = d3.scale.category20c();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13013 var _defaultAccessor = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13014
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13015 var _colorAccessor = function (d) { return _chart.keyAccessor()(d); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13016
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13017 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13018 #### .colors([colorScale])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13019 Retrieve current color scale or set a new color scale. This methods accepts any function that
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13020 operates like a d3 scale. If not set the default is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13021 `d3.scale.category20c()`.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13022 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13023 // alternate categorical scale
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13024 chart.colors(d3.scale.category20b());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13025
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13026 // ordinal scale
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13027 chart.colors(d3.scale.ordinal().range(['red','green','blue']));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13028 // convenience method, the same as above
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13029 chart.ordinalColors(['red','green','blue']);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13030
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13031 // set a linear scale
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13032 chart.linearColors(["#4575b4", "#ffffbf", "#a50026"]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13033 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13034 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13035 _chart.colors = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13036 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13037 return _colors;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13038 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13039 if (_ instanceof Array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13040 _colors = d3.scale.quantize().range(_); // deprecated legacy support, note: this fails for ordinal domains
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13041 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13042 _colors = d3.functor(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13043 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13044 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13045 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13046
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13047 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13048 #### .ordinalColors(r)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13049 Convenience method to set the color scale to d3.scale.ordinal with range `r`.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13050
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13051 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13052 _chart.ordinalColors = function (r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13053 return _chart.colors(d3.scale.ordinal().range(r));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13054 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13055
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13056 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13057 #### .linearColors(r)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13058 Convenience method to set the color scale to an Hcl interpolated linear scale with range `r`.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13059
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13060 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13061 _chart.linearColors = function (r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13062 return _chart.colors(d3.scale.linear()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13063 .range(r)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13064 .interpolate(d3.interpolateHcl));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13065 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13066
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13067 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13068 #### .colorAccessor([colorAccessorFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13069 Set or the get color accessor function. This function will be used to map a data point in a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13070 crossfilter group to a color value on the color scale. The default function uses the key
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13071 accessor.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13072 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13073 // default index based color accessor
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13074 .colorAccessor(function (d, i){return i;})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13075 // color accessor for a multi-value crossfilter reduction
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13076 .colorAccessor(function (d){return d.value.absGain;})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13077 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13078 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13079 _chart.colorAccessor = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13080 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13081 return _colorAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13082 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13083 _colorAccessor = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13084 _defaultAccessor = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13085 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13086 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13087
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13088 // what is this?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13089 _chart.defaultColorAccessor = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13090 return _defaultAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13091 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13092
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13093 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13094 #### .colorDomain([domain])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13095 Set or get the current domain for the color mapping function. The domain must be supplied as an
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13096 array.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13097
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13098 Note: previously this method accepted a callback function. Instead you may use a custom scale
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13099 set by `.colors`.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13100
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13101 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13102 _chart.colorDomain = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13103 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13104 return _colors.domain();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13105 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13106 _colors.domain(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13107 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13108 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13109
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13110 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13111 #### .calculateColorDomain()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13112 Set the domain by determining the min and max values as retrieved by `.colorAccessor` over the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13113 chart's dataset.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13114
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13115 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13116 _chart.calculateColorDomain = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13117 var newDomain = [d3.min(_chart.data(), _chart.colorAccessor()),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13118 d3.max(_chart.data(), _chart.colorAccessor())];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13119 _colors.domain(newDomain);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13120 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13121
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13122 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13123 #### .getColor(d [, i])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13124 Get the color for the datum d and counter i. This is used internally by charts to retrieve a color.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13125
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13126 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13127 _chart.getColor = function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13128 return _colors(_colorAccessor.call(this, d, i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13129 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13130
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13131 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13132 #### .colorCalculator([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13133 Gets or sets chart.getColor.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13134 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13135 _chart.colorCalculator = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13136 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13137 return _chart.getColor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13138 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13139 _chart.getColor = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13140 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13141 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13142
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13143 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13144 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13145
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13146 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13147 ## Coordinate Grid Mixin
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13148 Includes: [Color Mixin](#color-mixin), [Margin Mixin](#margin-mixin), [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13149
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13150 Coordinate Grid is an abstract base chart designed to support a number of coordinate grid based
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13151 concrete chart types, e.g. bar chart, line chart, and bubble chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13152
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13153 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13154 dc.coordinateGridMixin = function (_chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13155 var GRID_LINE_CLASS = 'grid-line';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13156 var HORIZONTAL_CLASS = 'horizontal';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13157 var VERTICAL_CLASS = 'vertical';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13158 var Y_AXIS_LABEL_CLASS = 'y-axis-label';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13159 var X_AXIS_LABEL_CLASS = 'x-axis-label';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13160 var DEFAULT_AXIS_LABEL_PADDING = 12;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13161
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13162 _chart = dc.colorMixin(dc.marginMixin(dc.baseMixin(_chart)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13163
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13164 _chart.colors(d3.scale.category10());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13165 _chart._mandatoryAttributes().push('x');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13166
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13167 function zoomHandler () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13168 _refocused = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13169 if (_zoomOutRestrict) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13170 _chart.x().domain(constrainRange(_chart.x().domain(), _xOriginalDomain));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13171 if (_rangeChart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13172 _chart.x().domain(constrainRange(_chart.x().domain(), _rangeChart.x().domain()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13173 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13174 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13175
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13176 var domain = _chart.x().domain();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13177 var domFilter = dc.filters.RangedFilter(domain[0], domain[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13178
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13179 _chart.replaceFilter(domFilter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13180 _chart.rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13181 _chart.redraw();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13182
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13183 if (_rangeChart && !rangesEqual(_chart.filter(), _rangeChart.filter())) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13184 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13185 _rangeChart.replaceFilter(domFilter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13186 _rangeChart.redraw();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13187 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13188 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13189
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13190 _chart._invokeZoomedListener();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13191
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13192 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13193 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13194 }, dc.constants.EVENT_DELAY);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13195
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13196 _refocused = !rangesEqual(domain, _xOriginalDomain);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13197 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13198
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13199 var _parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13200 var _g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13201 var _chartBodyG;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13202
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13203 var _x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13204 var _xOriginalDomain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13205 var _xAxis = d3.svg.axis().orient('bottom');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13206 var _xUnits = dc.units.integers;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13207 var _xAxisPadding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13208 var _xElasticity = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13209 var _xAxisLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13210 var _xAxisLabelPadding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13211 var _lastXDomain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13212
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13213 var _y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13214 var _yAxis = d3.svg.axis().orient('left');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13215 var _yAxisPadding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13216 var _yElasticity = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13217 var _yAxisLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13218 var _yAxisLabelPadding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13219
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13220 var _brush = d3.svg.brush();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13221 var _brushOn = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13222 var _round;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13223
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13224 var _renderHorizontalGridLine = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13225 var _renderVerticalGridLine = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13226
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13227 var _refocused = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13228 var _unitCount;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13229
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13230 var _zoomScale = [1, Infinity];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13231 var _zoomOutRestrict = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13232
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13233 var _zoom = d3.behavior.zoom().on('zoom', zoomHandler);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13234 var _nullZoom = d3.behavior.zoom().on('zoom', null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13235 var _hasBeenMouseZoomable = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13236
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13237 var _rangeChart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13238 var _focusChart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13239
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13240 var _mouseZoomable = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13241 var _clipPadding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13242
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13243 var _outerRangeBandPadding = 0.5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13244 var _rangeBandPadding = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13245
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13246 var _useRightYAxis = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13247
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13248 _chart.rescale = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13249 _unitCount = undefined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13250 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13251
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13252 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13253 #### .rangeChart([chart])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13254 Get or set the range selection chart associated with this instance. Setting the range selection
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13255 chart using this function will automatically update its selection brush when the current chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13256 zooms in. In return the given range chart will also automatically attach this chart as its focus
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13257 chart hence zoom in when range brush updates. See the [Nasdaq 100
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13258 Index](http://dc-js.github.com/dc.js/) example for this effect in action.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13259
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13260 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13261 _chart.rangeChart = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13262 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13263 return _rangeChart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13264 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13265 _rangeChart = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13266 _rangeChart.focusChart(_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13267 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13268 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13269
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13270 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13271 #### .zoomScale([extent])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13272 Get or set the scale extent for mouse zooms.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13273
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13274 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13275 _chart.zoomScale = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13276 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13277 return _zoomScale;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13278 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13279 _zoomScale = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13280 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13281 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13282
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13283 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13284 #### .zoomOutRestrict([true/false])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13285 Get or set the zoom restriction for the chart. If true limits the zoom to origional domain of the chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13286 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13287 _chart.zoomOutRestrict = function (r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13288 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13289 return _zoomOutRestrict;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13290 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13291 _zoomScale[0] = r ? 1 : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13292 _zoomOutRestrict = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13293 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13294 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13295
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13296 _chart._generateG = function (parent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13297 if (parent === undefined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13298 _parent = _chart.svg();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13299 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13300 _parent = parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13301 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13302
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13303 _g = _parent.append('g');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13304
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13305 _chartBodyG = _g.append('g').attr('class', 'chart-body')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13306 .attr('transform', 'translate(' + _chart.margins().left + ', ' + _chart.margins().top + ')')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13307 .attr('clip-path', 'url(#' + getClipPathId() + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13308
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13309 return _g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13310 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13311
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13312 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13313 #### .g([gElement])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13314 Get or set the root g element. This method is usually used to retrieve the g element in order to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13315 overlay custom svg drawing programatically. **Caution**: The root g element is usually generated
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13316 by dc.js internals, and resetting it might produce unpredictable result.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13317
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13318 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13319 _chart.g = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13320 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13321 return _g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13322 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13323 _g = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13324 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13325 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13326
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13327 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13328 #### .mouseZoomable([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13329 Set or get mouse zoom capability flag (default: false). When turned on the chart will be
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13330 zoomable using the mouse wheel. If the range selector chart is attached zooming will also update
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13331 the range selection brush on the associated range selector chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13332
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13333 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13334 _chart.mouseZoomable = function (z) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13335 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13336 return _mouseZoomable;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13337 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13338 _mouseZoomable = z;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13339 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13340 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13341
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13342 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13343 #### .chartBodyG()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13344 Retrieve the svg group for the chart body.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13345 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13346 _chart.chartBodyG = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13347 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13348 return _chartBodyG;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13349 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13350 _chartBodyG = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13351 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13352 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13353
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13354 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13355 #### .x([xScale]) - **mandatory**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13356 Get or set the x scale. The x scale can be any d3
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13357 [quantitive scale](https://github.com/mbostock/d3/wiki/Quantitative-Scales) or
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13358 [ordinal scale](https://github.com/mbostock/d3/wiki/Ordinal-Scales).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13359 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13360 // set x to a linear scale
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13361 chart.x(d3.scale.linear().domain([-2500, 2500]))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13362 // set x to a time scale to generate histogram
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13363 chart.x(d3.time.scale().domain([new Date(1985, 0, 1), new Date(2012, 11, 31)]))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13364 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13365
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13366 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13367 _chart.x = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13368 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13369 return _x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13370 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13371 _x = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13372 _xOriginalDomain = _x.domain();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13373 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13374 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13375
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13376 _chart.xOriginalDomain = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13377 return _xOriginalDomain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13378 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13379
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13380 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13381 #### .xUnits([xUnits function])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13382 Set or get the xUnits function. The coordinate grid chart uses the xUnits function to calculate
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13383 the number of data projections on x axis such as the number of bars for a bar chart or the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13384 number of dots for a line chart. This function is expected to return a Javascript array of all
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13385 data points on x axis, or the number of points on the axis. [d3 time range functions
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13386 d3.time.days, d3.time.months, and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13387 d3.time.years](https://github.com/mbostock/d3/wiki/Time-Intervals#aliases) are all valid xUnits
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13388 function. dc.js also provides a few units function, see the [Utilities](#utilities) section for
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13389 a list of built-in units functions. The default xUnits function is dc.units.integers.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13390 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13391 // set x units to count days
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13392 chart.xUnits(d3.time.days);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13393 // set x units to count months
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13394 chart.xUnits(d3.time.months);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13395 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13396 A custom xUnits function can be used as long as it follows the following interface:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13397 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13398 // units in integer
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13399 function(start, end, xDomain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13400 // simply calculates how many integers in the domain
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13401 return Math.abs(end - start);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13402 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13403
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13404 // fixed units
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13405 function(start, end, xDomain) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13406 // be aware using fixed units will disable the focus/zoom ability on the chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13407 return 1000;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13408 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13409 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13410
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13411 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13412 _chart.xUnits = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13413 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13414 return _xUnits;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13415 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13416 _xUnits = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13417 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13418 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13419
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13420 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13421 #### .xAxis([xAxis])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13422 Set or get the x axis used by a particular coordinate grid chart instance. This function is most
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13423 useful when x axis customization is required. The x axis in dc.js is an instance of a [d3
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13424 axis object](https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-axis); therefore it supports any
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13425 valid d3 axis manipulation. **Caution**: The x axis is usually generated internally by dc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13426 resetting it may cause unexpected results.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13427 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13428 // customize x axis tick format
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13429 chart.xAxis().tickFormat(function(v) {return v + '%';});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13430 // customize x axis tick values
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13431 chart.xAxis().tickValues([0, 100, 200, 300]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13432 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13433
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13434 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13435 _chart.xAxis = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13436 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13437 return _xAxis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13438 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13439 _xAxis = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13440 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13441 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13442
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13443 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13444 #### .elasticX([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13445 Turn on/off elastic x axis behavior. If x axis elasticity is turned on, then the grid chart will
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13446 attempt to recalculate the x axis range whenever a redraw event is triggered.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13447
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13448 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13449 _chart.elasticX = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13450 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13451 return _xElasticity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13452 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13453 _xElasticity = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13454 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13455 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13456
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13457 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13458 #### .xAxisPadding([padding])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13459 Set or get x axis padding for the elastic x axis. The padding will be added to both end of the x
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13460 axis if elasticX is turned on; otherwise it is ignored.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13461
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13462 * padding can be an integer or percentage in string (e.g. '10%'). Padding can be applied to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13463 number or date x axes. When padding a date axis, an integer represents number of days being padded
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13464 and a percentage string will be treated the same as an integer.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13465
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13466 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13467 _chart.xAxisPadding = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13468 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13469 return _xAxisPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13470 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13471 _xAxisPadding = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13472 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13473 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13474
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13475 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13476 #### .xUnitCount()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13477 Returns the number of units displayed on the x axis using the unit measure configured by
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13478 .xUnits.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13479 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13480 _chart.xUnitCount = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13481 if (_unitCount === undefined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13482 var units = _chart.xUnits()(_chart.x().domain()[0], _chart.x().domain()[1], _chart.x().domain());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13483
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13484 if (units instanceof Array) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13485 _unitCount = units.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13486 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13487 _unitCount = units;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13488 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13489 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13490
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13491 return _unitCount;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13492 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13493 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13494 #### .useRightYAxis()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13495 Gets or sets whether the chart should be drawn with a right axis instead of a left axis. When
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13496 used with a chart in a composite chart, allows both left and right Y axes to be shown on a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13497 chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13498 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13499
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13500 _chart.useRightYAxis = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13501 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13502 return _useRightYAxis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13503 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13504 _useRightYAxis = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13505 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13506 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13507
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13508 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13509 #### isOrdinal()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13510 Returns true if the chart is using ordinal xUnits ([dc.units.ordinal](#dcunitsordinal)), or false
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13511 otherwise. Most charts behave differently with ordinal data and use the result of this method to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13512 trigger the appropriate logic.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13513 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13514 _chart.isOrdinal = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13515 return _chart.xUnits() === dc.units.ordinal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13516 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13517
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13518 _chart._useOuterPadding = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13519 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13520 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13521
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13522 _chart._ordinalXDomain = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13523 var groups = _chart._computeOrderedGroups(_chart.data());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13524 return groups.map(_chart.keyAccessor());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13525 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13526
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13527 function prepareXAxis(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13528 if (!_chart.isOrdinal()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13529 if (_chart.elasticX()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13530 _x.domain([_chart.xAxisMin(), _chart.xAxisMax()]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13531 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13532 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13533 else { // _chart.isOrdinal()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13534 if (_chart.elasticX() || _x.domain().length === 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13535 _x.domain(_chart._ordinalXDomain());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13536 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13537 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13538
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13539 // has the domain changed?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13540 var xdom = _x.domain();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13541 if (!_lastXDomain || xdom.some(function (elem, i) { return elem !== _lastXDomain[i]; })) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13542 _chart.rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13543 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13544 _lastXDomain = xdom;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13545
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13546 // please can't we always use rangeBands for bar charts?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13547 if (_chart.isOrdinal()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13548 _x.rangeBands([0, _chart.xAxisLength()], _rangeBandPadding,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13549 _chart._useOuterPadding() ? _outerRangeBandPadding : 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13550 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13551 _x.range([0, _chart.xAxisLength()]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13552 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13553
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13554 _xAxis = _xAxis.scale(_chart.x());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13555
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13556 renderVerticalGridLines(g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13557 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13558
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13559 _chart.renderXAxis = function (g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13560 var axisXG = g.selectAll('g.x');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13561
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13562 if (axisXG.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13563 axisXG = g.append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13564 .attr('class', 'axis x')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13565 .attr('transform', 'translate(' + _chart.margins().left + ',' + _chart._xAxisY() + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13566 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13567
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13568 var axisXLab = g.selectAll('text.' + X_AXIS_LABEL_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13569 if (axisXLab.empty() && _chart.xAxisLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13570 axisXLab = g.append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13571 .attr('transform', 'translate(' + (_chart.margins().left + _chart.xAxisLength() / 2) + ',' +
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13572 (_chart.height() - _xAxisLabelPadding) + ')')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13573 .attr('class', X_AXIS_LABEL_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13574 .attr('text-anchor', 'middle')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13575 .text(_chart.xAxisLabel());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13576 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13577 if (_chart.xAxisLabel() && axisXLab.text() !== _chart.xAxisLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13578 axisXLab.text(_chart.xAxisLabel());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13579 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13580
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13581 dc.transition(axisXG, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13582 .call(_xAxis);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13583 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13584
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13585 function renderVerticalGridLines(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13586 var gridLineG = g.selectAll('g.' + VERTICAL_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13587
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13588 if (_renderVerticalGridLine) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13589 if (gridLineG.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13590 gridLineG = g.insert('g', ':first-child')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13591 .attr('class', GRID_LINE_CLASS + ' ' + VERTICAL_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13592 .attr('transform', 'translate(' + _chart.margins().left + ',' + _chart.margins().top + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13593 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13594
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13595 var ticks = _xAxis.tickValues() ? _xAxis.tickValues() :
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13596 (typeof _x.ticks === 'function' ? _x.ticks(_xAxis.ticks()[0]) : _x.domain());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13597
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13598 var lines = gridLineG.selectAll('line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13599 .data(ticks);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13600
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13601 // enter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13602 var linesGEnter = lines.enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13603 .append('line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13604 .attr('x1', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13605 return _x(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13606 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13607 .attr('y1', _chart._xAxisY() - _chart.margins().top)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13608 .attr('x2', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13609 return _x(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13610 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13611 .attr('y2', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13612 .attr('opacity', 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13613 dc.transition(linesGEnter, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13614 .attr('opacity', 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13615
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13616 // update
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13617 dc.transition(lines, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13618 .attr('x1', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13619 return _x(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13620 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13621 .attr('y1', _chart._xAxisY() - _chart.margins().top)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13622 .attr('x2', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13623 return _x(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13624 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13625 .attr('y2', 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13626
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13627 // exit
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13628 lines.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13629 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13630 else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13631 gridLineG.selectAll('line').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13632 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13633 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13634
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13635 _chart._xAxisY = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13636 return (_chart.height() - _chart.margins().bottom);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13637 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13638
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13639 _chart.xAxisLength = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13640 return _chart.effectiveWidth();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13641 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13642
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13643 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13644 #### .xAxisLabel([labelText, [, padding]])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13645 Set or get the x axis label. If setting the label, you may optionally include additional padding to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13646 the margin to make room for the label. By default the padded is set to 12 to accomodate the text height.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13647 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13648 _chart.xAxisLabel = function (_, padding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13649 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13650 return _xAxisLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13651 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13652 _xAxisLabel = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13653 _chart.margins().bottom -= _xAxisLabelPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13654 _xAxisLabelPadding = (padding === undefined) ? DEFAULT_AXIS_LABEL_PADDING : padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13655 _chart.margins().bottom += _xAxisLabelPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13656 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13657 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13658
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13659 _chart._prepareYAxis = function (g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13660 if (_y === undefined || _chart.elasticY()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13661 _y = d3.scale.linear();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13662 var min = _chart.yAxisMin() || 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13663 max = _chart.yAxisMax() || 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13664 _y.domain([min, max]).rangeRound([_chart.yAxisHeight(), 0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13665 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13666
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13667 _y.range([_chart.yAxisHeight(), 0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13668 _yAxis = _yAxis.scale(_y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13669
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13670 if (_useRightYAxis) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13671 _yAxis.orient('right');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13672 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13673
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13674 _chart._renderHorizontalGridLinesForAxis(g, _y, _yAxis);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13675 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13676
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13677 _chart.renderYAxisLabel = function (axisClass, text, rotation, labelXPosition) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13678 labelXPosition = labelXPosition || _yAxisLabelPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13679
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13680 var axisYLab = _chart.g().selectAll('text.' + Y_AXIS_LABEL_CLASS + '.' + axisClass + '-label');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13681 if (axisYLab.empty() && text) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13682
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13683 var labelYPosition = (_chart.margins().top + _chart.yAxisHeight() / 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13684 axisYLab = _chart.g().append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13685 .attr('transform', 'translate(' + labelXPosition + ',' + labelYPosition + '),rotate(' + rotation + ')')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13686 .attr('class', Y_AXIS_LABEL_CLASS + ' ' + axisClass + '-label')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13687 .attr('text-anchor', 'middle')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13688 .text(text);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13689 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13690 if (text && axisYLab.text() !== text) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13691 axisYLab.text(text);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13692 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13693 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13694
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13695 _chart.renderYAxisAt = function (axisClass, axis, position) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13696 var axisYG = _chart.g().selectAll('g.' + axisClass);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13697 if (axisYG.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13698 axisYG = _chart.g().append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13699 .attr('class', 'axis ' + axisClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13700 .attr('transform', 'translate(' + position + ',' + _chart.margins().top + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13701 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13702
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13703 dc.transition(axisYG, _chart.transitionDuration()).call(axis);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13704 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13705
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13706 _chart.renderYAxis = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13707 var axisPosition = _useRightYAxis ? (_chart.width() - _chart.margins().right) : _chart._yAxisX();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13708 _chart.renderYAxisAt('y', _yAxis, axisPosition);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13709 var labelPosition = _useRightYAxis ? (_chart.width() - _yAxisLabelPadding) : _yAxisLabelPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13710 var rotation = _useRightYAxis ? 90 : -90;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13711 _chart.renderYAxisLabel('y', _chart.yAxisLabel(), rotation, labelPosition);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13712 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13713
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13714 _chart._renderHorizontalGridLinesForAxis = function (g, scale, axis) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13715 var gridLineG = g.selectAll('g.' + HORIZONTAL_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13716
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13717 if (_renderHorizontalGridLine) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13718 var ticks = axis.tickValues() ? axis.tickValues() : scale.ticks(axis.ticks()[0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13719
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13720 if (gridLineG.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13721 gridLineG = g.insert('g', ':first-child')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13722 .attr('class', GRID_LINE_CLASS + ' ' + HORIZONTAL_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13723 .attr('transform', 'translate(' + _chart.margins().left + ',' + _chart.margins().top + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13724 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13725
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13726 var lines = gridLineG.selectAll('line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13727 .data(ticks);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13728
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13729 // enter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13730 var linesGEnter = lines.enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13731 .append('line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13732 .attr('x1', 1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13733 .attr('y1', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13734 return scale(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13735 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13736 .attr('x2', _chart.xAxisLength())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13737 .attr('y2', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13738 return scale(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13739 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13740 .attr('opacity', 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13741 dc.transition(linesGEnter, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13742 .attr('opacity', 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13743
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13744 // update
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13745 dc.transition(lines, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13746 .attr('x1', 1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13747 .attr('y1', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13748 return scale(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13749 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13750 .attr('x2', _chart.xAxisLength())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13751 .attr('y2', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13752 return scale(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13753 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13754
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13755 // exit
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13756 lines.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13757 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13758 else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13759 gridLineG.selectAll('line').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13760 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13761 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13762
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13763 _chart._yAxisX = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13764 return _chart.useRightYAxis() ? _chart.width() - _chart.margins().right : _chart.margins().left;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13765 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13766
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13767 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13768 #### .yAxisLabel([labelText, [, padding]])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13769 Set or get the y axis label. If setting the label, you may optionally include additional padding
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13770 to the margin to make room for the label. By default the padded is set to 12 to accomodate the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13771 text height.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13772 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13773 _chart.yAxisLabel = function (_, padding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13774 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13775 return _yAxisLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13776 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13777 _yAxisLabel = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13778 _chart.margins().left -= _yAxisLabelPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13779 _yAxisLabelPadding = (padding === undefined) ? DEFAULT_AXIS_LABEL_PADDING : padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13780 _chart.margins().left += _yAxisLabelPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13781 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13782 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13783
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13784 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13785 #### .y([yScale])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13786 Get or set the y scale. The y scale is typically automatically determined by the chart implementation.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13787
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13788 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13789 _chart.y = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13790 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13791 return _y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13792 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13793 _y = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13794 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13795 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13796
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13797 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13798 #### .yAxis([yAxis])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13799 Set or get the y axis used by the coordinate grid chart instance. This function is most useful
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13800 when y axis customization is required. The y axis in dc.js is simply an instance of a [d3 axis
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13801 object](https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-_axis); therefore it supports any
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13802 valid d3 axis manipulation. **Caution**: The y axis is usually generated internally by dc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13803 resetting it may cause unexpected results.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13804 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13805 // customize y axis tick format
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13806 chart.yAxis().tickFormat(function(v) {return v + '%';});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13807 // customize y axis tick values
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13808 chart.yAxis().tickValues([0, 100, 200, 300]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13809 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13810
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13811 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13812 _chart.yAxis = function (y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13813 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13814 return _yAxis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13815 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13816 _yAxis = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13817 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13818 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13819
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13820 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13821 #### .elasticY([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13822 Turn on/off elastic y axis behavior. If y axis elasticity is turned on, then the grid chart will
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13823 attempt to recalculate the y axis range whenever a redraw event is triggered.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13824
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13825 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13826 _chart.elasticY = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13827 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13828 return _yElasticity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13829 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13830 _yElasticity = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13831 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13832 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13833
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13834 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13835 #### .renderHorizontalGridLines([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13836 Turn on/off horizontal grid lines.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13837
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13838 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13839 _chart.renderHorizontalGridLines = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13840 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13841 return _renderHorizontalGridLine;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13842 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13843 _renderHorizontalGridLine = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13844 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13845 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13846
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13847 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13848 #### .renderVerticalGridLines([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13849 Turn on/off vertical grid lines.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13850
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13851 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13852 _chart.renderVerticalGridLines = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13853 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13854 return _renderVerticalGridLine;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13855 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13856 _renderVerticalGridLine = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13857 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13858 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13859
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13860 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13861 #### .xAxisMin()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13862 Calculates the minimum x value to display in the chart. Includes xAxisPadding if set.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13863 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13864 _chart.xAxisMin = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13865 var min = d3.min(_chart.data(), function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13866 return _chart.keyAccessor()(e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13867 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13868 return dc.utils.subtract(min, _xAxisPadding);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13869 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13870
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13871 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13872 #### .xAxisMax()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13873 Calculates the maximum x value to display in the chart. Includes xAxisPadding if set.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13874 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13875 _chart.xAxisMax = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13876 var max = d3.max(_chart.data(), function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13877 return _chart.keyAccessor()(e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13878 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13879 return dc.utils.add(max, _xAxisPadding);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13880 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13881
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13882 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13883 #### .yAxisMin()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13884 Calculates the minimum y value to display in the chart. Includes yAxisPadding if set.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13885 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13886 _chart.yAxisMin = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13887 var min = d3.min(_chart.data(), function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13888 return _chart.valueAccessor()(e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13889 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13890 return dc.utils.subtract(min, _yAxisPadding);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13891 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13892
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13893 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13894 #### .yAxisMax()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13895 Calculates the maximum y value to display in the chart. Includes yAxisPadding if set.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13896 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13897 _chart.yAxisMax = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13898 var max = d3.max(_chart.data(), function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13899 return _chart.valueAccessor()(e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13900 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13901 return dc.utils.add(max, _yAxisPadding);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13902 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13903
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13904 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13905 #### .yAxisPadding([padding])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13906 Set or get y axis padding for the elastic y axis. The padding will be added to the top of the y
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13907 axis if elasticY is turned on; otherwise it is ignored.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13908
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13909 * padding can be an integer or percentage in string (e.g. '10%'). Padding can be applied to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13910 number or date axes. When padding a date axis, an integer represents number of days being padded
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13911 and a percentage string will be treated the same as an integer.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13912
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13913 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13914 _chart.yAxisPadding = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13915 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13916 return _yAxisPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13917 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13918 _yAxisPadding = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13919 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13920 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13921
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13922 _chart.yAxisHeight = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13923 return _chart.effectiveHeight();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13924 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13925
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13926 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13927 #### .round([rounding function])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13928 Set or get the rounding function used to quantize the selection when brushing is enabled.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13929 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13930 // set x unit round to by month, this will make sure range selection brush will
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13931 // select whole months
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13932 chart.round(d3.time.month.round);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13933 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13934
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13935 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13936 _chart.round = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13937 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13938 return _round;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13939 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13940 _round = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13941 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13942 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13943
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13944 _chart._rangeBandPadding = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13945 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13946 return _rangeBandPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13947 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13948 _rangeBandPadding = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13949 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13950 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13951
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13952 _chart._outerRangeBandPadding = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13953 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13954 return _outerRangeBandPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13955 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13956 _outerRangeBandPadding = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13957 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13958 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13959
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13960 dc.override(_chart, 'filter', function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13961 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13962 return _chart._filter();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13963 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13964
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13965 _chart._filter(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13966
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13967 if (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13968 _chart.brush().extent(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13969 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13970 _chart.brush().clear();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13971 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13972
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13973 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13974 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13975
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13976 _chart.brush = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13977 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13978 return _brush;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13979 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13980 _brush = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13981 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13982 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13983
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13984 function brushHeight() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13985 return _chart._xAxisY() - _chart.margins().top;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13986 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13987
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13988 _chart.renderBrush = function (g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13989 if (_brushOn) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13990 _brush.on('brush', _chart._brushing);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13991 _brush.on('brushstart', _chart._disableMouseZoom);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13992 _brush.on('brushend', configureMouseZoom);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13993
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13994 var gBrush = g.append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13995 .attr('class', 'brush')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13996 .attr('transform', 'translate(' + _chart.margins().left + ',' + _chart.margins().top + ')')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13997 .call(_brush.x(_chart.x()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13998 _chart.setBrushY(gBrush);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
13999 _chart.setHandlePaths(gBrush);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14000
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14001 if (_chart.hasFilter()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14002 _chart.redrawBrush(g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14003 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14004 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14005 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14006
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14007 _chart.setHandlePaths = function (gBrush) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14008 gBrush.selectAll('.resize').append('path').attr('d', _chart.resizeHandlePath);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14009 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14010
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14011 _chart.setBrushY = function (gBrush) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14012 gBrush.selectAll('rect').attr('height', brushHeight());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14013 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14014
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14015 _chart.extendBrush = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14016 var extent = _brush.extent();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14017 if (_chart.round()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14018 extent[0] = extent.map(_chart.round())[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14019 extent[1] = extent.map(_chart.round())[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14020
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14021 _g.select('.brush')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14022 .call(_brush.extent(extent));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14023 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14024 return extent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14025 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14026
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14027 _chart.brushIsEmpty = function (extent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14028 return _brush.empty() || !extent || extent[1] <= extent[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14029 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14030
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14031 _chart._brushing = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14032 var extent = _chart.extendBrush();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14033
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14034 _chart.redrawBrush(_g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14035
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14036 if (_chart.brushIsEmpty(extent)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14037 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14038 _chart.filter(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14039 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14040 }, dc.constants.EVENT_DELAY);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14041 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14042 var rangedFilter = dc.filters.RangedFilter(extent[0], extent[1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14043
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14044 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14045 _chart.replaceFilter(rangedFilter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14046 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14047 }, dc.constants.EVENT_DELAY);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14048 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14049 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14050
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14051 _chart.redrawBrush = function (g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14052 if (_brushOn) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14053 if (_chart.filter() && _chart.brush().empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14054 _chart.brush().extent(_chart.filter());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14055 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14056
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14057 var gBrush = g.select('g.brush');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14058 gBrush.call(_chart.brush().x(_chart.x()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14059 _chart.setBrushY(gBrush);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14060 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14061
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14062 _chart.fadeDeselectedArea();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14063 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14064
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14065 _chart.fadeDeselectedArea = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14066 // do nothing, sub-chart should override this function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14067 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14068
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14069 // borrowed from Crossfilter example
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14070 _chart.resizeHandlePath = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14071 var e = +(d === 'e'), x = e ? 1 : -1, y = brushHeight() / 3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14072 /*jshint -W014 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14073 return 'M' + (0.5 * x) + ',' + y
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14074 + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14075 + 'V' + (2 * y - 6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14076 + 'A6,6 0 0 ' + e + ' ' + (0.5 * x) + ',' + (2 * y)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14077 + 'Z'
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14078 + 'M' + (2.5 * x) + ',' + (y + 8)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14079 + 'V' + (2 * y - 8)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14080 + 'M' + (4.5 * x) + ',' + (y + 8)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14081 + 'V' + (2 * y - 8);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14082 /*jshint +W014 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14083 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14084
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14085 function getClipPathId() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14086 return _chart.anchorName().replace(/[ .#]/g, '-') + '-clip';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14087 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14088
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14089 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14090 #### .clipPadding([padding])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14091 Get or set the padding in pixels for the clip path. Once set padding will be applied evenly to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14092 the top, left, right, and bottom when the clip path is generated. If set to zero, the clip area
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14093 will be exactly the chart body area minus the margins. Default: 5
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14094
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14095 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14096 _chart.clipPadding = function (p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14097 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14098 return _clipPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14099 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14100 _clipPadding = p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14101 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14102 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14103
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14104 function generateClipPath() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14105 var defs = dc.utils.appendOrSelect(_parent, 'defs');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14106 // cannot select <clippath> elements; bug in WebKit, must select by id
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14107 // https://groups.google.com/forum/#!topic/d3-js/6EpAzQ2gU9I
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14108 var id = getClipPathId();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14109 var chartBodyClip = dc.utils.appendOrSelect(defs, '#' + id, 'clipPath').attr('id', id);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14110
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14111 var padding = _clipPadding * 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14112
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14113 dc.utils.appendOrSelect(chartBodyClip, 'rect')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14114 .attr('width', _chart.xAxisLength() + padding)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14115 .attr('height', _chart.yAxisHeight() + padding)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14116 .attr('transform', 'translate(-' + _clipPadding + ', -' + _clipPadding + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14117 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14118
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14119 _chart._preprocessData = function () {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14120
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14121 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14122 _chart.resetSvg();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14123
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14124 _chart._preprocessData();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14125
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14126 _chart._generateG();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14127 generateClipPath();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14128
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14129 drawChart(true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14130
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14131 configureMouseZoom();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14132
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14133 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14134 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14135
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14136 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14137 _chart._preprocessData();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14138
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14139 drawChart(false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14140 generateClipPath();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14141
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14142 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14143 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14144
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14145 function drawChart (render) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14146 if (_chart.isOrdinal()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14147 _brushOn = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14148 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14149
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14150 prepareXAxis(_chart.g());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14151 _chart._prepareYAxis(_chart.g());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14152
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14153 _chart.plotData();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14154
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14155 if (_chart.elasticX() || _refocused || render) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14156 _chart.renderXAxis(_chart.g());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14157 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14158
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14159 if (_chart.elasticY() || render) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14160 _chart.renderYAxis(_chart.g());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14161 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14162
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14163 if (render) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14164 _chart.renderBrush(_chart.g());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14165 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14166 _chart.redrawBrush(_chart.g());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14167 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14168 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14169
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14170 function configureMouseZoom () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14171 if (_mouseZoomable) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14172 _chart._enableMouseZoom();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14173 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14174 else if (_hasBeenMouseZoomable) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14175 _chart._disableMouseZoom();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14176 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14177 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14178
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14179 _chart._enableMouseZoom = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14180 _hasBeenMouseZoomable = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14181 _zoom.x(_chart.x())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14182 .scaleExtent(_zoomScale)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14183 .size([_chart.width(), _chart.height()])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14184 .duration(_chart.transitionDuration());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14185 _chart.root().call(_zoom);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14186 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14187
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14188 _chart._disableMouseZoom = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14189 _chart.root().call(_nullZoom);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14190 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14191
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14192 function constrainRange(range, constraint) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14193 var constrainedRange = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14194 constrainedRange[0] = d3.max([range[0], constraint[0]]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14195 constrainedRange[1] = d3.min([range[1], constraint[1]]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14196 return constrainedRange;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14197 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14198
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14199 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14200 #### .focus([range])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14201 Zoom this chart to focus on the given range. The given range should be an array containing only
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14202 2 elements (`[start, end]`) defining a range in the x domain. If the range is not given or set
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14203 to null, then the zoom will be reset. _For focus to work elasticX has to be turned off;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14204 otherwise focus will be ignored._
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14205 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14206 chart.renderlet(function(chart){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14207 // smooth the rendering through event throttling
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14208 dc.events.trigger(function(){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14209 // focus some other chart to the range selected by user on this chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14210 someOtherChart.focus(chart.filter());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14211 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14212 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14213 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14214
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14215 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14216 _chart.focus = function (range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14217 if (hasRangeSelected(range)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14218 _chart.x().domain(range);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14219 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14220 _chart.x().domain(_xOriginalDomain);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14221 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14222
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14223 _zoom.x(_chart.x());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14224 zoomHandler();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14225 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14226
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14227 _chart.refocused = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14228 return _refocused;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14229 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14230
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14231 _chart.focusChart = function (c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14232 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14233 return _focusChart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14234 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14235 _focusChart = c;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14236 _chart.on('filtered', function (chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14237 if (!chart.filter()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14238 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14239 _focusChart.x().domain(_focusChart.xOriginalDomain());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14240 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14241 } else if (!rangesEqual(chart.filter(), _focusChart.filter())) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14242 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14243 _focusChart.focus(chart.filter());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14244 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14245 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14246 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14247 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14248 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14249
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14250 function rangesEqual(range1, range2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14251 if (!range1 && !range2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14252 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14253 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14254 else if (!range1 || !range2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14255 return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14256 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14257 else if (range1.length === 0 && range2.length === 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14258 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14259 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14260 else if (range1[0].valueOf() === range2[0].valueOf() &&
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14261 range1[1].valueOf() === range2[1].valueOf()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14262 return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14263 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14264 return false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14265 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14266
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14267 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14268 #### .brushOn([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14269 Turn on/off the brush-based range filter. When brushing is on then user can drag the mouse
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14270 across a chart with a quantitative scale to perform range filtering based on the extent of the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14271 brush, or click on the bars of an ordinal bar chart or slices of a pie chart to filter and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14272 unfilter them. However turning on the brush filter will disable other interactive elements on
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14273 the chart such as highlighting, tool tips, and reference lines. Zooming will still be possible
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14274 if enabled, but only via scrolling (panning will be disabled.) Default: true
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14275
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14276 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14277 _chart.brushOn = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14278 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14279 return _brushOn;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14280 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14281 _brushOn = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14282 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14283 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14284
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14285 function hasRangeSelected(range) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14286 return range instanceof Array && range.length > 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14287 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14288
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14289 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14290 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14291
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14292 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14293 ## Stack Mixin
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14294 Stack Mixin is an mixin that provides cross-chart support of stackability using d3.layout.stack.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14295
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14296 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14297 dc.stackMixin = function (_chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14298
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14299 function prepareValues (layer, layerIdx) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14300 var valAccessor = layer.accessor || _chart.valueAccessor();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14301 layer.name = String(layer.name || layerIdx);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14302 layer.values = layer.group.all().map(function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14303 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14304 x: _chart.keyAccessor()(d, i),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14305 y: layer.hidden ? null : valAccessor(d, i),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14306 data: d,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14307 layer: layer.name,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14308 hidden: layer.hidden
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14309 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14310 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14311
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14312 layer.values = layer.values.filter(domainFilter());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14313 return layer.values;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14314 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14315
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14316 var _stackLayout = d3.layout.stack()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14317 .values(prepareValues);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14318
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14319 var _stack = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14320 var _titles = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14321
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14322 var _hidableStacks = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14323
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14324 function domainFilter() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14325 if (!_chart.x()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14326 return d3.functor(true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14327 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14328 var xDomain = _chart.x().domain();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14329 if (_chart.isOrdinal()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14330 // TODO #416
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14331 //var domainSet = d3.set(xDomain);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14332 return function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14333 return true; //domainSet.has(p.x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14334 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14335 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14336 if (_chart.elasticX()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14337 return function () { return true; };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14338 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14339 return function (p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14340 //return true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14341 return p.x >= xDomain[0] && p.x <= xDomain[xDomain.length - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14342 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14343 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14344
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14345 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14346 #### .stack(group[, name, accessor])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14347 Stack a new crossfilter group onto this chart with an optional custom value accessor. All stacks
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14348 in the same chart will share the same key accessor and therefore the same set of keys.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14349
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14350 For example, in a stacked bar chart, the bars of each stack will be positioned using the same set
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14351 of keys on the x axis, while stacked vertically. If name is specified then it will be used to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14352 generate the legend label.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14353 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14354 // stack group using default accessor
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14355 chart.stack(valueSumGroup)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14356 // stack group using custom accessor
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14357 .stack(avgByDayGroup, function(d){return d.value.avgByDay;});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14358 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14359
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14360 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14361 _chart.stack = function (group, name, accessor) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14362 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14363 return _stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14364 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14365
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14366 if (arguments.length <= 2) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14367 accessor = name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14368 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14369
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14370 var layer = {group:group};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14371 if (typeof name === 'string') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14372 layer.name = name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14373 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14374 if (typeof accessor === 'function') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14375 layer.accessor = accessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14376 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14377 _stack.push(layer);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14378
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14379 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14380 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14381
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14382 dc.override(_chart, 'group', function (g, n, f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14383 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14384 return _chart._group();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14385 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14386 _stack = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14387 _titles = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14388 _chart.stack(g, n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14389 if (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14390 _chart.valueAccessor(f);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14391 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14392 return _chart._group(g, n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14393 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14394
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14395 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14396 #### .hidableStacks([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14397 Allow named stacks to be hidden or shown by clicking on legend items.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14398 This does not affect the behavior of hideStack or showStack.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14399
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14400 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14401 _chart.hidableStacks = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14402 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14403 return _hidableStacks;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14404 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14405 _hidableStacks = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14406 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14407 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14408
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14409 function findLayerByName(n) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14410 var i = _stack.map(dc.pluck('name')).indexOf(n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14411 return _stack[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14412 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14413
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14414 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14415 #### .hideStack(name)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14416 Hide all stacks on the chart with the given name.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14417 The chart must be re-rendered for this change to appear.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14418
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14419 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14420 _chart.hideStack = function (stackName) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14421 var layer = findLayerByName(stackName);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14422 if (layer) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14423 layer.hidden = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14424 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14425 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14426 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14427
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14428 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14429 #### .showStack(name)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14430 Show all stacks on the chart with the given name.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14431 The chart must be re-rendered for this change to appear.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14432
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14433 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14434 _chart.showStack = function (stackName) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14435 var layer = findLayerByName(stackName);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14436 if (layer) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14437 layer.hidden = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14438 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14439 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14440 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14441
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14442 _chart.getValueAccessorByIndex = function (index) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14443 return _stack[index].accessor || _chart.valueAccessor();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14444 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14445
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14446 _chart.yAxisMin = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14447 var min = d3.min(flattenStack(), function (p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14448 return (p.y + p.y0 < p.y0) ? (p.y + p.y0) : p.y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14449 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14450
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14451 return dc.utils.subtract(min, _chart.yAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14452
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14453 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14454
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14455 _chart.yAxisMax = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14456 var max = d3.max(flattenStack(), function (p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14457 return p.y + p.y0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14458 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14459
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14460 return dc.utils.add(max, _chart.yAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14461 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14462
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14463 function flattenStack() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14464 return _chart.data().reduce(function (all, layer) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14465 return all.concat(layer.values);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14466 }, []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14467 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14468
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14469 _chart.xAxisMin = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14470 var min = d3.min(flattenStack(), dc.pluck('x'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14471 return dc.utils.subtract(min, _chart.xAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14472 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14473
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14474 _chart.xAxisMax = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14475 var max = d3.max(flattenStack(), dc.pluck('x'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14476 return dc.utils.add(max, _chart.xAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14477 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14478
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14479 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14480 #### .title([stackName], [titleFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14481 Set or get the title function. Chart class will use this function to render svg title (usually interpreted by
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14482 browser as tooltips) for each child element in the chart, i.e. a slice in a pie chart or a bubble in a bubble chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14483 Almost every chart supports title function however in grid coordinate chart you need to turn off brush in order to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14484 use title otherwise the brush layer will block tooltip trigger.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14485
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14486 If the first argument is a stack name, the title function will get or set the title for that stack. If stackName
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14487 is not provided, the first stack is implied.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14488 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14489 // set a title function on 'first stack'
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14490 chart.title('first stack', function(d) { return d.key + ': ' + d.value; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14491 // get a title function from 'second stack'
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14492 var secondTitleFunction = chart.title('second stack');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14493 );
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14494 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14495 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14496 dc.override(_chart, 'title', function (stackName, titleAccessor) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14497 if (!stackName) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14498 return _chart._title();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14499 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14500
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14501 if (typeof stackName === 'function') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14502 return _chart._title(stackName);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14503 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14504 if (stackName === _chart._groupName && typeof titleAccessor === 'function') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14505 return _chart._title(titleAccessor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14506 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14507
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14508 if (typeof titleAccessor !== 'function') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14509 return _titles[stackName] || _chart._title();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14510 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14511
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14512 _titles[stackName] = titleAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14513
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14514 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14515 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14516
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14517 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14518 #### .stackLayout([layout])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14519 Gets or sets the stack layout algorithm, which computes a baseline for each stack and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14520 propagates it to the next. The default is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14521 [d3.layout.stack](https://github.com/mbostock/d3/wiki/Stack-Layout#stack).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14522 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14523 _chart.stackLayout = function (stack) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14524 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14525 return _stackLayout;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14526 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14527 _stackLayout = stack;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14528 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14529 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14530
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14531 function visability(l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14532 return !l.hidden;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14533 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14534
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14535 _chart.data(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14536 var layers = _stack.filter(visability);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14537 return layers.length ? _chart.stackLayout()(layers) : [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14538 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14539
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14540 _chart._ordinalXDomain = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14541 return flattenStack().map(dc.pluck('x'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14542 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14543
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14544 _chart.colorAccessor(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14545 var layer = this.layer || this.name || d.name || d.layer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14546 return layer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14547 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14548
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14549 _chart.legendables = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14550 return _stack.map(function (layer, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14551 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14552 chart:_chart,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14553 name:layer.name,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14554 hidden: layer.hidden || false,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14555 color:_chart.getColor.call(layer, layer.values, i)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14556 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14557 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14558 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14559
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14560 _chart.isLegendableHidden = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14561 var layer = findLayerByName(d.name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14562 return layer ? layer.hidden : false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14563 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14564
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14565 _chart.legendToggle = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14566 if (_hidableStacks) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14567 if (_chart.isLegendableHidden(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14568 _chart.showStack(d.name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14569 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14570 _chart.hideStack(d.name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14571 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14572 //_chart.redraw();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14573 _chart.renderGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14574 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14575 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14576
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14577 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14578 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14579
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14580 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14581 ## Cap Mixin
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14582 Cap is a mixin that groups small data elements below a _cap_ into an *others* grouping for both the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14583 Row and Pie Charts.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14584
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14585 The top ordered elements in the group up to the cap amount will be kept in the chart, and the rest
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14586 will be replaced with an *others* element, with value equal to the sum of the replaced values. The
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14587 keys of the elements below the cap limit are recorded in order to filter by those keys when the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14588 *others* element is clicked.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14589
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14590 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14591 dc.capMixin = function (_chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14592
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14593 var _cap = Infinity;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14594
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14595 var _othersLabel = 'Others';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14596
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14597 var _othersGrouper = function (topRows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14598 var topRowsSum = d3.sum(topRows, _chart.valueAccessor()),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14599 allRows = _chart.group().all(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14600 allRowsSum = d3.sum(allRows, _chart.valueAccessor()),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14601 topKeys = topRows.map(_chart.keyAccessor()),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14602 allKeys = allRows.map(_chart.keyAccessor()),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14603 topSet = d3.set(topKeys),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14604 others = allKeys.filter(function (d) {return !topSet.has(d);});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14605 if (allRowsSum > topRowsSum) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14606 return topRows.concat([{'others': others, 'key': _othersLabel, 'value': allRowsSum - topRowsSum}]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14607 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14608 return topRows;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14609 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14610
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14611 _chart.cappedKeyAccessor = function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14612 if (d.others) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14613 return d.key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14614 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14615 return _chart.keyAccessor()(d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14616 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14617
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14618 _chart.cappedValueAccessor = function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14619 if (d.others) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14620 return d.value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14621 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14622 return _chart.valueAccessor()(d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14623 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14624
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14625 _chart.data(function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14626 if (_cap === Infinity) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14627 return _chart._computeOrderedGroups(group.all());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14628 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14629 var topRows = group.top(_cap); // ordered by crossfilter group order (default value)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14630 topRows = _chart._computeOrderedGroups(topRows); // re-order using ordering (default key)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14631 if (_othersGrouper) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14632 return _othersGrouper(topRows);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14633 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14634 return topRows;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14635 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14636 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14637
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14638 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14639 #### .cap([count])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14640 Get or set the count of elements to that will be included in the cap.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14641 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14642 _chart.cap = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14643 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14644 return _cap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14645 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14646 _cap = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14647 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14648 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14649
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14650 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14651 #### .othersLabel([label])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14652 Get or set the label for *Others* slice when slices cap is specified. Default label is **Others**.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14653 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14654 _chart.othersLabel = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14655 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14656 return _othersLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14657 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14658 _othersLabel = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14659 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14660 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14661
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14662 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14663 #### .othersGrouper([grouperFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14664 Get or set the grouper function that will perform the insertion of data for the *Others* slice
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14665 if the slices cap is specified. If set to a falsy value, no others will be added. By default the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14666 grouper function computes the sum of all values below the cap.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14667 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14668 chart.othersGrouper(function (data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14669 // compute the value for others, presumably the sum of all values below the cap
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14670 var othersSum = yourComputeOthersValueLogic(data)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14671
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14672 // the keys are needed to properly filter when the others element is clicked
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14673 var othersKeys = yourComputeOthersKeysArrayLogic(data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14674
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14675 // add the others row to the dataset
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14676 data.push({'key': 'Others', 'value': othersSum, 'others': othersKeys });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14677
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14678 return data;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14679 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14680 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14681 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14682 _chart.othersGrouper = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14683 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14684 return _othersGrouper;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14685 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14686 _othersGrouper = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14687 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14688 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14689
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14690 dc.override(_chart, 'onClick', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14691 if (d.others) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14692 _chart.filter([d.others]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14693 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14694 _chart._onClick(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14695 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14696
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14697 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14698 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14699
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14700 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14701 ## Bubble Mixin
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14702 Includes: [Color Mixin](#color-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14703
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14704 This Mixin provides reusable functionalities for any chart that needs to visualize data using bubbles.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14705
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14706 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14707 dc.bubbleMixin = function (_chart) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14708 var _maxBubbleRelativeSize = 0.3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14709 var _minRadiusWithLabel = 10;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14710
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14711 _chart.BUBBLE_NODE_CLASS = 'node';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14712 _chart.BUBBLE_CLASS = 'bubble';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14713 _chart.MIN_RADIUS = 10;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14714
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14715 _chart = dc.colorMixin(_chart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14716
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14717 _chart.renderLabel(true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14718
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14719 _chart.data(function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14720 return group.top(Infinity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14721 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14722
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14723 var _r = d3.scale.linear().domain([0, 100]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14724
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14725 var _rValueAccessor = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14726 return d.r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14727 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14728
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14729 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14730 #### .r([bubbleRadiusScale])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14731 Get or set the bubble radius scale. By default the bubble chart uses
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14732 `d3.scale.linear().domain([0, 100])` as its r scale .
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14733
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14734 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14735 _chart.r = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14736 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14737 return _r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14738 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14739 _r = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14740 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14741 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14742
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14743 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14744 #### .radiusValueAccessor([radiusValueAccessor])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14745 Get or set the radius value accessor function. If set, the radius value accessor function will
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14746 be used to retrieve a data value for each bubble. The data retrieved then will be mapped using
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14747 the r scale to the actual bubble radius. This allows you to encode a data dimension using bubble
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14748 size.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14749
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14750 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14751 _chart.radiusValueAccessor = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14752 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14753 return _rValueAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14754 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14755 _rValueAccessor = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14756 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14757 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14758
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14759 _chart.rMin = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14760 var min = d3.min(_chart.data(), function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14761 return _chart.radiusValueAccessor()(e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14762 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14763 return min;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14764 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14765
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14766 _chart.rMax = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14767 var max = d3.max(_chart.data(), function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14768 return _chart.radiusValueAccessor()(e);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14769 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14770 return max;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14771 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14772
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14773 _chart.bubbleR = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14774 var value = _chart.radiusValueAccessor()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14775 var r = _chart.r()(value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14776 if (isNaN(r) || value <= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14777 r = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14778 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14779 return r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14780 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14781
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14782 var labelFunction = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14783 return _chart.label()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14784 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14785
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14786 var labelOpacity = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14787 return (_chart.bubbleR(d) > _minRadiusWithLabel) ? 1 : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14788 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14789
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14790 _chart._doRenderLabel = function (bubbleGEnter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14791 if (_chart.renderLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14792 var label = bubbleGEnter.select('text');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14793
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14794 if (label.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14795 label = bubbleGEnter.append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14796 .attr('text-anchor', 'middle')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14797 .attr('dy', '.3em')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14798 .on('click', _chart.onClick);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14799 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14800
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14801 label
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14802 .attr('opacity', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14803 .text(labelFunction);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14804 dc.transition(label, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14805 .attr('opacity', labelOpacity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14806 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14807 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14808
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14809 _chart.doUpdateLabels = function (bubbleGEnter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14810 if (_chart.renderLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14811 var labels = bubbleGEnter.selectAll('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14812 .text(labelFunction);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14813 dc.transition(labels, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14814 .attr('opacity', labelOpacity);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14815 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14816 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14817
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14818 var titleFunction = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14819 return _chart.title()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14820 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14821
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14822 _chart._doRenderTitles = function (g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14823 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14824 var title = g.select('title');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14825
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14826 if (title.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14827 g.append('title').text(titleFunction);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14828 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14829 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14830 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14831
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14832 _chart.doUpdateTitles = function (g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14833 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14834 g.selectAll('title').text(titleFunction);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14835 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14836 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14837
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14838 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14839 #### .minRadiusWithLabel([radius])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14840 Get or set the minimum radius for label rendering. If a bubble's radius is less than this value
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14841 then no label will be rendered. Default: 10
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14842
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14843 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14844 _chart.minRadiusWithLabel = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14845 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14846 return _minRadiusWithLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14847 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14848 _minRadiusWithLabel = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14849 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14850 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14851
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14852 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14853 #### .maxBubbleRelativeSize([relativeSize])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14854 Get or set the maximum relative size of a bubble to the length of x axis. This value is useful
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14855 when the difference in radius between bubbles is too great. Default: 0.3
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14856
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14857 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14858 _chart.maxBubbleRelativeSize = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14859 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14860 return _maxBubbleRelativeSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14861 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14862 _maxBubbleRelativeSize = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14863 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14864 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14865
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14866 _chart.fadeDeselectedArea = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14867 if (_chart.hasFilter()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14868 _chart.selectAll('g.' + _chart.BUBBLE_NODE_CLASS).each(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14869 if (_chart.isSelectedNode(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14870 _chart.highlightSelected(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14871 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14872 _chart.fadeDeselected(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14873 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14874 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14875 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14876 _chart.selectAll('g.' + _chart.BUBBLE_NODE_CLASS).each(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14877 _chart.resetHighlight(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14878 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14879 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14880 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14881
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14882 _chart.isSelectedNode = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14883 return _chart.hasFilter(d.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14884 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14885
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14886 _chart.onClick = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14887 var filter = d.key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14888 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14889 _chart.filter(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14890 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14891 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14892 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14893
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14894 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14895 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14896
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14897 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14898 ## Pie Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14899 Includes: [Cap Mixin](#cap-mixin), [Color Mixin](#color-mixin), [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14900
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14901 The pie chart implementation is usually used to visualize a small categorical distribution. The pie
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14902 chart uses keyAccessor to determine the slices, and valueAccessor to calculate the size of each
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14903 slice relative to the sum of all values. Slices are ordered by `.ordering` which defaults to sorting
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14904 by key.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14905
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14906 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14907
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14908 * [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14909 #### dc.pieChart(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14910 Create a pie chart instance and attaches it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14911
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14912 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14913
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14914 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14915 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14916 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14917
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14918 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14919 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14920
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14921 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14922 A newly created pie chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14923
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14924 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14925 // create a pie chart under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14926 var chart1 = dc.pieChart('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14927 // create a pie chart under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14928 var chart2 = dc.pieChart('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14929 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14930
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14931 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14932 dc.pieChart = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14933 var DEFAULT_MIN_ANGLE_FOR_LABEL = 0.5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14934
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14935 var _sliceCssClass = 'pie-slice';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14936 var _emptyCssClass = 'empty-chart';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14937 var _emptyTitle = 'empty';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14938
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14939 var _radius,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14940 _innerRadius = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14941
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14942 var _g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14943 var _cx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14944 var _cy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14945 var _minAngleForLabel = DEFAULT_MIN_ANGLE_FOR_LABEL;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14946 var _externalLabelRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14947 var _chart = dc.capMixin(dc.colorMixin(dc.baseMixin({})));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14948
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14949 _chart.colorAccessor(_chart.cappedKeyAccessor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14950
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14951 _chart.title(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14952 return _chart.cappedKeyAccessor(d) + ': ' + _chart.cappedValueAccessor(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14953 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14954
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14955 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14956 #### .slicesCap([cap])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14957 Get or set the maximum number of slices the pie chart will generate. The top slices are determined by
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14958 value from high to low. Other slices exeeding the cap will be rolled up into one single *Others* slice.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14959 The resulting data will still be sorted by .ordering (default by key).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14960
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14961 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14962 _chart.slicesCap = _chart.cap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14963
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14964 _chart.label(_chart.cappedKeyAccessor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14965 _chart.renderLabel(true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14966
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14967 _chart.transitionDuration(350);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14968
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14969 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14970 _chart.resetSvg();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14971
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14972 _g = _chart.svg()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14973 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14974 .attr('transform', 'translate(' + _chart.cx() + ',' + _chart.cy() + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14975
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14976 drawChart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14977
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14978 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14979 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14980
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14981 function drawChart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14982 // set radius on basis of chart dimension if missing
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14983 _radius = _radius ? _radius : d3.min([_chart.width(), _chart.height()]) / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14984
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14985 var arc = buildArcs();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14986
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14987 var pie = pieLayout();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14988 var pieData;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14989 // if we have data...
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14990 if (d3.sum(_chart.data(), _chart.valueAccessor())) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14991 pieData = pie(_chart.data());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14992 _g.classed(_emptyCssClass, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14993 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14994 // otherwise we'd be getting NaNs, so override
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14995 // note: abuse others for its ignoring the value accessor
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14996 pieData = pie([{key:_emptyTitle, value:1, others: [_emptyTitle]}]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14997 _g.classed(_emptyCssClass, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14998 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
14999
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15000 if (_g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15001 var slices = _g.selectAll('g.' + _sliceCssClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15002 .data(pieData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15003
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15004 createElements(slices, arc, pieData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15005
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15006 updateElements(pieData, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15007
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15008 removeElements(slices);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15009
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15010 highlightFilter();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15011 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15012 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15013
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15014 function createElements(slices, arc, pieData) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15015 var slicesEnter = createSliceNodes(slices);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15016
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15017 createSlicePath(slicesEnter, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15018
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15019 createTitles(slicesEnter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15020
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15021 createLabels(pieData, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15022 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15023
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15024 function createSliceNodes(slices) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15025 var slicesEnter = slices
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15026 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15027 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15028 .attr('class', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15029 return _sliceCssClass + ' _' + i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15030 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15031 return slicesEnter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15032 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15033
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15034 function createSlicePath(slicesEnter, arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15035 var slicePath = slicesEnter.append('path')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15036 .attr('fill', fill)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15037 .on('click', onClick)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15038 .attr('d', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15039 return safeArc(d, i, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15040 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15041
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15042 dc.transition(slicePath, _chart.transitionDuration(), function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15043 s.attrTween('d', tweenPie);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15044 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15045 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15046
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15047 function createTitles(slicesEnter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15048 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15049 slicesEnter.append('title').text(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15050 return _chart.title()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15051 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15052 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15053 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15054
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15055 function positionLabels(labelsEnter, arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15056 dc.transition(labelsEnter, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15057 .attr('transform', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15058 return labelPosition(d, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15059 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15060 .attr('text-anchor', 'middle')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15061 .text(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15062 var data = d.data;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15063 if ((sliceHasNoData(data) || sliceTooSmall(d)) && !isSelectedSlice(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15064 return '';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15065 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15066 return _chart.label()(d.data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15067 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15068 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15069
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15070 function createLabels(pieData, arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15071 if (_chart.renderLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15072 var labels = _g.selectAll('text.' + _sliceCssClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15073 .data(pieData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15074
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15075 labels.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15076
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15077 var labelsEnter = labels
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15078 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15079 .append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15080 .attr('class', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15081 var classes = _sliceCssClass + ' _' + i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15082 if (_externalLabelRadius) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15083 classes += ' external';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15084 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15085 return classes;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15086 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15087 .on('click', onClick);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15088 positionLabels(labelsEnter, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15089 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15090 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15091
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15092 function updateElements(pieData, arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15093 updateSlicePaths(pieData, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15094 updateLabels(pieData, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15095 updateTitles(pieData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15096 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15097
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15098 function updateSlicePaths(pieData, arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15099 var slicePaths = _g.selectAll('g.' + _sliceCssClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15100 .data(pieData)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15101 .select('path')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15102 .attr('d', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15103 return safeArc(d, i, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15104 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15105 dc.transition(slicePaths, _chart.transitionDuration(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15106 function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15107 s.attrTween('d', tweenPie);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15108 }).attr('fill', fill);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15109 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15110
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15111 function updateLabels(pieData, arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15112 if (_chart.renderLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15113 var labels = _g.selectAll('text.' + _sliceCssClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15114 .data(pieData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15115 positionLabels(labels, arc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15116 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15117 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15118
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15119 function updateTitles(pieData) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15120 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15121 _g.selectAll('g.' + _sliceCssClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15122 .data(pieData)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15123 .select('title')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15124 .text(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15125 return _chart.title()(d.data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15126 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15127 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15128 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15129
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15130 function removeElements(slices) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15131 slices.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15132 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15133
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15134 function highlightFilter() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15135 if (_chart.hasFilter()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15136 _chart.selectAll('g.' + _sliceCssClass).each(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15137 if (isSelectedSlice(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15138 _chart.highlightSelected(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15139 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15140 _chart.fadeDeselected(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15141 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15142 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15143 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15144 _chart.selectAll('g.' + _sliceCssClass).each(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15145 _chart.resetHighlight(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15146 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15147 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15148 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15149
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15150 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15151 #### .innerRadius([innerRadius])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15152 Get or set the inner radius of the pie chart. If the inner radius is greater than 0px then the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15153 pie chart will be rendered as a doughnut chart. Default inner radius is 0px.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15154
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15155 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15156 _chart.innerRadius = function (r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15157 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15158 return _innerRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15159 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15160 _innerRadius = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15161 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15162 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15163
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15164 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15165 #### .radius([radius])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15166 Get or set the outer radius. If the radius is not set, it will be half of the minimum of the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15167 chart width and height.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15168
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15169 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15170 _chart.radius = function (r) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15171 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15172 return _radius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15173 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15174 _radius = r;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15175 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15176 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15177
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15178 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15179 #### .cx([cx])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15180 Get or set center x coordinate position. Default is center of svg.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15181
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15182 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15183 _chart.cx = function (cx) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15184 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15185 return (_cx || _chart.width() / 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15186 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15187 _cx = cx;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15188 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15189 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15190
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15191 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15192 #### .cy([cy])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15193 Get or set center y coordinate position. Default is center of svg.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15194
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15195 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15196 _chart.cy = function (cy) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15197 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15198 return (_cy || _chart.height() / 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15199 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15200 _cy = cy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15201 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15202 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15203
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15204 function buildArcs() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15205 return d3.svg.arc().outerRadius(_radius).innerRadius(_innerRadius);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15206 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15207
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15208 function isSelectedSlice(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15209 return _chart.hasFilter(_chart.cappedKeyAccessor(d.data));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15210 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15211
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15212 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15213 drawChart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15214 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15215 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15216
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15217 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15218 #### .minAngleForLabel([minAngle])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15219 Get or set the minimal slice angle for label rendering. Any slice with a smaller angle will not
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15220 display a slice label. Default min angle is 0.5.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15221 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15222 _chart.minAngleForLabel = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15223 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15224 return _minAngleForLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15225 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15226 _minAngleForLabel = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15227 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15228 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15229
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15230 function pieLayout() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15231 return d3.layout.pie().sort(null).value(_chart.cappedValueAccessor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15232 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15233
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15234 function sliceTooSmall(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15235 var angle = (d.endAngle - d.startAngle);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15236 return isNaN(angle) || angle < _minAngleForLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15237 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15238
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15239 function sliceHasNoData(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15240 return _chart.cappedValueAccessor(d) === 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15241 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15242
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15243 function tweenPie(b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15244 b.innerRadius = _innerRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15245 var current = this._current;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15246 if (isOffCanvas(current)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15247 current = {startAngle: 0, endAngle: 0};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15248 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15249 var i = d3.interpolate(current, b);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15250 this._current = i(0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15251 return function (t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15252 return safeArc(i(t), 0, buildArcs());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15253 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15254 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15255
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15256 function isOffCanvas(current) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15257 return !current || isNaN(current.startAngle) || isNaN(current.endAngle);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15258 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15259
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15260 function fill(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15261 return _chart.getColor(d.data, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15262 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15263
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15264 function onClick(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15265 if (_g.attr('class') !== _emptyCssClass) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15266 _chart.onClick(d.data, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15267 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15268 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15269
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15270 function safeArc(d, i, arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15271 var path = arc(d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15272 if (path.indexOf('NaN') >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15273 path = 'M0,0';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15274 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15275 return path;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15276 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15277
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15278 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15279 #### .emptyTitle([title])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15280 Title to use for the only slice when there is no data
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15281 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15282 _chart.emptyTitle = function (title) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15283 if (arguments.length === 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15284 return _emptyTitle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15285 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15286 _emptyTitle = title;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15287 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15288 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15289
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15290 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15291 #### .externalLabels([radius])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15292 Position slice labels offset from the outer edge of the chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15293
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15294 The given argument sets the radial offset.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15295 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15296 _chart.externalLabels = function (radius) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15297 if (arguments.length === 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15298 return _externalLabelRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15299 } else if (radius) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15300 _externalLabelRadius = radius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15301 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15302 _externalLabelRadius = undefined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15303 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15304
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15305 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15306 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15307
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15308 function labelPosition(d, arc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15309 var centroid;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15310 if (_externalLabelRadius) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15311 centroid = d3.svg.arc()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15312 .outerRadius(_radius + _externalLabelRadius)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15313 .innerRadius(_radius + _externalLabelRadius)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15314 .centroid(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15315 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15316 centroid = arc.centroid(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15317 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15318 if (isNaN(centroid[0]) || isNaN(centroid[1])) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15319 return 'translate(0,0)';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15320 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15321 return 'translate(' + centroid + ')';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15322 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15323 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15324
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15325 _chart.legendables = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15326 return _chart.data().map(function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15327 var legendable = {name: d.key, data: d.value, others: d.others, chart:_chart};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15328 legendable.color = _chart.getColor(d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15329 return legendable;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15330 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15331 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15332
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15333 _chart.legendHighlight = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15334 highlightSliceFromLegendable(d, true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15335 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15336
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15337 _chart.legendReset = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15338 highlightSliceFromLegendable(d, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15339 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15340
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15341 _chart.legendToggle = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15342 _chart.onClick({key: d.name, others: d.others});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15343 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15344
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15345 function highlightSliceFromLegendable(legendable, highlighted) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15346 _chart.selectAll('g.pie-slice').each(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15347 if (legendable.name === d.data.key) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15348 d3.select(this).classed('highlight', highlighted);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15349 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15350 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15351 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15352
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15353 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15354 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15355
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15356 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15357 ## Bar Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15358 Includes: [Stack Mixin](#stack Mixin), [Coordinate Grid Mixin](#coordinate-grid-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15359
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15360 Concrete bar chart/histogram implementation.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15361
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15362 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15363
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15364 * [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15365 * [Canadian City Crime Stats](http://dc-js.github.com/dc.js/crime/index.html)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15366 #### dc.barChart(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15367 Create a bar chart instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15368
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15369 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15370 * parent : string | node | selection | compositeChart - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15371 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15372 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15373 If the bar chart is a sub-chart in a [Composite Chart](#composite-chart) then pass in the parent composite
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15374 chart instance.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15375 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15376 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15377
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15378 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15379 A newly created bar chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15380
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15381 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15382 // create a bar chart under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15383 var chart1 = dc.barChart('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15384 // create a bar chart under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15385 var chart2 = dc.barChart('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15386 // create a sub-chart under a composite parent chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15387 var chart3 = dc.barChart(compositeChart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15388 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15389
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15390 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15391 dc.barChart = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15392 var MIN_BAR_WIDTH = 1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15393 var DEFAULT_GAP_BETWEEN_BARS = 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15394
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15395 var _chart = dc.stackMixin(dc.coordinateGridMixin({}));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15396
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15397 var _gap = DEFAULT_GAP_BETWEEN_BARS;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15398 var _centerBar = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15399 var _alwaysUseRounding = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15400
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15401 var _barWidth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15402
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15403 dc.override(_chart, 'rescale', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15404 _chart._rescale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15405 _barWidth = undefined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15406 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15407
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15408 dc.override(_chart, 'render', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15409 if (_chart.round() && _centerBar && !_alwaysUseRounding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15410 dc.logger.warn('By default, brush rounding is disabled if bars are centered. ' +
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15411 'See dc.js bar chart API documentation for details.');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15412 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15413
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15414 _chart._render();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15415 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15416
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15417 _chart.plotData = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15418 var layers = _chart.chartBodyG().selectAll('g.stack')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15419 .data(_chart.data());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15420
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15421 calculateBarWidth();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15422
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15423 layers
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15424 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15425 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15426 .attr('class', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15427 return 'stack ' + '_' + i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15428 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15429
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15430 layers.each(function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15431 var layer = d3.select(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15432
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15433 renderBars(layer, i, d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15434 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15435 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15436
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15437 function barHeight(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15438 return dc.utils.safeNumber(Math.abs(_chart.y()(d.y + d.y0) - _chart.y()(d.y0)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15439 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15440
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15441 function renderBars(layer, layerIndex, d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15442 var bars = layer.selectAll('rect.bar')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15443 .data(d.values, dc.pluck('x'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15444
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15445 var enter = bars.enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15446 .append('rect')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15447 .attr('class', 'bar')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15448 .attr('fill', dc.pluck('data', _chart.getColor))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15449 .attr('y', _chart.yAxisHeight())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15450 .attr('height', 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15451
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15452 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15453 enter.append('title').text(dc.pluck('data', _chart.title(d.name)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15454 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15455
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15456 if (_chart.isOrdinal()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15457 bars.on('click', onClick);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15458 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15459
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15460 dc.transition(bars, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15461 .attr('x', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15462 var x = _chart.x()(d.x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15463 if (_centerBar) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15464 x -= _barWidth / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15465 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15466 if (_chart.isOrdinal() && _gap !== undefined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15467 x += _gap / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15468 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15469 return dc.utils.safeNumber(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15470 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15471 .attr('y', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15472 var y = _chart.y()(d.y + d.y0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15473
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15474 if (d.y < 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15475 y -= barHeight(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15476 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15477
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15478 return dc.utils.safeNumber(y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15479 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15480 .attr('width', _barWidth)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15481 .attr('height', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15482 return barHeight(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15483 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15484 .attr('fill', dc.pluck('data', _chart.getColor))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15485 .select('title').text(dc.pluck('data', _chart.title(d.name)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15486
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15487 dc.transition(bars.exit(), _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15488 .attr('height', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15489 .remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15490 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15491
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15492 function calculateBarWidth() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15493 if (_barWidth === undefined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15494 var numberOfBars = _chart.xUnitCount();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15495
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15496 // please can't we always use rangeBands for bar charts?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15497 if (_chart.isOrdinal() && _gap === undefined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15498 _barWidth = Math.floor(_chart.x().rangeBand());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15499 } else if (_gap) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15500 _barWidth = Math.floor((_chart.xAxisLength() - (numberOfBars - 1) * _gap) / numberOfBars);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15501 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15502 _barWidth = Math.floor(_chart.xAxisLength() / (1 + _chart.barPadding()) / numberOfBars);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15503 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15504
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15505 if (_barWidth === Infinity || isNaN(_barWidth) || _barWidth < MIN_BAR_WIDTH) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15506 _barWidth = MIN_BAR_WIDTH;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15507 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15508 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15509 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15510
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15511 _chart.fadeDeselectedArea = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15512 var bars = _chart.chartBodyG().selectAll('rect.bar');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15513 var extent = _chart.brush().extent();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15514
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15515 if (_chart.isOrdinal()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15516 if (_chart.hasFilter()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15517 bars.classed(dc.constants.SELECTED_CLASS, function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15518 return _chart.hasFilter(d.x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15519 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15520 bars.classed(dc.constants.DESELECTED_CLASS, function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15521 return !_chart.hasFilter(d.x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15522 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15523 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15524 bars.classed(dc.constants.SELECTED_CLASS, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15525 bars.classed(dc.constants.DESELECTED_CLASS, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15526 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15527 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15528 if (!_chart.brushIsEmpty(extent)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15529 var start = extent[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15530 var end = extent[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15531
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15532 bars.classed(dc.constants.DESELECTED_CLASS, function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15533 return d.x < start || d.x >= end;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15534 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15535 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15536 bars.classed(dc.constants.DESELECTED_CLASS, false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15537 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15538 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15539 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15540
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15541 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15542 #### .centerBar(boolean)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15543 Whether the bar chart will render each bar centered around the data position on x axis. Default: false
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15544
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15545 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15546 _chart.centerBar = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15547 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15548 return _centerBar;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15549 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15550 _centerBar = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15551 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15552 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15553
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15554 function onClick(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15555 _chart.onClick(d.data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15556 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15557
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15558 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15559 #### .barPadding([padding])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15560 Get or set the spacing between bars as a fraction of bar size. Valid values are between 0-1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15561 Setting this value will also remove any previously set `gap`. See the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15562 [d3 docs](https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal_rangeBands)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15563 for a visual description of how the padding is applied.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15564 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15565 _chart.barPadding = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15566 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15567 return _chart._rangeBandPadding();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15568 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15569 _chart._rangeBandPadding(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15570 _gap = undefined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15571 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15572 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15573
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15574 _chart._useOuterPadding = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15575 return _gap === undefined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15576 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15577
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15578 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15579 #### .outerPadding([padding])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15580 Get or set the outer padding on an ordinal bar chart. This setting has no effect on non-ordinal charts.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15581 Will pad the width by `padding * barWidth` on each side of the chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15582
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15583 Default: 0.5
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15584 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15585 _chart.outerPadding = _chart._outerRangeBandPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15586
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15587 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15588 #### .gap(gapBetweenBars)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15589 Manually set fixed gap (in px) between bars instead of relying on the default auto-generated
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15590 gap. By default the bar chart implementation will calculate and set the gap automatically
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15591 based on the number of data points and the length of the x axis.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15592
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15593 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15594 _chart.gap = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15595 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15596 return _gap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15597 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15598 _gap = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15599 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15600 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15601
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15602 _chart.extendBrush = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15603 var extent = _chart.brush().extent();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15604 if (_chart.round() && (!_centerBar || _alwaysUseRounding)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15605 extent[0] = extent.map(_chart.round())[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15606 extent[1] = extent.map(_chart.round())[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15607
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15608 _chart.chartBodyG().select('.brush')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15609 .call(_chart.brush().extent(extent));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15610 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15611
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15612 return extent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15613 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15614
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15615 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15616 #### .alwaysUseRounding([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15617 Set or get whether rounding is enabled when bars are centered. Default: false. If false, using
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15618 rounding with centered bars will result in a warning and rounding will be ignored. This flag
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15619 has no effect if bars are not centered.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15620
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15621 When using standard d3.js rounding methods, the brush often doesn't align correctly with
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15622 centered bars since the bars are offset. The rounding function must add an offset to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15623 compensate, such as in the following example.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15624 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15625 chart.round(function(n) {return Math.floor(n)+0.5});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15626 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15627 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15628 _chart.alwaysUseRounding = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15629 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15630 return _alwaysUseRounding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15631 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15632 _alwaysUseRounding = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15633 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15634 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15635
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15636 function colorFilter(color, inv) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15637 return function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15638 var item = d3.select(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15639 var match = item.attr('fill') === color;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15640 return inv ? !match : match;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15641 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15642 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15643
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15644 _chart.legendHighlight = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15645 if (!_chart.isLegendableHidden(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15646 _chart.g().selectAll('rect.bar')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15647 .classed('highlight', colorFilter(d.color))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15648 .classed('fadeout', colorFilter(d.color, true));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15649 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15650 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15651
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15652 _chart.legendReset = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15653 _chart.g().selectAll('rect.bar')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15654 .classed('highlight', false)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15655 .classed('fadeout', false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15656 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15657
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15658 dc.override(_chart, 'xAxisMax', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15659 var max = this._xAxisMax();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15660 if ('resolution' in _chart.xUnits()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15661 var res = _chart.xUnits().resolution;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15662 max += res;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15663 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15664 return max;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15665 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15666
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15667 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15668 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15669
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15670 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15671 ## Line Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15672 Includes [Stack Mixin](#stack-mixin), [Coordinate Grid Mixin](#coordinate-grid-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15673
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15674 Concrete line/area chart implementation.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15675
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15676 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15677 * [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15678 * [Canadian City Crime Stats](http://dc-js.github.com/dc.js/crime/index.html)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15679 #### dc.lineChart(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15680 Create a line chart instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15681
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15682 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15683
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15684 * parent : string | node | selection | compositeChart - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15685 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15686 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15687 If the line chart is a sub-chart in a [Composite Chart](#composite-chart) then pass in the parent composite
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15688 chart instance.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15689
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15690 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15691 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15692
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15693 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15694 A newly created line chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15695
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15696 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15697 // create a line chart under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15698 var chart1 = dc.lineChart('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15699 // create a line chart under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15700 var chart2 = dc.lineChart('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15701 // create a sub-chart under a composite parent chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15702 var chart3 = dc.lineChart(compositeChart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15703 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15704
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15705 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15706 dc.lineChart = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15707 var DEFAULT_DOT_RADIUS = 5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15708 var TOOLTIP_G_CLASS = 'dc-tooltip';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15709 var DOT_CIRCLE_CLASS = 'dot';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15710 var Y_AXIS_REF_LINE_CLASS = 'yRef';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15711 var X_AXIS_REF_LINE_CLASS = 'xRef';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15712 var DEFAULT_DOT_OPACITY = 1e-6;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15713
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15714 var _chart = dc.stackMixin(dc.coordinateGridMixin({}));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15715 var _renderArea = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15716 var _dotRadius = DEFAULT_DOT_RADIUS;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15717 var _dataPointRadius = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15718 var _dataPointFillOpacity = DEFAULT_DOT_OPACITY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15719 var _dataPointStrokeOpacity = DEFAULT_DOT_OPACITY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15720 var _interpolate = 'linear';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15721 var _tension = 0.7;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15722 var _defined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15723 var _dashStyle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15724
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15725 _chart.transitionDuration(500);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15726 _chart._rangeBandPadding(1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15727
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15728 _chart.plotData = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15729 var chartBody = _chart.chartBodyG();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15730 var layersList = chartBody.selectAll('g.stack-list');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15731
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15732 if (layersList.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15733 layersList = chartBody.append('g').attr('class', 'stack-list');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15734 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15735
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15736 var layers = layersList.selectAll('g.stack').data(_chart.data());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15737
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15738 var layersEnter = layers
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15739 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15740 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15741 .attr('class', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15742 return 'stack ' + '_' + i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15743 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15744
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15745 drawLine(layersEnter, layers);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15746
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15747 drawArea(layersEnter, layers);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15748
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15749 drawDots(chartBody, layers);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15750 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15751
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15752 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15753 #### .interpolate([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15754 Gets or sets the interpolator to use for lines drawn, by string name, allowing e.g. step
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15755 functions, splines, and cubic interpolation. This is passed to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15756 [d3.svg.line.interpolate](https://github.com/mbostock/d3/wiki/SVG-Shapes#line_interpolate) and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15757 [d3.svg.area.interpolate](https://github.com/mbostock/d3/wiki/SVG-Shapes#area_interpolate),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15758 where you can find a complete list of valid arguments
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15759 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15760 _chart.interpolate = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15761 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15762 return _interpolate;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15763 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15764 _interpolate = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15765 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15766 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15767
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15768 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15769 #### .tension([value]) Gets or sets the tension to use for lines drawn, in the range 0 to 1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15770 This parameter further customizes the interpolation behavior. It is passed to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15771 [d3.svg.line.tension](https://github.com/mbostock/d3/wiki/SVG-Shapes#line_tension) and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15772 [d3.svg.area.tension](https://github.com/mbostock/d3/wiki/SVG-Shapes#area_tension). Default:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15773 0.7
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15774 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15775 _chart.tension = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15776 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15777 return _tension;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15778 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15779 _tension = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15780 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15781 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15782
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15783 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15784 #### .defined([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15785 Gets or sets a function that will determine discontinuities in the line which should be
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15786 skipped: the path will be broken into separate subpaths if some points are undefined.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15787 This function is passed to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15788 [d3.svg.line.defined](https://github.com/mbostock/d3/wiki/SVG-Shapes#line_defined)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15789
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15790 Note: crossfilter will sometimes coerce nulls to 0, so you may need to carefully write
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15791 custom reduce functions to get this to work, depending on your data. See
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15792 https://github.com/dc-js/dc.js/issues/615#issuecomment-49089248
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15793 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15794 _chart.defined = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15795 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15796 return _defined;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15797 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15798 _defined = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15799 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15800 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15801
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15802 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15803 #### .dashStyle([array])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15804 Set the line's d3 dashstyle. This value becomes the 'stroke-dasharray' of line. Defaults to empty
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15805 array (solid line).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15806 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15807 // create a Dash Dot Dot Dot
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15808 chart.dashStyle([3,1,1,1]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15809 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15810 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15811 _chart.dashStyle = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15812 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15813 return _dashStyle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15814 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15815 _dashStyle = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15816 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15817 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15818
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15819 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15820 #### .renderArea([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15821 Get or set render area flag. If the flag is set to true then the chart will render the area
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15822 beneath each line and the line chart effectively becomes an area chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15823
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15824 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15825 _chart.renderArea = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15826 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15827 return _renderArea;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15828 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15829 _renderArea = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15830 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15831 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15832
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15833 function colors(d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15834 return _chart.getColor.call(d, d.values, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15835 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15836
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15837 function drawLine(layersEnter, layers) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15838 var line = d3.svg.line()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15839 .x(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15840 return _chart.x()(d.x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15841 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15842 .y(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15843 return _chart.y()(d.y + d.y0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15844 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15845 .interpolate(_interpolate)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15846 .tension(_tension);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15847 if (_defined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15848 line.defined(_defined);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15849 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15850
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15851 var path = layersEnter.append('path')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15852 .attr('class', 'line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15853 .attr('stroke', colors);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15854 if (_dashStyle) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15855 path.attr('stroke-dasharray', _dashStyle);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15856 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15857
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15858 dc.transition(layers.select('path.line'), _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15859 //.ease('linear')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15860 .attr('stroke', colors)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15861 .attr('d', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15862 return safeD(line(d.values));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15863 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15864 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15865
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15866 function drawArea(layersEnter, layers) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15867 if (_renderArea) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15868 var area = d3.svg.area()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15869 .x(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15870 return _chart.x()(d.x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15871 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15872 .y(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15873 return _chart.y()(d.y + d.y0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15874 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15875 .y0(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15876 return _chart.y()(d.y0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15877 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15878 .interpolate(_interpolate)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15879 .tension(_tension);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15880 if (_defined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15881 area.defined(_defined);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15882 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15883
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15884 layersEnter.append('path')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15885 .attr('class', 'area')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15886 .attr('fill', colors)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15887 .attr('d', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15888 return safeD(area(d.values));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15889 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15890
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15891 dc.transition(layers.select('path.area'), _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15892 //.ease('linear')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15893 .attr('fill', colors)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15894 .attr('d', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15895 return safeD(area(d.values));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15896 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15897 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15898 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15899
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15900 function safeD (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15901 return (!d || d.indexOf('NaN') >= 0) ? 'M0,0' : d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15902 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15903
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15904 function drawDots(chartBody, layers) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15905 if (!_chart.brushOn()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15906 var tooltipListClass = TOOLTIP_G_CLASS + '-list';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15907 var tooltips = chartBody.select('g.' + tooltipListClass);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15908
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15909 if (tooltips.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15910 tooltips = chartBody.append('g').attr('class', tooltipListClass);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15911 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15912
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15913 layers.each(function (d, layerIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15914 var points = d.values;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15915 if (_defined) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15916 points = points.filter(_defined);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15917 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15918
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15919 var g = tooltips.select('g.' + TOOLTIP_G_CLASS + '._' + layerIndex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15920 if (g.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15921 g = tooltips.append('g').attr('class', TOOLTIP_G_CLASS + ' _' + layerIndex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15922 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15923
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15924 createRefLines(g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15925
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15926 var dots = g.selectAll('circle.' + DOT_CIRCLE_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15927 .data(points, dc.pluck('x'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15928
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15929 dots.enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15930 .append('circle')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15931 .attr('class', DOT_CIRCLE_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15932 .attr('r', getDotRadius())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15933 .style('fill-opacity', _dataPointFillOpacity)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15934 .style('stroke-opacity', _dataPointStrokeOpacity)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15935 .on('mousemove', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15936 var dot = d3.select(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15937 showDot(dot);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15938 showRefLines(dot, g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15939 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15940 .on('mouseout', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15941 var dot = d3.select(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15942 hideDot(dot);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15943 hideRefLines(g);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15944 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15945
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15946 dots
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15947 .attr('cx', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15948 return dc.utils.safeNumber(_chart.x()(d.x));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15949 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15950 .attr('cy', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15951 return dc.utils.safeNumber(_chart.y()(d.y + d.y0));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15952 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15953 .attr('fill', _chart.getColor)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15954 .call(renderTitle, d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15955
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15956 dots.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15957 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15958 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15959 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15960
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15961 function createRefLines(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15962 var yRefLine = g.select('path.' + Y_AXIS_REF_LINE_CLASS).empty() ?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15963 g.append('path').attr('class', Y_AXIS_REF_LINE_CLASS) : g.select('path.' + Y_AXIS_REF_LINE_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15964 yRefLine.style('display', 'none').attr('stroke-dasharray', '5,5');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15965
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15966 var xRefLine = g.select('path.' + X_AXIS_REF_LINE_CLASS).empty() ?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15967 g.append('path').attr('class', X_AXIS_REF_LINE_CLASS) : g.select('path.' + X_AXIS_REF_LINE_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15968 xRefLine.style('display', 'none').attr('stroke-dasharray', '5,5');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15969 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15970
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15971 function showDot(dot) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15972 dot.style('fill-opacity', 0.8);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15973 dot.style('stroke-opacity', 0.8);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15974 dot.attr('r', _dotRadius);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15975 return dot;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15976 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15977
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15978 function showRefLines(dot, g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15979 var x = dot.attr('cx');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15980 var y = dot.attr('cy');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15981 var yAxisX = (_chart._yAxisX() - _chart.margins().left);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15982 var yAxisRefPathD = 'M' + yAxisX + ' ' + y + 'L' + (x) + ' ' + (y);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15983 var xAxisRefPathD = 'M' + x + ' ' + _chart.yAxisHeight() + 'L' + x + ' ' + y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15984 g.select('path.' + Y_AXIS_REF_LINE_CLASS).style('display', '').attr('d', yAxisRefPathD);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15985 g.select('path.' + X_AXIS_REF_LINE_CLASS).style('display', '').attr('d', xAxisRefPathD);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15986 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15987
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15988 function getDotRadius() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15989 return _dataPointRadius || _dotRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15990 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15991
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15992 function hideDot(dot) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15993 dot.style('fill-opacity', _dataPointFillOpacity)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15994 .style('stroke-opacity', _dataPointStrokeOpacity)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15995 .attr('r', getDotRadius());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15996 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15997
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15998 function hideRefLines(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
15999 g.select('path.' + Y_AXIS_REF_LINE_CLASS).style('display', 'none');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16000 g.select('path.' + X_AXIS_REF_LINE_CLASS).style('display', 'none');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16001 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16002
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16003 function renderTitle(dot, d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16004 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16005 dot.selectAll('title').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16006 dot.append('title').text(dc.pluck('data', _chart.title(d.name)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16007 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16008 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16009
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16010 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16011 #### .dotRadius([dotRadius])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16012 Get or set the radius (in px) for dots displayed on the data points. Default dot radius is 5.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16013 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16014 _chart.dotRadius = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16015 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16016 return _dotRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16017 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16018 _dotRadius = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16019 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16020 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16021
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16022 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16023 #### .renderDataPoints([options])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16024 Always show individual dots for each datapoint.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16025
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16026 Options, if given, is an object that can contain the following:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16027
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16028 * fillOpacity (default 0.8)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16029 * strokeOpacity (default 0.8)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16030 * radius (default 2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16031
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16032 If `options` is falsy, it disables data point rendering.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16033
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16034 If no `options` are provided, the current `options` values are instead returned.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16035
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16036 Example:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16037 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16038 chart.renderDataPoints({radius: 2, fillOpacity: 0.8, strokeOpacity: 0.8})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16039 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16040 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16041 _chart.renderDataPoints = function (options) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16042 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16043 return {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16044 fillOpacity: _dataPointFillOpacity,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16045 strokeOpacity: _dataPointStrokeOpacity,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16046 radius: _dataPointRadius
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16047 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16048 } else if (!options) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16049 _dataPointFillOpacity = DEFAULT_DOT_OPACITY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16050 _dataPointStrokeOpacity = DEFAULT_DOT_OPACITY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16051 _dataPointRadius = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16052 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16053 _dataPointFillOpacity = options.fillOpacity || 0.8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16054 _dataPointStrokeOpacity = options.strokeOpacity || 0.8;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16055 _dataPointRadius = options.radius || 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16056 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16057 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16058 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16059
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16060 function colorFilter(color, dashstyle, inv) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16061 return function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16062 var item = d3.select(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16063 var match = (item.attr('stroke') === color &&
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16064 item.attr('stroke-dasharray') === ((dashstyle instanceof Array) ?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16065 dashstyle.join(',') : null)) || item.attr('fill') === color;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16066 return inv ? !match : match;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16067 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16068 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16069
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16070 _chart.legendHighlight = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16071 if (!_chart.isLegendableHidden(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16072 _chart.g().selectAll('path.line, path.area')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16073 .classed('highlight', colorFilter(d.color, d.dashstyle))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16074 .classed('fadeout', colorFilter(d.color, d.dashstyle, true));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16075 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16076 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16077
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16078 _chart.legendReset = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16079 _chart.g().selectAll('path.line, path.area')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16080 .classed('highlight', false)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16081 .classed('fadeout', false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16082 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16083
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16084 dc.override(_chart, 'legendables', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16085 var legendables = _chart._legendables();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16086 if (!_dashStyle) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16087 return legendables;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16088 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16089 return legendables.map(function (l) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16090 l.dashstyle = _dashStyle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16091 return l;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16092 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16093 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16094
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16095 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16096 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16097
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16098 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16099 ## Data Count Widget
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16100 Includes: [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16101
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16102 The data count widget is a simple widget designed to display the number of records selected by the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16103 current filters out of the total number of records in the data set. Once created the data count widget
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16104 will automatically update the text content of the following elements under the parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16105
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16106 * '.total-count' - total number of records
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16107 * '.filter-count' - number of records matched by the current filters
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16108
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16109 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16110
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16111 * [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16112 #### dc.dataCount(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16113 Create a data count widget and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16114
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16115 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16116
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16117 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16118 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16119 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16120 * chartGroup : string (optional) - name of the chart group this widget should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16121 The data count widget will only react to filter changes in the chart group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16122
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16123 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16124 A newly created data count widget instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16125 #### .dimension(allData) - **mandatory**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16126 For the data count widget the only valid dimension is the entire data set.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16127 #### .group(groupAll) - **mandatory**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16128 For the data count widget the only valid group is the group returned by `dimension.groupAll()`.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16129
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16130 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16131 var ndx = crossfilter(data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16132 var all = ndx.groupAll();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16133
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16134 dc.dataCount('.dc-data-count')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16135 .dimension(ndx)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16136 .group(all);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16137 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16138
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16139 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16140 dc.dataCount = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16141 var _formatNumber = d3.format(',d');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16142 var _chart = dc.baseMixin({});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16143 var _html = {some:'', all:''};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16144
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16145 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16146 #### html([object])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16147 Gets or sets an optional object specifying HTML templates to use depending how many items are
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16148 selected. The text `%total-count` will replaced with the total number of records, and the text
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16149 `%filter-count` will be replaced with the number of selected records.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16150 - all: HTML template to use if all items are selected
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16151 - some: HTML template to use if not all items are selected
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16152
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16153 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16154 counter.html({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16155 some: '%filter-count out of %total-count records selected',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16156 all: 'All records selected. Click on charts to apply filters'
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16157 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16158 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16159 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16160 _chart.html = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16161 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16162 return _html;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16163 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16164 if (s.all) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16165 _html.all = s.all;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16166 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16167 if (s.some) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16168 _html.some = s.some;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16169 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16170 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16171 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16172
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16173 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16174 #### formatNumber([formatter])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16175 Gets or sets an optional function to format the filter count and total count.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16176
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16177 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16178 counter.formatNumber(d3.format('.2g'))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16179 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16180 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16181 _chart.formatNumber = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16182 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16183 return _formatNumber;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16184 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16185 _formatNumber = s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16186 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16187 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16188
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16189 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16190 var tot = _chart.dimension().size(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16191 val = _chart.group().value();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16192 var all = _formatNumber(tot);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16193 var selected = _formatNumber(val);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16194
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16195 if ((tot === val) && (_html.all !== '')) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16196 _chart.root().html(_html.all.replace('%total-count', all).replace('%filter-count', selected));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16197 } else if (_html.some !== '') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16198 _chart.root().html(_html.some.replace('%total-count', all).replace('%filter-count', selected));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16199 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16200 _chart.selectAll('.total-count').text(all);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16201 _chart.selectAll('.filter-count').text(selected);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16202 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16203 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16204 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16205
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16206 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16207 return _chart._doRender();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16208 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16209
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16210 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16211 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16212
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16213 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16214 ## Data Table Widget
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16215 Includes: [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16216
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16217 The data table is a simple widget designed to list crossfilter focused data set (rows being
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16218 filtered) in a good old tabular fashion.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16219
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16220 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16221 * [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16222 #### dc.dataTable(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16223 Create a data table widget instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16224
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16225 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16226 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16227 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16228 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16229
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16230 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16231 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16232
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16233 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16234 A newly created data table widget instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16235
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16236 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16237 dc.dataTable = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16238 var LABEL_CSS_CLASS = 'dc-table-label';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16239 var ROW_CSS_CLASS = 'dc-table-row';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16240 var COLUMN_CSS_CLASS = 'dc-table-column';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16241 var GROUP_CSS_CLASS = 'dc-table-group';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16242 var HEAD_CSS_CLASS = 'dc-table-head';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16243
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16244 var _chart = dc.baseMixin({});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16245
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16246 var _size = 25;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16247 var _columns = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16248 var _sortBy = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16249 return d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16250 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16251 var _order = d3.ascending;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16252
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16253 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16254 _chart.selectAll('tbody').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16255
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16256 renderRows(renderGroups());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16257
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16258 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16259 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16260
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16261 _chart._doColumnValueFormat = function (v, d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16262 return ((typeof v === 'function') ?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16263 v(d) : // v as function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16264 ((typeof v === 'string') ?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16265 d[v] : // v is field name string
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16266 v.format(d) // v is Object, use fn (element 2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16267 )
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16268 );
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16269 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16270
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16271 _chart._doColumnHeaderFormat = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16272 // if 'function', convert to string representation
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16273 // show a string capitalized
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16274 // if an object then display it's label string as-is.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16275 return (typeof d === 'function') ?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16276 _chart._doColumnHeaderFnToString(d) :
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16277 ((typeof d === 'string') ?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16278 _chart._doColumnHeaderCapitalize(d) : String(d.label));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16279 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16280
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16281 _chart._doColumnHeaderCapitalize = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16282 // capitalize
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16283 return s.charAt(0).toUpperCase() + s.slice(1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16284 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16285
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16286 _chart._doColumnHeaderFnToString = function (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16287 // columnString(f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16288 var s = String(f);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16289 var i1 = s.indexOf('return ');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16290 if (i1 >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16291 var i2 = s.lastIndexOf(';');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16292 if (i2 >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16293 s = s.substring(i1 + 7, i2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16294 var i3 = s.indexOf('numberFormat');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16295 if (i3 >= 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16296 s = s.replace('numberFormat', '');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16297 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16298 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16299 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16300 return s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16301 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16302
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16303 function renderGroups() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16304 // The 'original' example uses all 'functions'.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16305 // If all 'functions' are used, then don't remove/add a header, and leave
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16306 // the html alone. This preserves the functionality of earlier releases.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16307 // A 2nd option is a string representing a field in the data.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16308 // A third option is to supply an Object such as an array of 'information', and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16309 // supply your own _doColumnHeaderFormat and _doColumnValueFormat functions to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16310 // create what you need.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16311 var bAllFunctions = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16312 _columns.forEach(function (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16313 bAllFunctions = bAllFunctions & (typeof f === 'function');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16314 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16315
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16316 if (!bAllFunctions) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16317 _chart.selectAll('th').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16318 var headcols = _chart.root().selectAll('th')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16319 .data(_columns);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16320
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16321 var headGroup = headcols
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16322 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16323 .append('th');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16324
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16325 headGroup
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16326 .attr('class', HEAD_CSS_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16327 .html(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16328 return (_chart._doColumnHeaderFormat(d));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16329
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16330 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16331 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16332
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16333 var groups = _chart.root().selectAll('tbody')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16334 .data(nestEntries(), function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16335 return _chart.keyAccessor()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16336 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16337
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16338 var rowGroup = groups
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16339 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16340 .append('tbody');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16341
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16342 rowGroup
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16343 .append('tr')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16344 .attr('class', GROUP_CSS_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16345 .append('td')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16346 .attr('class', LABEL_CSS_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16347 .attr('colspan', _columns.length)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16348 .html(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16349 return _chart.keyAccessor()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16350 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16351
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16352 groups.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16353
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16354 return rowGroup;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16355 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16356
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16357 function nestEntries() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16358 var entries;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16359 if (_order === d3.ascending) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16360 entries = _chart.dimension().bottom(_size);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16361 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16362 entries = _chart.dimension().top(_size);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16363 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16364
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16365 return d3.nest()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16366 .key(_chart.group())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16367 .sortKeys(_order)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16368 .entries(entries.sort(function (a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16369 return _order(_sortBy(a), _sortBy(b));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16370 }));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16371 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16372
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16373 function renderRows(groups) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16374 var rows = groups.order()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16375 .selectAll('tr.' + ROW_CSS_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16376 .data(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16377 return d.values;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16378 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16379
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16380 var rowEnter = rows.enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16381 .append('tr')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16382 .attr('class', ROW_CSS_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16383
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16384 _columns.forEach(function (v, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16385 rowEnter.append('td')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16386 .attr('class', COLUMN_CSS_CLASS + ' _' + i)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16387 .html(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16388 return _chart._doColumnValueFormat(v, d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16389 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16390 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16391
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16392 rows.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16393
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16394 return rows;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16395 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16396
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16397 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16398 return _chart._doRender();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16399 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16400
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16401 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16402 #### .size([size])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16403 Get or set the table size which determines the number of rows displayed by the widget.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16404
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16405 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16406 _chart.size = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16407 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16408 return _size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16409 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16410 _size = s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16411 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16412 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16413
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16414 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16415 #### .columns([columnFunctionArray])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16416 Get or set column functions. The data table widget now supports several methods of specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16417 the columns to display. The original method, first shown below, uses an array of functions to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16418 generate dynamic columns. Column functions are simple javascript functions with only one input
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16419 argument `d` which represents a row in the data set. The return value of these functions will be
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16420 used directly to generate table content for each cell. However, this method requires the .html
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16421 table entry to have a fixed set of column headers.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16422
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16423 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16424 chart.columns([
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16425 function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16426 return d.date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16427 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16428 function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16429 return d.open;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16430 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16431 function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16432 return d.close;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16433 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16434 function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16435 return numberFormat(d.close - d.open);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16436 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16437 function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16438 return d.volume;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16439 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16440 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16441 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16442
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16443 The next example shows you can simply list the data (d) content directly without
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16444 specifying it as a function, except where necessary (ie, computed columns). Note
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16445 the data element accessor name is capitalized when displayed in the table. You can
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16446 also mix in functions as desired or necessary, but you must use the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16447 Object = [Label, Fn] method as shown below.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16448 You may wish to override the following two functions, which are internally used to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16449 translate the column information or function into a displayed header. The first one
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16450 is used on the simple "string" column specifier, the second is used to transform the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16451 String(fn) into something displayable. For the Stock example, the function for Change
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16452 becomes a header of 'd.close - d.open'.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16453 _chart._doColumnHeaderCapitalize _chart._doColumnHeaderFnToString
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16454 You may use your own Object definition, however you must then override
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16455 _chart._doColumnHeaderFormat , _chart._doColumnValueFormat
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16456 Be aware that fields without numberFormat specification will be displayed just as
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16457 they are stored in the data, unformatted.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16458 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16459 chart.columns([
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16460 "date", // d["date"], ie, a field accessor; capitalized automatically
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16461 "open", // ...
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16462 "close", // ...
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16463 ["Change", // Specify an Object = [Label, Fn]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16464 function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16465 return numberFormat(d.close - d.open);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16466 }],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16467 "volume" // d["volume"], ie, a field accessor; capitalized automatically
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16468 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16469 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16470
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16471 A third example, where all fields are specified using the Object = [Label, Fn] method.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16472
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16473 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16474 chart.columns([
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16475 ["Date", // Specify an Object = [Label, Fn]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16476 function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16477 return d.date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16478 }],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16479 ["Open",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16480 function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16481 return numberFormat(d.open);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16482 }],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16483 ["Close",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16484 function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16485 return numberFormat(d.close);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16486 }],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16487 ["Change",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16488 function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16489 return numberFormat(d.close - d.open);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16490 }],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16491 ["Volume",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16492 function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16493 return d.volume;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16494 }]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16495 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16496 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16497
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16498 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16499 _chart.columns = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16500 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16501 return _columns;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16502 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16503 _columns = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16504 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16505 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16506
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16507 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16508 #### .sortBy([sortByFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16509 Get or set sort-by function. This function works as a value accessor at row level and returns a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16510 particular field to be sorted by. Default value: identity function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16511
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16512 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16513 chart.sortBy(function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16514 return d.date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16515 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16516 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16517
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16518 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16519 _chart.sortBy = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16520 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16521 return _sortBy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16522 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16523 _sortBy = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16524 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16525 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16526
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16527 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16528 #### .order([order])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16529 Get or set sort order. Default value: ``` d3.ascending ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16530
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16531 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16532 chart.order(d3.descending);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16533 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16534
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16535 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16536 _chart.order = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16537 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16538 return _order;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16539 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16540 _order = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16541 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16542 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16543
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16544 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16545 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16546
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16547 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16548 ## Data Grid Widget
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16549
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16550 Includes: [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16551
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16552 Data grid is a simple widget designed to list the filtered records, providing
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16553 a simple way to define how the items are displayed.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16554
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16555 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16556 * [List of members of the european parliament](http://europarl.me/dc.js/web/ep/index.html)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16557
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16558 #### dc.dataGrid(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16559 Create a data grid widget instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16560
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16561 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16562 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16563 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16564 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16565
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16566 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16567 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16568
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16569 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16570 A newly created data grid widget instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16571
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16572 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16573 dc.dataGrid = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16574 var LABEL_CSS_CLASS = 'dc-grid-label';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16575 var ITEM_CSS_CLASS = 'dc-grid-item';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16576 var GROUP_CSS_CLASS = 'dc-grid-group';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16577 var GRID_CSS_CLASS = 'dc-grid-top';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16578
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16579 var _chart = dc.baseMixin({});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16580
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16581 var _size = 999; // shouldn't be needed, but you might
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16582 var _html = function (d) { return 'you need to provide an html() handling param: ' + JSON.stringify(d); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16583 var _sortBy = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16584 return d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16585 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16586 var _order = d3.ascending;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16587
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16588 var _htmlGroup = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16589 return '<div class=\'' + GROUP_CSS_CLASS + '\'><h1 class=\'' + LABEL_CSS_CLASS + '\'>' +
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16590 _chart.keyAccessor()(d) + '</h1></div>';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16591 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16592
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16593 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16594 _chart.selectAll('div.' + GRID_CSS_CLASS).remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16595
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16596 renderItems(renderGroups());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16597
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16598 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16599 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16600
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16601 function renderGroups() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16602 var groups = _chart.root().selectAll('div.' + GRID_CSS_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16603 .data(nestEntries(), function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16604 return _chart.keyAccessor()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16605 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16606
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16607 var itemGroup = groups
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16608 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16609 .append('div')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16610 .attr('class', GRID_CSS_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16611
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16612 if (_htmlGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16613 itemGroup
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16614 .html(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16615 return _htmlGroup(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16616 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16617 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16618
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16619 groups.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16620 return itemGroup;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16621 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16622
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16623 function nestEntries() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16624 var entries = _chart.dimension().top(_size);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16625
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16626 return d3.nest()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16627 .key(_chart.group())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16628 .sortKeys(_order)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16629 .entries(entries.sort(function (a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16630 return _order(_sortBy(a), _sortBy(b));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16631 }));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16632 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16633
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16634 function renderItems(groups) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16635 var items = groups.order()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16636 .selectAll('div.' + ITEM_CSS_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16637 .data(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16638 return d.values;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16639 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16640
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16641 items.enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16642 .append('div')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16643 .attr('class', ITEM_CSS_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16644 .html(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16645 return _html(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16646 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16647
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16648 items.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16649
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16650 return items;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16651 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16652
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16653 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16654 return _chart._doRender();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16655 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16656
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16657 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16658 #### .size([size])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16659 Get or set the grid size which determines the number of items displayed by the widget.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16660
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16661 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16662 _chart.size = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16663 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16664 return _size;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16665 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16666 _size = s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16667 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16668 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16669
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16670 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16671 #### .html( function (data) { return '<html>'; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16672 Get or set the function that formats an item. The data grid widget uses a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16673 function to generate dynamic html. Use your favourite templating engine or
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16674 generate the string directly.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16675 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16676 chart.html(function (d) { return '<div class='item '+data.exampleCategory+''>'+data.exampleString+'</div>';});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16677 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16678
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16679 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16680 _chart.html = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16681 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16682 return _html;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16683 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16684 _html = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16685 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16686 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16687
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16688 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16689 #### .htmlGroup( function (data) { return '<html>'; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16690 Get or set the function that formats a group label.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16691 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16692 chart.htmlGroup (function (d) { return '<h2>'.d.key . 'with ' . d.values.length .' items</h2>'});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16693 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16694
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16695 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16696 _chart.htmlGroup = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16697 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16698 return _htmlGroup;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16699 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16700 _htmlGroup = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16701 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16702 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16703
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16704 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16705 #### .sortBy([sortByFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16706 Get or set sort-by function. This function works as a value accessor at the item
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16707 level and returns a particular field to be sorted.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16708 by. Default: identity function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16709
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16710 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16711 chart.sortBy(function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16712 return d.date;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16713 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16714 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16715
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16716 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16717 _chart.sortBy = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16718 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16719 return _sortBy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16720 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16721 _sortBy = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16722 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16723 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16724
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16725 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16726 #### .order([order])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16727 Get or set sort order function. Default value: ``` d3.ascending ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16728
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16729 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16730 chart.order(d3.descending);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16731 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16732
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16733 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16734 _chart.order = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16735 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16736 return _order;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16737 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16738 _order = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16739 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16740 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16741
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16742 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16743 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16744
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16745 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16746 ## Bubble Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16747 Includes: [Bubble Mixin](#bubble-mixin), [Coordinate Grid Mixin](#coordinate-grid-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16748
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16749 A concrete implementation of a general purpose bubble chart that allows data visualization using the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16750 following dimensions:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16751
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16752 * x axis position
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16753 * y axis position
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16754 * bubble radius
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16755 * color
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16756
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16757 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16758 * [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16759 * [US Venture Capital Landscape 2011](http://dc-js.github.com/dc.js/vc/index.html)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16760 #### dc.bubbleChart(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16761 Create a bubble chart instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16762
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16763 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16764 * parent : string | node | selection | compositeChart - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16765 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16766 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16767 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16768 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16769
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16770 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16771 A newly created bubble chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16772
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16773 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16774 // create a bubble chart under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16775 var bubbleChart1 = dc.bubbleChart('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16776 // create a bubble chart under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16777 var bubbleChart2 = dc.bubbleChart('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16778 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16779
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16780 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16781 dc.bubbleChart = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16782 var _chart = dc.bubbleMixin(dc.coordinateGridMixin({}));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16783
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16784 var _elasticRadius = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16785
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16786 _chart.transitionDuration(750);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16787
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16788 var bubbleLocator = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16789 return 'translate(' + (bubbleX(d)) + ',' + (bubbleY(d)) + ')';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16790 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16791
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16792 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16793 #### .elasticRadius([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16794 Turn on or off the elastic bubble radius feature, or return the value of the flag. If this
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16795 feature is turned on, then bubble radii will be automatically rescaled to fit the chart better.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16796
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16797 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16798 _chart.elasticRadius = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16799 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16800 return _elasticRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16801 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16802 _elasticRadius = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16803 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16804 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16805
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16806 _chart.plotData = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16807 if (_elasticRadius) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16808 _chart.r().domain([_chart.rMin(), _chart.rMax()]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16809 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16810
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16811 _chart.r().range([_chart.MIN_RADIUS, _chart.xAxisLength() * _chart.maxBubbleRelativeSize()]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16812
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16813 var bubbleG = _chart.chartBodyG().selectAll('g.' + _chart.BUBBLE_NODE_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16814 .data(_chart.data(), function (d) { return d.key; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16815
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16816 renderNodes(bubbleG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16817
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16818 updateNodes(bubbleG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16819
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16820 removeNodes(bubbleG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16821
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16822 _chart.fadeDeselectedArea();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16823 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16824
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16825 function renderNodes(bubbleG) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16826 var bubbleGEnter = bubbleG.enter().append('g');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16827
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16828 bubbleGEnter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16829 .attr('class', _chart.BUBBLE_NODE_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16830 .attr('transform', bubbleLocator)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16831 .append('circle').attr('class', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16832 return _chart.BUBBLE_CLASS + ' _' + i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16833 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16834 .on('click', _chart.onClick)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16835 .attr('fill', _chart.getColor)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16836 .attr('r', 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16837 dc.transition(bubbleG, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16838 .selectAll('circle.' + _chart.BUBBLE_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16839 .attr('r', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16840 return _chart.bubbleR(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16841 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16842 .attr('opacity', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16843 return (_chart.bubbleR(d) > 0) ? 1 : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16844 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16845
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16846 _chart._doRenderLabel(bubbleGEnter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16847
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16848 _chart._doRenderTitles(bubbleGEnter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16849 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16850
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16851 function updateNodes(bubbleG) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16852 dc.transition(bubbleG, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16853 .attr('transform', bubbleLocator)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16854 .selectAll('circle.' + _chart.BUBBLE_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16855 .attr('fill', _chart.getColor)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16856 .attr('r', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16857 return _chart.bubbleR(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16858 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16859 .attr('opacity', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16860 return (_chart.bubbleR(d) > 0) ? 1 : 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16861 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16862
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16863 _chart.doUpdateLabels(bubbleG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16864 _chart.doUpdateTitles(bubbleG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16865 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16866
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16867 function removeNodes(bubbleG) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16868 bubbleG.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16869 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16870
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16871 function bubbleX(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16872 var x = _chart.x()(_chart.keyAccessor()(d));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16873 if (isNaN(x)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16874 x = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16875 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16876 return x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16877 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16878
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16879 function bubbleY(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16880 var y = _chart.y()(_chart.valueAccessor()(d));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16881 if (isNaN(y)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16882 y = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16883 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16884 return y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16885 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16886
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16887 _chart.renderBrush = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16888 // override default x axis brush from parent chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16889 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16890
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16891 _chart.redrawBrush = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16892 // override default x axis brush from parent chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16893 _chart.fadeDeselectedArea();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16894 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16895
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16896 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16897 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16898
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16899 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16900 ## Composite Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16901 Includes: [Coordinate Grid Mixin](#coordinate-grid-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16902
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16903 Composite charts are a special kind of chart that render multiple charts on the same Coordinate
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16904 Grid. You can overlay (compose) different bar/line/area charts in a single composite chart to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16905 achieve some quite flexible charting effects.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16906 #### dc.compositeChart(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16907 Create a composite chart instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16908
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16909 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16910 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16911 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16912 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16913 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16914 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16915
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16916 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16917 A newly created composite chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16918
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16919 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16920 // create a composite chart under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16921 var compositeChart1 = dc.compositeChart('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16922 // create a composite chart under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16923 var compositeChart2 = dc.compositeChart('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16924 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16925
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16926 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16927 dc.compositeChart = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16928
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16929 var SUB_CHART_CLASS = 'sub';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16930 var DEFAULT_RIGHT_Y_AXIS_LABEL_PADDING = 12;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16931
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16932 var _chart = dc.coordinateGridMixin({});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16933 var _children = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16934
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16935 var _childOptions = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16936
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16937 var _shareColors = false,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16938 _shareTitle = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16939
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16940 var _rightYAxis = d3.svg.axis(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16941 _rightYAxisLabel = 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16942 _rightYAxisLabelPadding = DEFAULT_RIGHT_Y_AXIS_LABEL_PADDING,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16943 _rightY,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16944 _rightAxisGridLines = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16945
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16946 _chart._mandatoryAttributes([]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16947 _chart.transitionDuration(500);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16948
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16949 dc.override(_chart, '_generateG', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16950 var g = this.__generateG();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16951
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16952 for (var i = 0; i < _children.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16953 var child = _children[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16954
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16955 generateChildG(child, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16956
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16957 if (!child.dimension()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16958 child.dimension(_chart.dimension());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16959 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16960 if (!child.group()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16961 child.group(_chart.group());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16962 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16963
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16964 child.chartGroup(_chart.chartGroup());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16965 child.svg(_chart.svg());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16966 child.xUnits(_chart.xUnits());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16967 child.transitionDuration(_chart.transitionDuration());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16968 child.brushOn(_chart.brushOn());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16969 child.renderTitle(_chart.renderTitle());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16970 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16971
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16972 return g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16973 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16974
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16975 _chart._brushing = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16976 var extent = _chart.extendBrush();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16977 var brushIsEmpty = _chart.brushIsEmpty(extent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16978
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16979 for (var i = 0; i < _children.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16980 _children[i].filter(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16981 if (!brushIsEmpty) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16982 _children[i].filter(extent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16983 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16984 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16985 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16986
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16987 _chart._prepareYAxis = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16988 if (leftYAxisChildren().length !== 0) { prepareLeftYAxis(); }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16989 if (rightYAxisChildren().length !== 0) { prepareRightYAxis(); }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16990
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16991 if (leftYAxisChildren().length > 0 && !_rightAxisGridLines) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16992 _chart._renderHorizontalGridLinesForAxis(_chart.g(), _chart.y(), _chart.yAxis());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16993 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16994 else if (rightYAxisChildren().length > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16995 _chart._renderHorizontalGridLinesForAxis(_chart.g(), _rightY, _rightYAxis);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16996 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16997 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16998
89592faa2875 Uploaded
chrisb
parents:
diff changeset
16999 _chart.renderYAxis = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17000 if (leftYAxisChildren().length !== 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17001 _chart.renderYAxisAt('y', _chart.yAxis(), _chart.margins().left);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17002 _chart.renderYAxisLabel('y', _chart.yAxisLabel(), -90);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17003 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17004
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17005 if (rightYAxisChildren().length !== 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17006 _chart.renderYAxisAt('yr', _chart.rightYAxis(), _chart.width() - _chart.margins().right);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17007 _chart.renderYAxisLabel('yr', _chart.rightYAxisLabel(), 90, _chart.width() - _rightYAxisLabelPadding);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17008 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17009 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17010
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17011 function prepareRightYAxis() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17012 if (_chart.rightY() === undefined || _chart.elasticY()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17013 _chart.rightY(d3.scale.linear());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17014 _chart.rightY().domain([rightYAxisMin(), rightYAxisMax()]).rangeRound([_chart.yAxisHeight(), 0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17015 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17016
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17017 _chart.rightY().range([_chart.yAxisHeight(), 0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17018 _chart.rightYAxis(_chart.rightYAxis().scale(_chart.rightY()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17019
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17020 _chart.rightYAxis().orient('right');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17021 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17022
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17023 function prepareLeftYAxis() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17024 if (_chart.y() === undefined || _chart.elasticY()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17025 _chart.y(d3.scale.linear());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17026 _chart.y().domain([yAxisMin(), yAxisMax()]).rangeRound([_chart.yAxisHeight(), 0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17027 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17028
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17029 _chart.y().range([_chart.yAxisHeight(), 0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17030 _chart.yAxis(_chart.yAxis().scale(_chart.y()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17031
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17032 _chart.yAxis().orient('left');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17033 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17034
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17035 function generateChildG(child, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17036 child._generateG(_chart.g());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17037 child.g().attr('class', SUB_CHART_CLASS + ' _' + i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17038 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17039
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17040 _chart.plotData = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17041 for (var i = 0; i < _children.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17042 var child = _children[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17043
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17044 if (!child.g()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17045 generateChildG(child, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17046 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17047
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17048 if (_shareColors) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17049 child.colors(_chart.colors());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17050 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17051
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17052 child.x(_chart.x());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17053
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17054 child.xAxis(_chart.xAxis());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17055
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17056 if (child.useRightYAxis()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17057 child.y(_chart.rightY());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17058 child.yAxis(_chart.rightYAxis());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17059 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17060 else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17061 child.y(_chart.y());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17062 child.yAxis(_chart.yAxis());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17063 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17064
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17065 child.plotData();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17066
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17067 child._activateRenderlets();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17068 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17069 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17070
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17071 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17072 #### .useRightAxisGridLines(bool)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17073 Get or set whether to draw gridlines from the right y axis. Drawing from the left y axis is the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17074 default behavior. This option is only respected when subcharts with both left and right y-axes
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17075 are present.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17076 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17077 _chart.useRightAxisGridLines = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17078 if (!arguments) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17079 return _rightAxisGridLines;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17080 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17081
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17082 _rightAxisGridLines = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17083 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17084 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17085
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17086 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17087 #### .childOptions({object})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17088 Get or set chart-specific options for all child charts. This is equivalent to calling `.options`
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17089 on each child chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17090 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17091 _chart.childOptions = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17092 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17093 return _childOptions;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17094 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17095 _childOptions = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17096 _children.forEach(function (child) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17097 child.options(_childOptions);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17098 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17099 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17100 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17101
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17102 _chart.fadeDeselectedArea = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17103 for (var i = 0; i < _children.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17104 var child = _children[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17105 child.brush(_chart.brush());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17106 child.fadeDeselectedArea();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17107 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17108 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17109
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17110 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17111 #### .rightYAxisLabel([labelText])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17112 Set or get the right y axis label.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17113 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17114 _chart.rightYAxisLabel = function (_, padding) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17115 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17116 return _rightYAxisLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17117 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17118 _rightYAxisLabel = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17119 _chart.margins().right -= _rightYAxisLabelPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17120 _rightYAxisLabelPadding = (padding === undefined) ? DEFAULT_RIGHT_Y_AXIS_LABEL_PADDING : padding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17121 _chart.margins().right += _rightYAxisLabelPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17122 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17123 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17124
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17125 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17126 #### .compose(subChartArray)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17127 Combine the given charts into one single composite coordinate grid chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17128
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17129 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17130 // compose the given charts in the array into one single composite chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17131 moveChart.compose([
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17132 // when creating sub-chart you need to pass in the parent chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17133 dc.lineChart(moveChart)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17134 .group(indexAvgByMonthGroup) // if group is missing then parent's group will be used
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17135 .valueAccessor(function (d){return d.value.avg;})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17136 // most of the normal functions will continue to work in a composed chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17137 .renderArea(true)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17138 .stack(monthlyMoveGroup, function (d){return d.value;})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17139 .title(function (d){
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17140 var value = d.value.avg?d.value.avg:d.value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17141 if(isNaN(value)) value = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17142 return dateFormat(d.key) + '\n' + numberFormat(value);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17143 }),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17144 dc.barChart(moveChart)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17145 .group(volumeByMonthGroup)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17146 .centerBar(true)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17147 ]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17148 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17149
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17150 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17151 _chart.compose = function (charts) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17152 _children = charts;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17153 _children.forEach(function (child) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17154 child.height(_chart.height());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17155 child.width(_chart.width());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17156 child.margins(_chart.margins());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17157
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17158 if (_shareTitle) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17159 child.title(_chart.title());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17160 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17161
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17162 child.options(_childOptions);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17163 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17164 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17165 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17166
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17167 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17168 #### .children()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17169 Returns the child charts which are composed into the composite chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17170 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17171
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17172 _chart.children = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17173 return _children;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17174 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17175
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17176 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17177 #### .shareColors([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17178 Get or set color sharing for the chart. If set, the `.colors()` value from this chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17179 will be shared with composed children. Additionally if the child chart implements
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17180 Stackable and has not set a custom .colorAccessor, then it will generate a color
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17181 specific to its order in the composition.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17182 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17183 _chart.shareColors = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17184 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17185 return _shareColors;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17186 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17187 _shareColors = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17188 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17189 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17190
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17191 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17192 #### .shareTitle([[boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17193 Get or set title sharing for the chart. If set, the `.title()` value from this chart will be
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17194 shared with composed children. Default value is true.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17195 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17196 _chart.shareTitle = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17197 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17198 return _shareTitle;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17199 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17200 _shareTitle = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17201 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17202 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17203
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17204 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17205 #### .rightY([yScale])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17206 Get or set the y scale for the right axis. The right y scale is typically automatically
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17207 generated by the chart implementation.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17208
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17209 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17210 _chart.rightY = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17211 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17212 return _rightY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17213 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17214 _rightY = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17215 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17216 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17217
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17218 function leftYAxisChildren() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17219 return _children.filter(function (child) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17220 return !child.useRightYAxis();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17221 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17222 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17223
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17224 function rightYAxisChildren() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17225 return _children.filter(function (child) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17226 return child.useRightYAxis();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17227 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17228 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17229
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17230 function getYAxisMin(charts) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17231 return charts.map(function (c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17232 return c.yAxisMin();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17233 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17234 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17235
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17236 delete _chart.yAxisMin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17237 function yAxisMin() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17238 return d3.min(getYAxisMin(leftYAxisChildren()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17239 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17240
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17241 function rightYAxisMin() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17242 return d3.min(getYAxisMin(rightYAxisChildren()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17243 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17244
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17245 function getYAxisMax(charts) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17246 return charts.map(function (c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17247 return c.yAxisMax();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17248 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17249 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17250
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17251 delete _chart.yAxisMax;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17252 function yAxisMax() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17253 return dc.utils.add(d3.max(getYAxisMax(leftYAxisChildren())), _chart.yAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17254 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17255
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17256 function rightYAxisMax() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17257 return dc.utils.add(d3.max(getYAxisMax(rightYAxisChildren())), _chart.yAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17258 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17259
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17260 function getAllXAxisMinFromChildCharts() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17261 return _children.map(function (c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17262 return c.xAxisMin();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17263 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17264 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17265
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17266 dc.override(_chart, 'xAxisMin', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17267 return dc.utils.subtract(d3.min(getAllXAxisMinFromChildCharts()), _chart.xAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17268 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17269
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17270 function getAllXAxisMaxFromChildCharts() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17271 return _children.map(function (c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17272 return c.xAxisMax();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17273 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17274 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17275
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17276 dc.override(_chart, 'xAxisMax', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17277 return dc.utils.add(d3.max(getAllXAxisMaxFromChildCharts()), _chart.xAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17278 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17279
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17280 _chart.legendables = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17281 return _children.reduce(function (items, child) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17282 if (_shareColors) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17283 child.colors(_chart.colors());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17284 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17285 items.push.apply(items, child.legendables());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17286 return items;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17287 }, []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17288 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17289
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17290 _chart.legendHighlight = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17291 for (var j = 0; j < _children.length; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17292 var child = _children[j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17293 child.legendHighlight(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17294 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17295 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17296
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17297 _chart.legendReset = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17298 for (var j = 0; j < _children.length; ++j) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17299 var child = _children[j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17300 child.legendReset(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17301 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17302 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17303
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17304 _chart.legendToggle = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17305 console.log('composite should not be getting legendToggle itself');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17306 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17307
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17308 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17309 #### .rightYAxis([yAxis])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17310 Set or get the right y axis used by the composite chart. This function is most useful when y
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17311 axis customization is required. The y axis in dc.js is an instance of a [d3 axis
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17312 object](https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-_axis) therefore it supports any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17313 d3 axis manipulation. **Caution**: The y axis is usually generated internally by dc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17314 resetting it may cause unexpected results.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17315 ```jså
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17316 // customize y axis tick format
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17317 chart.rightYAxis().tickFormat(function (v) {return v + '%';});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17318 // customize y axis tick values
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17319 chart.rightYAxis().tickValues([0, 100, 200, 300]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17320 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17321
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17322 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17323 _chart.rightYAxis = function (rightYAxis) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17324 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17325 return _rightYAxis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17326 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17327 _rightYAxis = rightYAxis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17328 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17329 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17330
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17331 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17332 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17333
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17334 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17335 ## Series Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17336
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17337 Includes: [Composite Chart](#composite chart)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17338
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17339 A series chart is a chart that shows multiple series of data overlaid on one chart, where the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17340 series is specified in the data. It is a specialization of Composite Chart and inherits all
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17341 composite features other than recomposing the chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17342
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17343 #### dc.seriesChart(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17344 Create a series chart instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17345
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17346 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17347 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17348 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17349 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17350
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17351 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17352 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17353
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17354 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17355 A newly created series chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17356
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17357 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17358 // create a series chart under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17359 var seriesChart1 = dc.seriesChart("#chart-container1");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17360 // create a series chart under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17361 var seriesChart2 = dc.seriesChart("#chart-container2", "chartGroupA");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17362 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17363
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17364 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17365 dc.seriesChart = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17366 var _chart = dc.compositeChart(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17367
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17368 function keySort(a, b) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17369 return d3.ascending(_chart.keyAccessor()(a), _chart.keyAccessor()(b));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17370 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17371
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17372 var _charts = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17373 var _chartFunction = dc.lineChart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17374 var _seriesAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17375 var _seriesSort = d3.ascending;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17376 var _valueSort = keySort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17377
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17378 _chart._mandatoryAttributes().push('seriesAccessor', 'chart');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17379 _chart.shareColors(true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17380
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17381 _chart._preprocessData = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17382 var keep = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17383 var childrenChanged;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17384 var nester = d3.nest().key(_seriesAccessor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17385 if (_seriesSort) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17386 nester.sortKeys(_seriesSort);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17387 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17388 if (_valueSort) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17389 nester.sortValues(_valueSort);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17390 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17391 var nesting = nester.entries(_chart.data());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17392 var children =
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17393 nesting.map(function (sub, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17394 var subChart = _charts[sub.key] || _chartFunction.call(_chart, _chart, chartGroup, sub.key, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17395 if (!_charts[sub.key]) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17396 childrenChanged = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17397 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17398 _charts[sub.key] = subChart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17399 keep.push(sub.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17400 return subChart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17401 .dimension(_chart.dimension())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17402 .group({all:d3.functor(sub.values)}, sub.key)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17403 .keyAccessor(_chart.keyAccessor())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17404 .valueAccessor(_chart.valueAccessor())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17405 .brushOn(_chart.brushOn());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17406 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17407 // this works around the fact compositeChart doesn't really
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17408 // have a removal interface
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17409 Object.keys(_charts)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17410 .filter(function (c) {return keep.indexOf(c) === -1;})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17411 .forEach(function (c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17412 clearChart(c);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17413 childrenChanged = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17414 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17415 _chart._compose(children);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17416 if (childrenChanged && _chart.legend()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17417 _chart.legend().render();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17418 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17419 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17420
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17421 function clearChart(c) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17422 if (_charts[c].g()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17423 _charts[c].g().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17424 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17425 delete _charts[c];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17426 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17427
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17428 function resetChildren() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17429 Object.keys(_charts).map(clearChart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17430 _charts = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17431 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17432
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17433 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17434 #### .chart([function])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17435 Get or set the chart function, which generates the child charts. Default: dc.lineChart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17436
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17437 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17438 // put interpolation on the line charts used for the series
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17439 chart.chart(function(c) { return dc.lineChart(c).interpolate('basis'); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17440 // do a scatter series chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17441 chart.chart(dc.scatterPlot)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17442 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17443
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17444 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17445 _chart.chart = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17446 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17447 return _chartFunction;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17448 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17449 _chartFunction = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17450 resetChildren();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17451 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17452 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17453
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17454 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17455 #### .seriesAccessor([accessor])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17456 Get or set accessor function for the displayed series. Given a datum, this function
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17457 should return the series that datum belongs to.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17458 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17459 _chart.seriesAccessor = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17460 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17461 return _seriesAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17462 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17463 _seriesAccessor = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17464 resetChildren();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17465 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17466 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17467
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17468 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17469 #### .seriesSort([sortFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17470 Get or set a function to sort the list of series by, given series values.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17471
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17472 Example:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17473 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17474 chart.seriesSort(d3.descending);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17475 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17476 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17477 _chart.seriesSort = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17478 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17479 return _seriesSort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17480 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17481 _seriesSort = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17482 resetChildren();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17483 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17484 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17485
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17486 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17487 #### .valueSort([sortFunction])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17488 Get or set a function to sort each series values by. By default this is the key accessor which,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17489 for example, will ensure a lineChart series connects its points in increasing key/x order,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17490 rather than haphazardly.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17491 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17492 _chart.valueSort = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17493 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17494 return _valueSort;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17495 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17496 _valueSort = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17497 resetChildren();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17498 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17499 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17500
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17501 // make compose private
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17502 _chart._compose = _chart.compose;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17503 delete _chart.compose;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17504
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17505 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17506 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17507
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17508 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17509 ## Geo Choropleth Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17510 Includes: [Color Mixin](#color-mixin), [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17511
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17512 The geo choropleth chart is designed as an easy way to create a crossfilter driven choropleth map
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17513 from GeoJson data. This chart implementation was inspired by [the great d3 choropleth
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17514 example](http://bl.ocks.org/4060606).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17515
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17516 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17517 * [US Venture Capital Landscape 2011](http://dc-js.github.com/dc.js/vc/index.html)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17518 #### dc.geoChoroplethChart(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17519 Create a choropleth chart instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17520
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17521 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17522 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17523 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17524 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17525
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17526 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17527 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17528
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17529 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17530 A newly created choropleth chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17531
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17532 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17533 // create a choropleth chart under '#us-chart' element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17534 var chart1 = dc.geoChoroplethChart('#us-chart');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17535 // create a choropleth chart under '#us-chart2' element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17536 var chart2 = dc.compositeChart('#us-chart2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17537 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17538
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17539 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17540 dc.geoChoroplethChart = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17541 var _chart = dc.colorMixin(dc.baseMixin({}));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17542
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17543 _chart.colorAccessor(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17544 return d || 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17545 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17546
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17547 var _geoPath = d3.geo.path();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17548 var _projectionFlag;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17549
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17550 var _geoJsons = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17551
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17552 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17553 _chart.resetSvg();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17554 for (var layerIndex = 0; layerIndex < _geoJsons.length; ++layerIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17555 var states = _chart.svg().append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17556 .attr('class', 'layer' + layerIndex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17557
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17558 var regionG = states.selectAll('g.' + geoJson(layerIndex).name)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17559 .data(geoJson(layerIndex).data)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17560 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17561 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17562 .attr('class', geoJson(layerIndex).name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17563
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17564 regionG
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17565 .append('path')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17566 .attr('fill', 'white')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17567 .attr('d', _geoPath);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17568
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17569 regionG.append('title');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17570
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17571 plotData(layerIndex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17572 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17573 _projectionFlag = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17574 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17575
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17576 function plotData(layerIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17577 var data = generateLayeredData();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17578
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17579 if (isDataLayer(layerIndex)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17580 var regionG = renderRegionG(layerIndex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17581
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17582 renderPaths(regionG, layerIndex, data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17583
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17584 renderTitle(regionG, layerIndex, data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17585 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17586 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17587
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17588 function generateLayeredData() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17589 var data = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17590 var groupAll = _chart.data();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17591 for (var i = 0; i < groupAll.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17592 data[_chart.keyAccessor()(groupAll[i])] = _chart.valueAccessor()(groupAll[i]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17593 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17594 return data;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17595 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17596
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17597 function isDataLayer(layerIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17598 return geoJson(layerIndex).keyAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17599 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17600
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17601 function renderRegionG(layerIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17602 var regionG = _chart.svg()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17603 .selectAll(layerSelector(layerIndex))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17604 .classed('selected', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17605 return isSelected(layerIndex, d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17606 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17607 .classed('deselected', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17608 return isDeselected(layerIndex, d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17609 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17610 .attr('class', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17611 var layerNameClass = geoJson(layerIndex).name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17612 var regionClass = dc.utils.nameToId(geoJson(layerIndex).keyAccessor(d));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17613 var baseClasses = layerNameClass + ' ' + regionClass;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17614 if (isSelected(layerIndex, d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17615 baseClasses += ' selected';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17616 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17617 if (isDeselected(layerIndex, d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17618 baseClasses += ' deselected';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17619 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17620 return baseClasses;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17621 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17622 return regionG;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17623 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17624
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17625 function layerSelector(layerIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17626 return 'g.layer' + layerIndex + ' g.' + geoJson(layerIndex).name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17627 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17628
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17629 function isSelected(layerIndex, d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17630 return _chart.hasFilter() && _chart.hasFilter(getKey(layerIndex, d));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17631 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17632
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17633 function isDeselected(layerIndex, d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17634 return _chart.hasFilter() && !_chart.hasFilter(getKey(layerIndex, d));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17635 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17636
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17637 function getKey(layerIndex, d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17638 return geoJson(layerIndex).keyAccessor(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17639 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17640
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17641 function geoJson(index) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17642 return _geoJsons[index];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17643 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17644
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17645 function renderPaths(regionG, layerIndex, data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17646 var paths = regionG
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17647 .select('path')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17648 .attr('fill', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17649 var currentFill = d3.select(this).attr('fill');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17650 if (currentFill) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17651 return currentFill;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17652 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17653 return 'none';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17654 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17655 .on('click', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17656 return _chart.onClick(d, layerIndex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17657 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17658
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17659 dc.transition(paths, _chart.transitionDuration()).attr('fill', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17660 return _chart.getColor(data[geoJson(layerIndex).keyAccessor(d)], i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17661 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17662 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17663
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17664 _chart.onClick = function (d, layerIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17665 var selectedRegion = geoJson(layerIndex).keyAccessor(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17666 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17667 _chart.filter(selectedRegion);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17668 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17669 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17670 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17671
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17672 function renderTitle(regionG, layerIndex, data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17673 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17674 regionG.selectAll('title').text(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17675 var key = getKey(layerIndex, d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17676 var value = data[key];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17677 return _chart.title()({key: key, value: value});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17678 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17679 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17680 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17681
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17682 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17683 for (var layerIndex = 0; layerIndex < _geoJsons.length; ++layerIndex) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17684 plotData(layerIndex);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17685 if (_projectionFlag) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17686 _chart.svg().selectAll('g.' + geoJson(layerIndex).name + ' path').attr('d', _geoPath);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17687 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17688 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17689 _projectionFlag = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17690 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17691
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17692 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17693 #### .overlayGeoJson(json, name, keyAccessor) - **mandatory**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17694 Use this function to insert a new GeoJson map layer. This function can be invoked multiple times
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17695 if you have multiple GeoJson data layers to render on top of each other. If you overlay multiple
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17696 layers with the same name the new overlay will override the existing one.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17697
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17698 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17699 * json - GeoJson feed
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17700 * name - name of the layer
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17701 * keyAccessor - accessor function used to extract 'key' from the GeoJson data. The key extracted by
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17702 this function should match the keys returned by the crossfilter groups.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17703
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17704 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17705 // insert a layer for rendering US states
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17706 chart.overlayGeoJson(statesJson.features, 'state', function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17707 return d.properties.name;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17708 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17709 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17710
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17711 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17712 _chart.overlayGeoJson = function (json, name, keyAccessor) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17713 for (var i = 0; i < _geoJsons.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17714 if (_geoJsons[i].name === name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17715 _geoJsons[i].data = json;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17716 _geoJsons[i].keyAccessor = keyAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17717 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17718 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17719 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17720 _geoJsons.push({name: name, data: json, keyAccessor: keyAccessor});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17721 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17722 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17723
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17724 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17725 #### .projection(projection)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17726 Set custom geo projection function. See the available [d3 geo projection
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17727 functions](https://github.com/mbostock/d3/wiki/Geo-Projections). Default value: albersUsa.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17728
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17729 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17730 _chart.projection = function (projection) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17731 _geoPath.projection(projection);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17732 _projectionFlag = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17733 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17734 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17735
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17736 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17737 #### .geoJsons()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17738 Returns all GeoJson layers currently registered with this chart. The returned array is a
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17739 reference to this chart's internal data structure, so any modification to this array will also
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17740 modify this chart's internal registration.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17741
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17742 Returns an array of objects containing fields {name, data, accessor}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17743
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17744 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17745 _chart.geoJsons = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17746 return _geoJsons;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17747 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17748
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17749 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17750 #### .geoPath()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17751 Returns the [d3.geo.path](https://github.com/mbostock/d3/wiki/Geo-Paths#path) object used to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17752 render the projection and features. Can be useful for figuring out the bounding box of the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17753 feature set and thus a way to calculate scale and translation for the projection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17754
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17755 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17756 _chart.geoPath = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17757 return _geoPath;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17758 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17759
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17760 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17761 #### .removeGeoJson(name)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17762 Remove a GeoJson layer from this chart by name
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17763
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17764 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17765 _chart.removeGeoJson = function (name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17766 var geoJsons = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17767
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17768 for (var i = 0; i < _geoJsons.length; ++i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17769 var layer = _geoJsons[i];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17770 if (layer.name !== name) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17771 geoJsons.push(layer);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17772 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17773 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17774
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17775 _geoJsons = geoJsons;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17776
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17777 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17778 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17779
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17780 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17781 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17782
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17783 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17784 ## Bubble Overlay Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17785 Includes: [Bubble Mixin](#bubble-mixin), [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17786
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17787 The bubble overlay chart is quite different from the typical bubble chart. With the bubble overlay
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17788 chart you can arbitrarily place bubbles on an existing svg or bitmap image, thus changing the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17789 typical x and y positioning while retaining the capability to visualize data using bubble radius
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17790 and coloring.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17791
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17792 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17793 * [Canadian City Crime Stats](http://dc-js.github.com/dc.js/crime/index.html)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17794 #### dc.bubbleOverlay(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17795 Create a bubble overlay chart instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17796
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17797 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17798 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17799 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17800 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17801 off-screen. Typically this element should also be the parent of the underlying image.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17802 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17803 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17804
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17805 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17806 A newly created bubble overlay chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17807
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17808 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17809 // create a bubble overlay chart on top of the '#chart-container1 svg' element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17810 var bubbleChart1 = dc.bubbleOverlayChart('#chart-container1').svg(d3.select('#chart-container1 svg'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17811 // create a bubble overlay chart on top of the '#chart-container2 svg' element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17812 var bubbleChart2 = dc.compositeChart('#chart-container2', 'chartGroupA').svg(d3.select('#chart-container2 svg'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17813 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17814 #### .svg(imageElement) - **mandatory**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17815 Set the underlying svg image element. Unlike other dc charts this chart will not generate a svg
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17816 element; therefore the bubble overlay chart will not work if this function is not invoked. If the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17817 underlying image is a bitmap, then an empty svg will need to be created on top of the image.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17818
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17819 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17820 // set up underlying svg element
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17821 chart.svg(d3.select('#chart svg'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17822 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17823
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17824 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17825 dc.bubbleOverlay = function (root, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17826 var BUBBLE_OVERLAY_CLASS = 'bubble-overlay';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17827 var BUBBLE_NODE_CLASS = 'node';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17828 var BUBBLE_CLASS = 'bubble';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17829
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17830 var _chart = dc.bubbleMixin(dc.baseMixin({}));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17831 var _g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17832 var _points = [];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17833
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17834 _chart.transitionDuration(750);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17835
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17836 _chart.radiusValueAccessor(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17837 return d.value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17838 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17839
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17840 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17841 #### .point(name, x, y) - **mandatory**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17842 Set up a data point on the overlay. The name of a data point should match a specific 'key' among
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17843 data groups generated using keyAccessor. If a match is found (point name <-> data group key)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17844 then a bubble will be generated at the position specified by the function. x and y
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17845 value specified here are relative to the underlying svg.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17846
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17847 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17848 _chart.point = function (name, x, y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17849 _points.push({name: name, x: x, y: y});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17850 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17851 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17852
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17853 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17854 _g = initOverlayG();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17855
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17856 _chart.r().range([_chart.MIN_RADIUS, _chart.width() * _chart.maxBubbleRelativeSize()]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17857
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17858 initializeBubbles();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17859
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17860 _chart.fadeDeselectedArea();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17861
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17862 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17863 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17864
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17865 function initOverlayG() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17866 _g = _chart.select('g.' + BUBBLE_OVERLAY_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17867 if (_g.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17868 _g = _chart.svg().append('g').attr('class', BUBBLE_OVERLAY_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17869 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17870 return _g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17871 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17872
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17873 function initializeBubbles() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17874 var data = mapData();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17875
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17876 _points.forEach(function (point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17877 var nodeG = getNodeG(point, data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17878
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17879 var circle = nodeG.select('circle.' + BUBBLE_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17880
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17881 if (circle.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17882 circle = nodeG.append('circle')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17883 .attr('class', BUBBLE_CLASS)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17884 .attr('r', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17885 .attr('fill', _chart.getColor)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17886 .on('click', _chart.onClick);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17887 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17888
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17889 dc.transition(circle, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17890 .attr('r', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17891 return _chart.bubbleR(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17892 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17893
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17894 _chart._doRenderLabel(nodeG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17895
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17896 _chart._doRenderTitles(nodeG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17897 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17898 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17899
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17900 function mapData() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17901 var data = {};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17902 _chart.data().forEach(function (datum) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17903 data[_chart.keyAccessor()(datum)] = datum;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17904 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17905 return data;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17906 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17907
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17908 function getNodeG(point, data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17909 var bubbleNodeClass = BUBBLE_NODE_CLASS + ' ' + dc.utils.nameToId(point.name);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17910
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17911 var nodeG = _g.select('g.' + dc.utils.nameToId(point.name));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17912
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17913 if (nodeG.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17914 nodeG = _g.append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17915 .attr('class', bubbleNodeClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17916 .attr('transform', 'translate(' + point.x + ',' + point.y + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17917 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17918
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17919 nodeG.datum(data[point.name]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17920
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17921 return nodeG;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17922 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17923
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17924 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17925 updateBubbles();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17926
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17927 _chart.fadeDeselectedArea();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17928
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17929 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17930 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17931
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17932 function updateBubbles() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17933 var data = mapData();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17934
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17935 _points.forEach(function (point) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17936 var nodeG = getNodeG(point, data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17937
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17938 var circle = nodeG.select('circle.' + BUBBLE_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17939
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17940 dc.transition(circle, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17941 .attr('r', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17942 return _chart.bubbleR(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17943 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17944 .attr('fill', _chart.getColor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17945
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17946 _chart.doUpdateLabels(nodeG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17947
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17948 _chart.doUpdateTitles(nodeG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17949 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17950 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17951
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17952 _chart.debug = function (flag) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17953 if (flag) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17954 var debugG = _chart.select('g.' + dc.constants.DEBUG_GROUP_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17955
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17956 if (debugG.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17957 debugG = _chart.svg()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17958 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17959 .attr('class', dc.constants.DEBUG_GROUP_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17960 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17961
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17962 var debugText = debugG.append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17963 .attr('x', 10)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17964 .attr('y', 20);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17965
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17966 debugG
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17967 .append('rect')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17968 .attr('width', _chart.width())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17969 .attr('height', _chart.height())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17970 .on('mousemove', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17971 var position = d3.mouse(debugG.node());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17972 var msg = position[0] + ', ' + position[1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17973 debugText.text(msg);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17974 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17975 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17976 _chart.selectAll('.debug').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17977 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17978
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17979 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17980 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17981
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17982 _chart.anchor(root, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17983
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17984 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17985 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17986
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17987 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17988 ## Row Chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17989 Includes: [Cap Mixin](#cap-mixin), [Margin Mixin](#margin-mixin), [Color Mixin](#color-mixin), [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17990
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17991 Concrete row chart implementation.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17992 #### dc.rowChart(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17993 Create a row chart instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17994
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17995 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17996
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17997 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17998 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
17999 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18000
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18001 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18002 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18003
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18004 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18005 A newly created row chart instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18006
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18007 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18008 // create a row chart under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18009 var chart1 = dc.rowChart('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18010 // create a row chart under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18011 var chart2 = dc.rowChart('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18012 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18013
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18014 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18015 dc.rowChart = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18016
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18017 var _g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18018
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18019 var _labelOffsetX = 10;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18020 var _labelOffsetY = 15;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18021 var _hasLabelOffsetY = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18022 var _dyOffset = '0.35em'; // this helps center labels https://github.com/mbostock/d3/wiki/SVG-Shapes#svg_text
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18023 var _titleLabelOffsetX = 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18024
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18025 var _gap = 5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18026
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18027 var _fixedBarHeight = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18028 var _rowCssClass = 'row';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18029 var _titleRowCssClass = 'titlerow';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18030 var _renderTitleLabel = false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18031
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18032 var _chart = dc.capMixin(dc.marginMixin(dc.colorMixin(dc.baseMixin({}))));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18033
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18034 var _x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18035
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18036 var _elasticX;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18037
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18038 var _xAxis = d3.svg.axis().orient('bottom');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18039
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18040 var _rowData;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18041
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18042 _chart.rowsCap = _chart.cap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18043
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18044 function calculateAxisScale() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18045 if (!_x || _elasticX) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18046 var extent = d3.extent(_rowData, _chart.cappedValueAccessor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18047 if (extent[0] > 0) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18048 extent[0] = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18049 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18050 _x = d3.scale.linear().domain(extent)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18051 .range([0, _chart.effectiveWidth()]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18052 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18053 _xAxis.scale(_x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18054 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18055
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18056 function drawAxis() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18057 var axisG = _g.select('g.axis');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18058
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18059 calculateAxisScale();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18060
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18061 if (axisG.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18062 axisG = _g.append('g').attr('class', 'axis')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18063 .attr('transform', 'translate(0, ' + _chart.effectiveHeight() + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18064 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18065
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18066 dc.transition(axisG, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18067 .call(_xAxis);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18068 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18069
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18070 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18071 _chart.resetSvg();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18072
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18073 _g = _chart.svg()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18074 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18075 .attr('transform', 'translate(' + _chart.margins().left + ',' + _chart.margins().top + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18076
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18077 drawChart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18078
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18079 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18080 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18081
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18082 _chart.title(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18083 return _chart.cappedKeyAccessor(d) + ': ' + _chart.cappedValueAccessor(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18084 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18085
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18086 _chart.label(_chart.cappedKeyAccessor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18087
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18088 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18089 #### .x([scale])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18090 Gets or sets the x scale. The x scale can be any d3
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18091 [quantitive scale](https://github.com/mbostock/d3/wiki/Quantitative-Scales)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18092 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18093 _chart.x = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18094 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18095 return _x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18096 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18097 _x = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18098 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18099 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18100
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18101 function drawGridLines() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18102 _g.selectAll('g.tick')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18103 .select('line.grid-line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18104 .remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18105
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18106 _g.selectAll('g.tick')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18107 .append('line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18108 .attr('class', 'grid-line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18109 .attr('x1', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18110 .attr('y1', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18111 .attr('x2', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18112 .attr('y2', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18113 return -_chart.effectiveHeight();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18114 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18115 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18116
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18117 function drawChart() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18118 _rowData = _chart.data();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18119
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18120 drawAxis();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18121 drawGridLines();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18122
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18123 var rows = _g.selectAll('g.' + _rowCssClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18124 .data(_rowData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18125
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18126 createElements(rows);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18127 removeElements(rows);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18128 updateElements(rows);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18129 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18130
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18131 function createElements(rows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18132 var rowEnter = rows.enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18133 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18134 .attr('class', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18135 return _rowCssClass + ' _' + i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18136 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18137
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18138 rowEnter.append('rect').attr('width', 0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18139
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18140 createLabels(rowEnter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18141 updateLabels(rows);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18142 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18143
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18144 function removeElements(rows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18145 rows.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18146 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18147
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18148 function rootValue() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18149 var root = _x(0);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18150 return (root === -Infinity || root !== root) ? _x(1) : root;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18151 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18152
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18153 function updateElements(rows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18154 var n = _rowData.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18155
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18156 var height;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18157 if (!_fixedBarHeight) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18158 height = (_chart.effectiveHeight() - (n + 1) * _gap) / n;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18159 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18160 height = _fixedBarHeight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18161 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18162
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18163 // vertically align label in center unless they override the value via property setter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18164 if (!_hasLabelOffsetY) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18165 _labelOffsetY = height / 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18166 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18167
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18168 var rect = rows.attr('transform', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18169 return 'translate(0,' + ((i + 1) * _gap + i * height) + ')';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18170 }).select('rect')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18171 .attr('height', height)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18172 .attr('fill', _chart.getColor)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18173 .on('click', onClick)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18174 .classed('deselected', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18175 return (_chart.hasFilter()) ? !isSelectedRow(d) : false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18176 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18177 .classed('selected', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18178 return (_chart.hasFilter()) ? isSelectedRow(d) : false;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18179 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18180
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18181 dc.transition(rect, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18182 .attr('width', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18183 return Math.abs(rootValue() - _x(_chart.valueAccessor()(d)));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18184 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18185 .attr('transform', translateX);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18186
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18187 createTitles(rows);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18188 updateLabels(rows);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18189 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18190
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18191 function createTitles(rows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18192 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18193 rows.selectAll('title').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18194 rows.append('title').text(_chart.title());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18195 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18196 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18197
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18198 function createLabels(rowEnter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18199 if (_chart.renderLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18200 rowEnter.append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18201 .on('click', onClick);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18202 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18203 if (_chart.renderTitleLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18204 rowEnter.append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18205 .attr('class', _titleRowCssClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18206 .on('click', onClick);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18207 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18208 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18209
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18210 function updateLabels(rows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18211 if (_chart.renderLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18212 var lab = rows.select('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18213 .attr('x', _labelOffsetX)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18214 .attr('y', _labelOffsetY)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18215 .attr('dy', _dyOffset)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18216 .on('click', onClick)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18217 .attr('class', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18218 return _rowCssClass + ' _' + i;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18219 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18220 .text(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18221 return _chart.label()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18222 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18223 dc.transition(lab, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18224 .attr('transform', translateX);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18225 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18226 if (_chart.renderTitleLabel()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18227 var titlelab = rows.select('.' + _titleRowCssClass)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18228 .attr('x', _chart.effectiveWidth() - _titleLabelOffsetX)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18229 .attr('y', _labelOffsetY)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18230 .attr('text-anchor', 'end')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18231 .on('click', onClick)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18232 .attr('class', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18233 return _titleRowCssClass + ' _' + i ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18234 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18235 .text(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18236 return _chart.title()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18237 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18238 dc.transition(titlelab, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18239 .attr('transform', translateX);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18240 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18241 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18242
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18243 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18244 #### .renderTitleLabel(boolean)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18245 Turn on/off Title label rendering (values) using SVG style of text-anchor 'end'
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18246
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18247 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18248 _chart.renderTitleLabel = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18249 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18250 return _renderTitleLabel;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18251 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18252 _renderTitleLabel = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18253 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18254 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18255
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18256 function onClick(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18257 _chart.onClick(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18258 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18259
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18260 function translateX(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18261 var x = _x(_chart.cappedValueAccessor(d)),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18262 x0 = rootValue(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18263 s = x > x0 ? x0 : x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18264 return 'translate(' + s + ',0)';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18265 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18266
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18267 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18268 drawChart();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18269 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18270 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18271
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18272 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18273 #### .xAxis()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18274 Get the x axis for the row chart instance. Note: not settable for row charts.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18275 See the [d3 axis object](https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-axis) documention for more information.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18276 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18277 // customize x axis tick format
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18278 chart.xAxis().tickFormat(function (v) {return v + '%';});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18279 // customize x axis tick values
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18280 chart.xAxis().tickValues([0, 100, 200, 300]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18281 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18282
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18283 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18284 _chart.xAxis = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18285 return _xAxis;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18286 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18287
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18288 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18289 #### .fixedBarHeight([height])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18290 Get or set the fixed bar height. Default is [false] which will auto-scale bars.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18291 For example, if you want to fix the height for a specific number of bars (useful in TopN charts)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18292 you could fix height as follows (where count = total number of bars in your TopN and gap is
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18293 your vertical gap space).
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18294 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18295 chart.fixedBarHeight( chartheight - (count + 1) * gap / count);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18296 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18297 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18298 _chart.fixedBarHeight = function (g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18299 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18300 return _fixedBarHeight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18301 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18302 _fixedBarHeight = g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18303 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18304 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18305
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18306 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18307 #### .gap([gap])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18308 Get or set the vertical gap space between rows on a particular row chart instance. Default gap is 5px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18309
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18310 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18311 _chart.gap = function (g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18312 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18313 return _gap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18314 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18315 _gap = g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18316 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18317 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18318
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18319 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18320 #### .elasticX([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18321 Get or set the elasticity on x axis. If this attribute is set to true, then the x axis will rescle to auto-fit the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18322 data range when filtered.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18323
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18324 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18325 _chart.elasticX = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18326 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18327 return _elasticX;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18328 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18329 _elasticX = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18330 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18331 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18332
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18333 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18334 #### .labelOffsetX([x])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18335 Get or set the x offset (horizontal space to the top left corner of a row) for labels on a particular row chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18336 Default x offset is 10px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18337
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18338 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18339 _chart.labelOffsetX = function (o) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18340 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18341 return _labelOffsetX;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18342 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18343 _labelOffsetX = o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18344 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18345 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18346
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18347 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18348 #### .labelOffsetY([y])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18349 Get or set the y offset (vertical space to the top left corner of a row) for labels on a particular row chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18350 Default y offset is 15px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18351
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18352 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18353 _chart.labelOffsetY = function (o) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18354 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18355 return _labelOffsetY;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18356 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18357 _labelOffsetY = o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18358 _hasLabelOffsetY = true;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18359 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18360 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18361
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18362 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18363 #### .titleLabelOffsetx([x])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18364 Get of set the x offset (horizontal space between right edge of row and right edge or text.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18365 Default x offset is 2px;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18366
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18367 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18368 _chart.titleLabelOffsetX = function (o) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18369 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18370 return _titleLabelOffsetX;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18371 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18372 _titleLabelOffsetX = o;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18373 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18374 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18375
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18376 function isSelectedRow (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18377 return _chart.hasFilter(_chart.cappedKeyAccessor(d));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18378 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18379
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18380 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18381 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18382
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18383 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18384 ## Legend
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18385 Legend is a attachable widget that can be added to other dc charts to render horizontal legend
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18386 labels.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18387
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18388 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18389 chart.legend(dc.legend().x(400).y(10).itemHeight(13).gap(5))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18390 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18391
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18392 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18393 * [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18394 * [Canadian City Crime Stats](http://dc-js.github.com/dc.js/crime/index.html)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18395
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18396 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18397 dc.legend = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18398 var LABEL_GAP = 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18399
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18400 var _legend = {},
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18401 _parent,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18402 _x = 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18403 _y = 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18404 _itemHeight = 12,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18405 _gap = 5,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18406 _horizontal = false,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18407 _legendWidth = 560,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18408 _itemWidth = 70;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18409
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18410 var _g;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18411
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18412 _legend.parent = function (p) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18413 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18414 return _parent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18415 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18416 _parent = p;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18417 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18418 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18419
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18420 _legend.render = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18421 _parent.svg().select('g.dc-legend').remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18422 _g = _parent.svg().append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18423 .attr('class', 'dc-legend')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18424 .attr('transform', 'translate(' + _x + ',' + _y + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18425 var legendables = _parent.legendables();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18426
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18427 var itemEnter = _g.selectAll('g.dc-legend-item')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18428 .data(legendables)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18429 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18430 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18431 .attr('class', 'dc-legend-item')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18432 .on('mouseover', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18433 _parent.legendHighlight(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18434 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18435 .on('mouseout', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18436 _parent.legendReset(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18437 })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18438 .on('click', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18439 d.chart.legendToggle(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18440 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18441
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18442 _g.selectAll('g.dc-legend-item')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18443 .classed('fadeout', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18444 return d.chart.isLegendableHidden(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18445 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18446
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18447 if (legendables.some(dc.pluck('dashstyle'))) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18448 itemEnter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18449 .append('line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18450 .attr('x1', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18451 .attr('y1', _itemHeight / 2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18452 .attr('x2', _itemHeight)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18453 .attr('y2', _itemHeight / 2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18454 .attr('stroke-width', 2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18455 .attr('stroke-dasharray', dc.pluck('dashstyle'))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18456 .attr('stroke', dc.pluck('color'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18457 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18458 itemEnter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18459 .append('rect')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18460 .attr('width', _itemHeight)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18461 .attr('height', _itemHeight)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18462 .attr('fill', function (d) {return d ? d.color : 'blue';});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18463 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18464
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18465 itemEnter.append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18466 .text(dc.pluck('name'))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18467 .attr('x', _itemHeight + LABEL_GAP)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18468 .attr('y', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18469 return _itemHeight / 2 + (this.clientHeight ? this.clientHeight : 13) / 2 - 2;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18470 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18471
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18472 var _cumulativeLegendTextWidth = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18473 var row = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18474 itemEnter.attr('transform', function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18475 if (_horizontal) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18476 var translateBy = 'translate(' + _cumulativeLegendTextWidth + ',' + row * legendItemHeight() + ')';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18477 if ((_cumulativeLegendTextWidth + _itemWidth) >= _legendWidth) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18478 ++row ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18479 _cumulativeLegendTextWidth = 0 ;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18480 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18481 _cumulativeLegendTextWidth += _itemWidth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18482 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18483 return translateBy;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18484 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18485 else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18486 return 'translate(0,' + i * legendItemHeight() + ')';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18487 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18488 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18489 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18490
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18491 function legendItemHeight() {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18492 return _gap + _itemHeight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18493 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18494
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18495 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18496 #### .x([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18497 Set or get x coordinate for legend widget. Default: 0.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18498 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18499 _legend.x = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18500 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18501 return _x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18502 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18503 _x = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18504 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18505 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18506
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18507 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18508 #### .y([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18509 Set or get y coordinate for legend widget. Default: 0.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18510 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18511 _legend.y = function (y) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18512 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18513 return _y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18514 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18515 _y = y;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18516 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18517 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18518
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18519 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18520 #### .gap([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18521 Set or get gap between legend items. Default: 5.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18522 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18523 _legend.gap = function (gap) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18524 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18525 return _gap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18526 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18527 _gap = gap;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18528 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18529 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18530
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18531 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18532 #### .itemHeight([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18533 Set or get legend item height. Default: 12.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18534 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18535 _legend.itemHeight = function (h) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18536 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18537 return _itemHeight;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18538 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18539 _itemHeight = h;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18540 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18541 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18542
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18543 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18544 #### .horizontal([boolean])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18545 Position legend horizontally instead of vertically
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18546 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18547 _legend.horizontal = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18548 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18549 return _horizontal;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18550 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18551 _horizontal = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18552 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18553 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18554
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18555 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18556 #### .legendWidth([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18557 Maximum width for horizontal legend. Default: 560.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18558 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18559 _legend.legendWidth = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18560 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18561 return _legendWidth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18562 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18563 _legendWidth = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18564 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18565 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18566
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18567 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18568 #### .itemWidth([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18569 legendItem width for horizontal legend. Default: 70.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18570 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18571 _legend.itemWidth = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18572 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18573 return _itemWidth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18574 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18575 _itemWidth = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18576 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18577 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18578
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18579 return _legend;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18580 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18581
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18582 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18583 ## Scatter Plot
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18584 Includes: [Coordinate Grid Mixin](#coordinate-grid-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18585
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18586 A scatter plot chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18587 #### dc.scatterPlot(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18588 Create a scatter plot instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18589
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18590 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18591
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18592 * parent : string | node | selection | compositeChart - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18593 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18594 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18595 If the scatter plot is a sub-chart in a [Composite Chart](#composite-chart) then pass in the parent composite
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18596 chart instance.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18597
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18598 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18599 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18600
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18601 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18602 A newly created scatter plot instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18603
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18604 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18605 // create a scatter plot under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18606 var chart1 = dc.scatterPlot('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18607 // create a scatter plot under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18608 var chart2 = dc.scatterPlot('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18609 // create a sub-chart under a composite parent chart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18610 var chart3 = dc.scatterPlot(compositeChart);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18611 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18612
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18613 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18614 dc.scatterPlot = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18615 var _chart = dc.coordinateGridMixin({});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18616 var _symbol = d3.svg.symbol();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18617
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18618 var _existenceAccessor = function (d) { return d.value; };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18619
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18620 var originalKeyAccessor = _chart.keyAccessor();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18621 _chart.keyAccessor(function (d) { return originalKeyAccessor(d)[0]; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18622 _chart.valueAccessor(function (d) { return originalKeyAccessor(d)[1]; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18623 _chart.colorAccessor(function () { return _chart._groupName; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18624
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18625 var _locator = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18626 return 'translate(' + _chart.x()(_chart.keyAccessor()(d)) + ',' +
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18627 _chart.y()(_chart.valueAccessor()(d)) + ')';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18628 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18629
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18630 var _symbolSize = 3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18631 var _highlightedSize = 5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18632 var _hiddenSize = 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18633
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18634 _symbol.size(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18635 if (!_existenceAccessor(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18636 return _hiddenSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18637 } else if (this.filtered) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18638 return Math.pow(_highlightedSize, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18639 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18640 return Math.pow(_symbolSize, 2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18641 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18642 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18643
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18644 dc.override(_chart, '_filter', function (filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18645 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18646 return _chart.__filter();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18647 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18648
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18649 return _chart.__filter(dc.filters.RangedTwoDimensionalFilter(filter));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18650 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18651
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18652 _chart.plotData = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18653 var symbols = _chart.chartBodyG().selectAll('path.symbol')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18654 .data(_chart.data());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18655
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18656 symbols
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18657 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18658 .append('path')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18659 .attr('class', 'symbol')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18660 .attr('opacity', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18661 .attr('fill', _chart.getColor)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18662 .attr('transform', _locator);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18663
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18664 dc.transition(symbols, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18665 .attr('opacity', function (d) { return _existenceAccessor(d) ? 1 : 0; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18666 .attr('fill', _chart.getColor)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18667 .attr('transform', _locator)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18668 .attr('d', _symbol);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18669
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18670 dc.transition(symbols.exit(), _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18671 .attr('opacity', 0).remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18672 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18673
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18674 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18675 #### .existenceAccessor([accessor])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18676 Get or set the existence accessor. If a point exists, it is drawn with symbolSize radius and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18677 opacity 1; if it does not exist, it is drawn with hiddenSize radius and opacity 0. By default,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18678 the existence accessor checks if the reduced value is truthy.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18679 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18680
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18681 _chart.existenceAccessor = function (acc) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18682 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18683 return _existenceAccessor;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18684 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18685 _existenceAccessor = acc;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18686 return this;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18687 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18688
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18689 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18690 #### .symbol([type])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18691 Get or set the symbol type used for each point. By default the symbol is a circle. See the D3
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18692 [docs](https://github.com/mbostock/d3/wiki/SVG-Shapes#wiki-symbol_type) for acceptable types.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18693 Type can be a constant or an accessor.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18694
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18695 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18696 _chart.symbol = function (type) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18697 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18698 return _symbol.type();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18699 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18700 _symbol.type(type);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18701 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18702 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18703
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18704 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18705 #### .symbolSize([radius])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18706 Set or get radius for symbols. Default: 3.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18707
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18708 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18709 _chart.symbolSize = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18710 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18711 return _symbolSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18712 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18713 _symbolSize = s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18714 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18715 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18716
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18717 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18718 #### .highlightedSize([radius])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18719 Set or get radius for highlighted symbols. Default: 4.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18720
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18721 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18722 _chart.highlightedSize = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18723 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18724 return _highlightedSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18725 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18726 _highlightedSize = s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18727 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18728 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18729
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18730 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18731 #### .hiddenSize([radius])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18732 Set or get radius for symbols when the group is empty. Default: 0.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18733
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18734 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18735 _chart.hiddenSize = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18736 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18737 return _hiddenSize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18738 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18739 _hiddenSize = s;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18740 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18741 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18742
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18743 _chart.legendables = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18744 return [{chart: _chart, name: _chart._groupName, color: _chart.getColor()}];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18745 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18746
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18747 _chart.legendHighlight = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18748 resizeSymbolsWhere(function (symbol) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18749 return symbol.attr('fill') === d.color;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18750 }, _highlightedSize);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18751 _chart.selectAll('.chart-body path.symbol').filter(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18752 return d3.select(this).attr('fill') !== d.color;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18753 }).classed('fadeout', true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18754 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18755
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18756 _chart.legendReset = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18757 resizeSymbolsWhere(function (symbol) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18758 return symbol.attr('fill') === d.color;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18759 }, _symbolSize);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18760 _chart.selectAll('.chart-body path.symbol').filter(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18761 return d3.select(this).attr('fill') !== d.color;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18762 }).classed('fadeout', false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18763 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18764
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18765 function resizeSymbolsWhere(condition, size) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18766 var symbols = _chart.selectAll('.chart-body path.symbol').filter(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18767 return condition(d3.select(this));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18768 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18769 var oldSize = _symbol.size();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18770 _symbol.size(Math.pow(size, 2));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18771 dc.transition(symbols, _chart.transitionDuration()).attr('d', _symbol);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18772 _symbol.size(oldSize);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18773 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18774
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18775 _chart.setHandlePaths = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18776 // no handle paths for poly-brushes
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18777 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18778
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18779 _chart.extendBrush = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18780 var extent = _chart.brush().extent();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18781 if (_chart.round()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18782 extent[0] = extent[0].map(_chart.round());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18783 extent[1] = extent[1].map(_chart.round());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18784
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18785 _chart.g().select('.brush')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18786 .call(_chart.brush().extent(extent));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18787 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18788 return extent;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18789 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18790
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18791 _chart.brushIsEmpty = function (extent) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18792 return _chart.brush().empty() || !extent || extent[0][0] >= extent[1][0] || extent[0][1] >= extent[1][1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18793 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18794
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18795 function resizeFiltered(filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18796 var symbols = _chart.selectAll('.chart-body path.symbol').each(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18797 this.filtered = filter && filter.isFiltered(d.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18798 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18799
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18800 dc.transition(symbols, _chart.transitionDuration()).attr('d', _symbol);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18801 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18802
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18803 _chart._brushing = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18804 var extent = _chart.extendBrush();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18805
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18806 _chart.redrawBrush(_chart.g());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18807
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18808 if (_chart.brushIsEmpty(extent)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18809 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18810 _chart.filter(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18811 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18812 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18813
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18814 resizeFiltered(false);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18815
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18816 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18817 var ranged2DFilter = dc.filters.RangedTwoDimensionalFilter(extent);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18818 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18819 _chart.filter(null);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18820 _chart.filter(ranged2DFilter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18821 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18822 }, dc.constants.EVENT_DELAY);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18823
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18824 resizeFiltered(ranged2DFilter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18825 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18826 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18827
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18828 _chart.setBrushY = function (gBrush) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18829 gBrush.call(_chart.brush().y(_chart.y()));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18830 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18831
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18832 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18833 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18834
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18835 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18836 ## Number Display Widget
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18837 Includes: [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18838
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18839 A display of a single numeric value.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18840
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18841 Examples:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18842
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18843 * [Test Example](http://dc-js.github.io/dc.js/examples/number.html)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18844 #### dc.numberDisplay(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18845 Create a Number Display instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18846
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18847 Unlike other charts, you do not need to set a dimension. Instead a group object must be provided and
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18848 a valueAccessor that returns a single value.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18849
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18850 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18851
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18852 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18853 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18854 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18855 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18856 The number display widget will only react to filter changes in the chart group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18857
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18858 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18859 A newly created number display instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18860
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18861 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18862 // create a number display under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18863 var display1 = dc.numberDisplay('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18864 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18865
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18866 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18867 dc.numberDisplay = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18868 var SPAN_CLASS = 'number-display';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18869 var _formatNumber = d3.format('.2s');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18870 var _chart = dc.baseMixin({});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18871 var _html = {one:'', some:'', none:''};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18872
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18873 // dimension not required
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18874 _chart._mandatoryAttributes(['group']);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18875
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18876 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18877 #### .html([object])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18878 Gets or sets an optional object specifying HTML templates to use depending on the number
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18879 displayed. The text `%number` will be replaced with the current value.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18880 - one: HTML template to use if the number is 1
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18881 - zero: HTML template to use if the number is 0
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18882 - some: HTML template to use otherwise
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18883
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18884 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18885 numberWidget.html({
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18886 one:'%number record',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18887 some:'%number records',
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18888 none:'no records'})
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18889 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18890 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18891
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18892 _chart.html = function (s) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18893 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18894 return _html;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18895 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18896 if (s.none) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18897 _html.none = s.none;//if none available
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18898 } else if (s.one) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18899 _html.none = s.one;//if none not available use one
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18900 } else if (s.some) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18901 _html.none = s.some;//if none and one not available use some
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18902 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18903 if (s.one) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18904 _html.one = s.one;//if one available
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18905 } else if (s.some) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18906 _html.one = s.some;//if one not available use some
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18907 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18908 if (s.some) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18909 _html.some = s.some;//if some available
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18910 } else if (s.one) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18911 _html.some = s.one;//if some not available use one
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18912 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18913 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18914 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18915
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18916 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18917 #### .value()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18918 Calculate and return the underlying value of the display
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18919 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18920
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18921 _chart.value = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18922 return _chart.data();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18923 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18924
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18925 _chart.data(function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18926 var valObj = group.value ? group.value() : group.top(1)[0];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18927 return _chart.valueAccessor()(valObj);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18928 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18929
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18930 _chart.transitionDuration(250); // good default
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18931
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18932 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18933 var newValue = _chart.value(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18934 span = _chart.selectAll('.' + SPAN_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18935
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18936 if (span.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18937 span = span.data([0])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18938 .enter()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18939 .append('span')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18940 .attr('class', SPAN_CLASS);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18941 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18942
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18943 span.transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18944 .duration(_chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18945 .ease('quad-out-in')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18946 .tween('text', function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18947 var interp = d3.interpolateNumber(this.lastValue || 0, newValue);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18948 this.lastValue = newValue;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18949 return function (t) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18950 var html = null, num = _chart.formatNumber()(interp(t));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18951 if (newValue === 0 && (_html.none !== '')) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18952 html = _html.none;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18953 } else if (newValue === 1 && (_html.one !== '')) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18954 html = _html.one;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18955 } else if (_html.some !== '') {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18956 html = _html.some;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18957 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18958 this.innerHTML = html ? html.replace('%number', num) : num;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18959 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18960 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18961 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18962
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18963 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18964 return _chart._doRender();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18965 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18966
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18967 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18968 #### .formatNumber([formatter])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18969 Get or set a function to format the value for the display. By default `d3.format('.2s');` is used.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18970
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18971 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18972 _chart.formatNumber = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18973 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18974 return _formatNumber;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18975 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18976 _formatNumber = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18977 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18978 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18979
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18980 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18981 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18982
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18983 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18984 ## Heat Map
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18985
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18986 Includes: [Color Mixin](#color-mixin), [Margin Mixin](#margin-mixin), [Base Mixin](#base-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18987
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18988 A heat map is matrix that represents the values of two dimensions of data using colors.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18989
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18990 #### dc.heatMap(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18991 Create a heat map instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18992
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18993 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18994 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18995 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) specifying
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18996 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18997
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18998 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
18999 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19000
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19001 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19002 A newly created heat map instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19003
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19004 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19005 // create a heat map under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19006 var heatMap1 = dc.heatMap('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19007 // create a heat map under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19008 var heatMap2 = dc.heatMap('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19009 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19010
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19011 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19012 dc.heatMap = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19013
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19014 var DEFAULT_BORDER_RADIUS = 6.75;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19015
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19016 var _chartBody;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19017
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19018 var _cols;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19019 var _rows;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19020 var _xBorderRadius = DEFAULT_BORDER_RADIUS;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19021 var _yBorderRadius = DEFAULT_BORDER_RADIUS;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19022
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19023 var _chart = dc.colorMixin(dc.marginMixin(dc.baseMixin({})));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19024 _chart._mandatoryAttributes(['group']);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19025 _chart.title(_chart.colorAccessor());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19026
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19027 var _xAxisOnClick = function (d) { filterAxis(0, d); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19028 var _yAxisOnClick = function (d) { filterAxis(1, d); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19029 var _boxOnClick = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19030 var filter = d.key;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19031 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19032 _chart.filter(filter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19033 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19034 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19035 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19036
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19037 function filterAxis(axis, value) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19038 var cellsOnAxis = _chart.selectAll('.box-group').filter(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19039 return d.key[axis] === value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19040 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19041 var unfilteredCellsOnAxis = cellsOnAxis.filter(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19042 return !_chart.hasFilter(d.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19043 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19044 dc.events.trigger(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19045 if (unfilteredCellsOnAxis.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19046 cellsOnAxis.each(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19047 _chart.filter(d.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19048 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19049 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19050 unfilteredCellsOnAxis.each(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19051 _chart.filter(d.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19052 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19053 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19054 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19055 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19056 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19057
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19058 dc.override(_chart, 'filter', function (filter) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19059 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19060 return _chart._filter();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19061 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19062
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19063 return _chart._filter(dc.filters.TwoDimensionalFilter(filter));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19064 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19065
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19066 function uniq(d, i, a) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19067 return !i || a[i - 1] !== d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19068 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19069
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19070 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19071 #### .rows([values])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19072 Gets or sets the values used to create the rows of the heatmap, as an array. By default, all
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19073 the values will be fetched from the data using the value accessor, and they will be sorted in
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19074 ascending order.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19075 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19076
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19077 _chart.rows = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19078 if (arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19079 _rows = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19080 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19081 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19082 if (_rows) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19083 return _rows;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19084 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19085 var rowValues = _chart.data().map(_chart.valueAccessor());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19086 rowValues.sort(d3.ascending);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19087 return d3.scale.ordinal().domain(rowValues.filter(uniq));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19088 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19089
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19090 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19091 #### .cols([keys])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19092 Gets or sets the keys used to create the columns of the heatmap, as an array. By default, all
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19093 the values will be fetched from the data using the key accessor, and they will be sorted in
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19094 ascending order.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19095 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19096 _chart.cols = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19097 if (arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19098 _cols = _;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19099 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19100 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19101 if (_cols) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19102 return _cols;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19103 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19104 var colValues = _chart.data().map(_chart.keyAccessor());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19105 colValues.sort(d3.ascending);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19106 return d3.scale.ordinal().domain(colValues.filter(uniq));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19107 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19108
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19109 _chart._doRender = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19110 _chart.resetSvg();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19111
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19112 _chartBody = _chart.svg()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19113 .append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19114 .attr('class', 'heatmap')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19115 .attr('transform', 'translate(' + _chart.margins().left + ',' + _chart.margins().top + ')');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19116
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19117 return _chart._doRedraw();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19118 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19119
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19120 _chart._doRedraw = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19121 var rows = _chart.rows(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19122 cols = _chart.cols(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19123 rowCount = rows.domain().length,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19124 colCount = cols.domain().length,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19125 boxWidth = Math.floor(_chart.effectiveWidth() / colCount),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19126 boxHeight = Math.floor(_chart.effectiveHeight() / rowCount);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19127
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19128 cols.rangeRoundBands([0, _chart.effectiveWidth()]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19129 rows.rangeRoundBands([_chart.effectiveHeight(), 0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19130
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19131 var boxes = _chartBody.selectAll('g.box-group').data(_chart.data(), function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19132 return _chart.keyAccessor()(d, i) + '\0' + _chart.valueAccessor()(d, i);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19133 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19134 var gEnter = boxes.enter().append('g')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19135 .attr('class', 'box-group');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19136
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19137 gEnter.append('rect')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19138 .attr('class', 'heat-box')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19139 .attr('fill', 'white')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19140 .on('click', _chart.boxOnClick());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19141
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19142 if (_chart.renderTitle()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19143 gEnter.append('title')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19144 .text(_chart.title());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19145 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19146
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19147 dc.transition(boxes.selectAll('rect'), _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19148 .attr('x', function (d, i) { return cols(_chart.keyAccessor()(d, i)); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19149 .attr('y', function (d, i) { return rows(_chart.valueAccessor()(d, i)); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19150 .attr('rx', _xBorderRadius)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19151 .attr('ry', _yBorderRadius)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19152 .attr('fill', _chart.getColor)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19153 .attr('width', boxWidth)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19154 .attr('height', boxHeight);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19155
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19156 boxes.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19157
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19158 var gCols = _chartBody.selectAll('g.cols');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19159 if (gCols.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19160 gCols = _chartBody.append('g').attr('class', 'cols axis');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19161 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19162 var gColsText = gCols.selectAll('text').data(cols.domain());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19163 gColsText.enter().append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19164 .attr('x', function (d) { return cols(d) + boxWidth / 2; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19165 .style('text-anchor', 'middle')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19166 .attr('y', _chart.effectiveHeight())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19167 .attr('dy', 12)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19168 .on('click', _chart.xAxisOnClick())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19169 .text(function (d) { return d; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19170 dc.transition(gColsText, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19171 .text(function (d) { return d; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19172 .attr('x', function (d) { return cols(d) + boxWidth / 2; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19173 gColsText.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19174 var gRows = _chartBody.selectAll('g.rows');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19175 if (gRows.empty()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19176 gRows = _chartBody.append('g').attr('class', 'rows axis');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19177 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19178 var gRowsText = gRows.selectAll('text').data(rows.domain());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19179 gRowsText.enter().append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19180 .attr('dy', 6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19181 .style('text-anchor', 'end')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19182 .attr('x', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19183 .attr('dx', -2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19184 .on('click', _chart.yAxisOnClick())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19185 .text(function (d) { return d; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19186 dc.transition(gRowsText, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19187 .text(function (d) { return d; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19188 .attr('y', function (d) { return rows(d) + boxHeight / 2; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19189 gRowsText.exit().remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19190
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19191 if (_chart.hasFilter()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19192 _chart.selectAll('g.box-group').each(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19193 if (_chart.isSelectedNode(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19194 _chart.highlightSelected(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19195 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19196 _chart.fadeDeselected(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19197 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19198 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19199 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19200 _chart.selectAll('g.box-group').each(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19201 _chart.resetHighlight(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19202 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19203 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19204 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19205 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19206 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19207 #### .boxOnClick([handler])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19208 Gets or sets the handler that fires when an individual cell is clicked in the heatmap.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19209 By default, filtering of the cell will be toggled.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19210 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19211 _chart.boxOnClick = function (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19212 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19213 return _boxOnClick;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19214 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19215 _boxOnClick = f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19216 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19217 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19218
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19219 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19220 #### .xAxisOnClick([handler])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19221 Gets or sets the handler that fires when a column tick is clicked in the x axis.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19222 By default, if any cells in the column are unselected, the whole column will be selected,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19223 otherwise the whole column will be unselected.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19224 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19225 _chart.xAxisOnClick = function (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19226 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19227 return _xAxisOnClick;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19228 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19229 _xAxisOnClick = f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19230 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19231 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19232
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19233 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19234 #### .yAxisOnClick([handler])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19235 Gets or sets the handler that fires when a row tick is clicked in the y axis.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19236 By default, if any cells in the row are unselected, the whole row will be selected,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19237 otherwise the whole row will be unselected.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19238 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19239 _chart.yAxisOnClick = function (f) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19240 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19241 return _yAxisOnClick;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19242 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19243 _yAxisOnClick = f;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19244 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19245 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19246
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19247 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19248 #### .xBorderRadius([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19249 Gets or sets the X border radius. Set to 0 to get full rectangles. Default: 6.75
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19250 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19251 _chart.xBorderRadius = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19252 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19253 return _xBorderRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19254 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19255 _xBorderRadius = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19256 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19257 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19258
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19259 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19260 #### .xBorderRadius([value])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19261 Gets or sets the Y border radius. Set to 0 to get full rectangles. Default: 6.75
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19262 */
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19263 _chart.yBorderRadius = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19264 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19265 return _yBorderRadius;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19266 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19267 _yBorderRadius = d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19268 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19269 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19270
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19271 _chart.isSelectedNode = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19272 return _chart.hasFilter(d.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19273 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19274
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19275 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19276 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19277
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19278 // https://github.com/d3/d3-plugins/blob/master/box/box.js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19279 (function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19280
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19281 // Inspired by http://informationandvisualization.de/blog/box-plot
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19282 d3.box = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19283 var width = 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19284 height = 1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19285 duration = 0,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19286 domain = null,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19287 value = Number,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19288 whiskers = boxWhiskers,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19289 quartiles = boxQuartiles,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19290 tickFormat = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19291
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19292 // For each small multiple…
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19293 function box(g) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19294 g.each(function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19295 d = d.map(value).sort(d3.ascending);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19296 var g = d3.select(this),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19297 n = d.length,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19298 min = d[0],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19299 max = d[n - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19300
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19301 // Compute quartiles. Must return exactly 3 elements.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19302 var quartileData = d.quartiles = quartiles(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19303
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19304 // Compute whiskers. Must return exactly 2 elements, or null.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19305 var whiskerIndices = whiskers && whiskers.call(this, d, i),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19306 whiskerData = whiskerIndices && whiskerIndices.map(function (i) { return d[i]; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19307
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19308 // Compute outliers. If no whiskers are specified, all data are 'outliers'.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19309 // We compute the outliers as indices, so that we can join across transitions!
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19310 var outlierIndices = whiskerIndices ?
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19311 d3.range(0, whiskerIndices[0]).concat(d3.range(whiskerIndices[1] + 1, n)) : d3.range(n);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19312
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19313 // Compute the new x-scale.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19314 var x1 = d3.scale.linear()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19315 .domain(domain && domain.call(this, d, i) || [min, max])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19316 .range([height, 0]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19317
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19318 // Retrieve the old x-scale, if this is an update.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19319 var x0 = this.__chart__ || d3.scale.linear()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19320 .domain([0, Infinity])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19321 .range(x1.range());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19322
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19323 // Stash the new scale.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19324 this.__chart__ = x1;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19325
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19326 // Note: the box, median, and box tick elements are fixed in number,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19327 // so we only have to handle enter and update. In contrast, the outliers
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19328 // and other elements are variable, so we need to exit them! Variable
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19329 // elements also fade in and out.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19330
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19331 // Update center line: the vertical line spanning the whiskers.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19332 var center = g.selectAll('line.center')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19333 .data(whiskerData ? [whiskerData] : []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19334
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19335 center.enter().insert('line', 'rect')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19336 .attr('class', 'center')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19337 .attr('x1', width / 2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19338 .attr('y1', function (d) { return x0(d[0]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19339 .attr('x2', width / 2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19340 .attr('y2', function (d) { return x0(d[1]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19341 .style('opacity', 1e-6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19342 .transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19343 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19344 .style('opacity', 1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19345 .attr('y1', function (d) { return x1(d[0]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19346 .attr('y2', function (d) { return x1(d[1]); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19347
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19348 center.transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19349 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19350 .style('opacity', 1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19351 .attr('y1', function (d) { return x1(d[0]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19352 .attr('y2', function (d) { return x1(d[1]); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19353
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19354 center.exit().transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19355 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19356 .style('opacity', 1e-6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19357 .attr('y1', function (d) { return x1(d[0]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19358 .attr('y2', function (d) { return x1(d[1]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19359 .remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19360
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19361 // Update innerquartile box.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19362 var box = g.selectAll('rect.box')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19363 .data([quartileData]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19364
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19365 box.enter().append('rect')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19366 .attr('class', 'box')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19367 .attr('x', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19368 .attr('y', function (d) { return x0(d[2]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19369 .attr('width', width)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19370 .attr('height', function (d) { return x0(d[0]) - x0(d[2]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19371 .transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19372 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19373 .attr('y', function (d) { return x1(d[2]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19374 .attr('height', function (d) { return x1(d[0]) - x1(d[2]); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19375
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19376 box.transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19377 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19378 .attr('y', function (d) { return x1(d[2]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19379 .attr('height', function (d) { return x1(d[0]) - x1(d[2]); });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19380
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19381 // Update median line.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19382 var medianLine = g.selectAll('line.median')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19383 .data([quartileData[1]]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19384
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19385 medianLine.enter().append('line')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19386 .attr('class', 'median')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19387 .attr('x1', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19388 .attr('y1', x0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19389 .attr('x2', width)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19390 .attr('y2', x0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19391 .transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19392 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19393 .attr('y1', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19394 .attr('y2', x1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19395
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19396 medianLine.transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19397 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19398 .attr('y1', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19399 .attr('y2', x1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19400
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19401 // Update whiskers.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19402 var whisker = g.selectAll('line.whisker')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19403 .data(whiskerData || []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19404
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19405 whisker.enter().insert('line', 'circle, text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19406 .attr('class', 'whisker')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19407 .attr('x1', 0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19408 .attr('y1', x0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19409 .attr('x2', width)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19410 .attr('y2', x0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19411 .style('opacity', 1e-6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19412 .transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19413 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19414 .attr('y1', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19415 .attr('y2', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19416 .style('opacity', 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19417
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19418 whisker.transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19419 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19420 .attr('y1', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19421 .attr('y2', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19422 .style('opacity', 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19423
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19424 whisker.exit().transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19425 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19426 .attr('y1', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19427 .attr('y2', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19428 .style('opacity', 1e-6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19429 .remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19430
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19431 // Update outliers.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19432 var outlier = g.selectAll('circle.outlier')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19433 .data(outlierIndices, Number);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19434
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19435 outlier.enter().insert('circle', 'text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19436 .attr('class', 'outlier')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19437 .attr('r', 5)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19438 .attr('cx', width / 2)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19439 .attr('cy', function (i) { return x0(d[i]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19440 .style('opacity', 1e-6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19441 .transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19442 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19443 .attr('cy', function (i) { return x1(d[i]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19444 .style('opacity', 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19445
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19446 outlier.transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19447 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19448 .attr('cy', function (i) { return x1(d[i]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19449 .style('opacity', 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19450
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19451 outlier.exit().transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19452 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19453 .attr('cy', function (i) { return x1(d[i]); })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19454 .style('opacity', 1e-6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19455 .remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19456
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19457 // Compute the tick format.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19458 var format = tickFormat || x1.tickFormat(8);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19459
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19460 // Update box ticks.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19461 var boxTick = g.selectAll('text.box')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19462 .data(quartileData);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19463
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19464 boxTick.enter().append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19465 .attr('class', 'box')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19466 .attr('dy', '.3em')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19467 .attr('dx', function (d, i) { return i & 1 ? 6 : -6; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19468 .attr('x', function (d, i) { return i & 1 ? width : 0; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19469 .attr('y', x0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19470 .attr('text-anchor', function (d, i) { return i & 1 ? 'start' : 'end'; })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19471 .text(format)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19472 .transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19473 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19474 .attr('y', x1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19475
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19476 boxTick.transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19477 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19478 .text(format)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19479 .attr('y', x1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19480
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19481 // Update whisker ticks. These are handled separately from the box
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19482 // ticks because they may or may not exist, and we want don't want
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19483 // to join box ticks pre-transition with whisker ticks post-.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19484 var whiskerTick = g.selectAll('text.whisker')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19485 .data(whiskerData || []);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19486
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19487 whiskerTick.enter().append('text')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19488 .attr('class', 'whisker')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19489 .attr('dy', '.3em')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19490 .attr('dx', 6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19491 .attr('x', width)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19492 .attr('y', x0)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19493 .text(format)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19494 .style('opacity', 1e-6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19495 .transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19496 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19497 .attr('y', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19498 .style('opacity', 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19499
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19500 whiskerTick.transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19501 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19502 .text(format)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19503 .attr('y', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19504 .style('opacity', 1);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19505
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19506 whiskerTick.exit().transition()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19507 .duration(duration)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19508 .attr('y', x1)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19509 .style('opacity', 1e-6)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19510 .remove();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19511 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19512 d3.timer.flush();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19513 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19514
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19515 box.width = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19516 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19517 return width;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19518 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19519 width = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19520 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19521 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19522
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19523 box.height = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19524 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19525 return height;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19526 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19527 height = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19528 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19529 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19530
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19531 box.tickFormat = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19532 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19533 return tickFormat;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19534 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19535 tickFormat = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19536 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19537 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19538
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19539 box.duration = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19540 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19541 return duration;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19542 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19543 duration = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19544 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19545 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19546
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19547 box.domain = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19548 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19549 return domain;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19550 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19551 domain = x === null ? x : d3.functor(x);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19552 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19553 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19554
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19555 box.value = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19556 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19557 return value;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19558 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19559 value = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19560 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19561 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19562
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19563 box.whiskers = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19564 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19565 return whiskers;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19566 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19567 whiskers = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19568 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19569 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19570
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19571 box.quartiles = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19572 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19573 return quartiles;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19574 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19575 quartiles = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19576 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19577 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19578
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19579 return box;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19580 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19581
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19582 function boxWhiskers(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19583 return [0, d.length - 1];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19584 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19585
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19586 function boxQuartiles(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19587 return [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19588 d3.quantile(d, 0.25),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19589 d3.quantile(d, 0.5),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19590 d3.quantile(d, 0.75)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19591 ];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19592 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19593
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19594 })();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19595
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19596 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19597 ## Box Plot
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19598
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19599 Includes: [Coordinate Grid Mixin](#coordinate-grid-mixin)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19600
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19601 A box plot is a chart that depicts numerical data via their quartile ranges.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19602
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19603 #### dc.boxPlot(parent[, chartGroup])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19604 Create a box plot instance and attach it to the given parent element.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19605
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19606 Parameters:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19607 * parent : string | node | selection - any valid
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19608 [d3 single selector](https://github.com/mbostock/d3/wiki/Selections#selecting-elements) representing
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19609 a dom block element such as a div; or a dom element or d3 selection.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19610 * chartGroup : string (optional) - name of the chart group this chart instance should be placed in.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19611 Interaction with a chart will only trigger events and redraws within the chart's group.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19612
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19613 Returns:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19614 A newly created box plot instance
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19615
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19616 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19617 // create a box plot under #chart-container1 element using the default global chart group
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19618 var boxPlot1 = dc.boxPlot('#chart-container1');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19619 // create a box plot under #chart-container2 element using chart group A
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19620 var boxPlot2 = dc.boxPlot('#chart-container2', 'chartGroupA');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19621 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19622
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19623 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19624 dc.boxPlot = function (parent, chartGroup) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19625 var _chart = dc.coordinateGridMixin({});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19626
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19627 // Returns a function to compute the interquartile range.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19628 function DEFAULT_WHISKERS_IQR (k) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19629 return function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19630 var q1 = d.quartiles[0],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19631 q3 = d.quartiles[2],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19632 iqr = (q3 - q1) * k,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19633 i = -1,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19634 j = d.length;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19635 /*jshint -W116*/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19636 /*jshint -W035*/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19637 while (d[++i] < q1 - iqr) {}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19638 while (d[--j] > q3 + iqr) {}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19639 /*jshint +W116*/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19640 return [i, j];
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19641 /*jshint +W035*/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19642 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19643 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19644
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19645 var _whiskerIqrFactor = 1.5;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19646 var _whiskersIqr = DEFAULT_WHISKERS_IQR;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19647 var _whiskers = _whiskersIqr(_whiskerIqrFactor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19648
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19649 var _box = d3.box();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19650 var _tickFormat = null;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19651
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19652 var _boxWidth = function (innerChartWidth, xUnits) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19653 if (_chart.isOrdinal()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19654 return _chart.x().rangeBand();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19655 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19656 return innerChartWidth / (1 + _chart.boxPadding()) / xUnits;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19657 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19658 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19659
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19660 // default padding to handle min/max whisker text
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19661 _chart.yAxisPadding(12);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19662
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19663 // default to ordinal
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19664 _chart.x(d3.scale.ordinal());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19665 _chart.xUnits(dc.units.ordinal);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19666
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19667 // valueAccessor should return an array of values that can be coerced into numbers
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19668 // or if data is overloaded for a static array of arrays, it should be `Number`.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19669 // Empty arrays are not included.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19670 _chart.data(function (group) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19671 return group.all().map(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19672 d.map = function (accessor) { return accessor.call(d, d); };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19673 return d;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19674 }).filter(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19675 var values = _chart.valueAccessor()(d);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19676 return values.length !== 0;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19677 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19678 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19679
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19680 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19681 #### .boxPadding([padding])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19682 Get or set the spacing between boxes as a fraction of box size. Valid values are within 0-1.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19683 See the [d3 docs](https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal_rangeBands)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19684 for a visual description of how the padding is applied.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19685
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19686 Default: 0.8
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19687 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19688 _chart.boxPadding = _chart._rangeBandPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19689 _chart.boxPadding(0.8);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19690
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19691 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19692 #### .outerPadding([padding])
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19693 Get or set the outer padding on an ordinal box chart. This setting has no effect on non-ordinal charts
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19694 or on charts with a custom `.boxWidth`. Will pad the width by `padding * barWidth` on each side of the chart.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19695
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19696 Default: 0.5
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19697 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19698 _chart.outerPadding = _chart._outerRangeBandPadding;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19699 _chart.outerPadding(0.5);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19700
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19701 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19702 #### .boxWidth(width || function(innerChartWidth, xUnits) { ... })
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19703 Get or set the numerical width of the boxplot box. The width may also be a function taking as
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19704 parameters the chart width excluding the right and left margins, as well as the number of x
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19705 units.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19706 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19707 _chart.boxWidth = function (_) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19708 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19709 return _boxWidth;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19710 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19711 _boxWidth = d3.functor(_);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19712 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19713 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19714
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19715 var boxTransform = function (d, i) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19716 var xOffset = _chart.x()(_chart.keyAccessor()(d, i));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19717 return 'translate(' + xOffset + ', 0)';
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19718 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19719
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19720 _chart._preprocessData = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19721 if (_chart.elasticX()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19722 _chart.x().domain([]);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19723 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19724 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19725
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19726 _chart.plotData = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19727 var _calculatedBoxWidth = _boxWidth(_chart.effectiveWidth(), _chart.xUnitCount());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19728
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19729 _box.whiskers(_whiskers)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19730 .width(_calculatedBoxWidth)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19731 .height(_chart.effectiveHeight())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19732 .value(_chart.valueAccessor())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19733 .domain(_chart.y().domain())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19734 .duration(_chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19735 .tickFormat(_tickFormat);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19736
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19737 var boxesG = _chart.chartBodyG().selectAll('g.box').data(_chart.data(), function (d) { return d.key; });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19738
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19739 renderBoxes(boxesG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19740 updateBoxes(boxesG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19741 removeBoxes(boxesG);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19742
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19743 _chart.fadeDeselectedArea();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19744 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19745
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19746 function renderBoxes(boxesG) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19747 var boxesGEnter = boxesG.enter().append('g');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19748
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19749 boxesGEnter
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19750 .attr('class', 'box')
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19751 .attr('transform', boxTransform)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19752 .call(_box)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19753 .on('click', function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19754 _chart.filter(d.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19755 _chart.redrawGroup();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19756 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19757 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19758
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19759 function updateBoxes(boxesG) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19760 dc.transition(boxesG, _chart.transitionDuration())
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19761 .attr('transform', boxTransform)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19762 .call(_box)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19763 .each(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19764 d3.select(this).select('rect.box').attr('fill', _chart.getColor);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19765 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19766 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19767
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19768 function removeBoxes(boxesG) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19769 boxesG.exit().remove().call(_box);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19770 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19771
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19772 _chart.fadeDeselectedArea = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19773 if (_chart.hasFilter()) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19774 _chart.g().selectAll('g.box').each(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19775 if (_chart.isSelectedNode(d)) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19776 _chart.highlightSelected(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19777 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19778 _chart.fadeDeselected(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19779 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19780 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19781 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19782 _chart.g().selectAll('g.box').each(function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19783 _chart.resetHighlight(this);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19784 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19785 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19786 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19787
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19788 _chart.isSelectedNode = function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19789 return _chart.hasFilter(d.key);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19790 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19791
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19792 _chart.yAxisMin = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19793 var min = d3.min(_chart.data(), function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19794 return d3.min(_chart.valueAccessor()(e));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19795 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19796 return dc.utils.subtract(min, _chart.yAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19797 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19798
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19799 _chart.yAxisMax = function () {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19800 var max = d3.max(_chart.data(), function (e) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19801 return d3.max(_chart.valueAccessor()(e));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19802 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19803 return dc.utils.add(max, _chart.yAxisPadding());
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19804 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19805
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19806 /**
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19807 #### .tickFormat()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19808 Set the numerical format of the boxplot median, whiskers and quartile labels. Defaults to
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19809 integer formatting.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19810 ```js
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19811 // format ticks to 2 decimal places
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19812 chart.tickFormat(d3.format('.2f'));
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19813 ```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19814 **/
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19815 _chart.tickFormat = function (x) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19816 if (!arguments.length) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19817 return _tickFormat;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19818 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19819 _tickFormat = x;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19820 return _chart;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19821 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19822
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19823 return _chart.anchor(parent, chartGroup);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19824 };
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19825
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19826 // Renamed functions
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19827
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19828 dc.abstractBubbleChart = dc.bubbleMixin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19829 dc.baseChart = dc.baseMixin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19830 dc.capped = dc.capMixin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19831 dc.colorChart = dc.colorMixin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19832 dc.coordinateGridChart = dc.coordinateGridMixin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19833 dc.marginable = dc.marginMixin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19834 dc.stackableChart = dc.stackMixin;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19835
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19836 // Expose d3 and crossfilter, so that clients in browserify
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19837 // case can obtain them if they need them.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19838 dc.d3 = d3;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19839 dc.crossfilter = crossfilter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19840
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19841 return dc;}
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19842 if(typeof define === "function" && define.amd) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19843 define(["d3", "crossfilter"], _dc);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19844 } else if(typeof module === "object" && module.exports) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19845 var _d3 = require('d3');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19846 var _crossfilter = require('crossfilter');
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19847 // When using npm + browserify, 'crossfilter' is a function,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19848 // since package.json specifies index.js as main function, and it
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19849 // does special handling. When using bower + browserify,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19850 // there's no main in bower.json (in fact, there's no bower.json),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19851 // so we need to fix it.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19852 if (typeof _crossfilter !== "function") {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19853 _crossfilter = _crossfilter.crossfilter;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19854 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19855 module.exports = _dc(_d3, _crossfilter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19856 } else {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19857 this.dc = _dc(d3, crossfilter);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19858 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19859 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19860 )();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19861 </script>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19862
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19863 <script type="text/javascript">
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19864
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19865 // ### Create Chart Objects
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19866 // Create chart objects assocated with the container elements identified by the css selector.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19867 // Note: It is often a good idea to have these objects accessible at the global scope so that they can be modified or
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19868 // filtered by other page controls.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19869 var ringCountChart = dc.barChart("#chart-bar-ring"),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19870 pdbCountChart = dc.rowChart("#chart-row-pdb");
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19871
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19872 //### Load your data
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19873 //Data can be loaded through regular means with your
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19874 //favorite javascript library
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19875 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19876 //```javascript
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19877 //d3.csv('data.csv', function(data) {...};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19878 //d3.json('data.json', function(data) {...};
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19879 //jQuery.getJson('data.json', function(data){...});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19880 //```
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19881 //d3.json('pucker_table2.json', function(error,data) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19882
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19883 var data = [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19884 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19885 "contextconformer": "C4A|C|C1A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19886 "resname": "CTR",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19887 "resid": 211,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19888 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19889 "pdbid": "example-pdb-4ENG",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19890 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19891 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19892 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19893 "-35.39",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19894 "-38.18",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19895 "-30.29"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19896 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19897 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19898 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19899 "C3A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19900 "C4A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19901 "C5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19902 "O5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19903 "C1A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19904 "C2A"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19905 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19906 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19907 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19908 "contextconformer": "C4B|C|C1B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19909 "resname": "CTR",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19910 "resid": 211,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19911 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19912 "pdbid": "example-pdb-4ENG",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19913 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19914 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19915 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19916 "-36.82",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19917 "-37.04",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19918 "-29.22"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19919 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19920 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19921 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19922 "C3B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19923 "C4B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19924 "C5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19925 "O5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19926 "C1B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19927 "C2B"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19928 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19929 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19930 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19931 "contextconformer": "C4C|C|C1C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19932 "resname": "CTR",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19933 "resid": 211,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19934 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19935 "pdbid": "example-pdb-4ENG",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19936 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19937 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19938 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19939 "-31.42",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19940 "-41.33",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19941 "-32.69"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19942 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19943 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19944 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19945 "C3C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19946 "C4C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19947 "C5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19948 "O5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19949 "C1C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19950 "C2C"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19951 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19952 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19953 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19954 "contextconformer": "C4A|C|C1A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19955 "resname": "CTR",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19956 "resid": 212,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19957 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19958 "pdbid": "example-pdb-4ENG",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19959 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19960 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19961 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19962 "-33.97",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19963 "-37.84",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19964 "-32.04"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19965 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19966 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19967 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19968 "C3A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19969 "C4A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19970 "C5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19971 "O5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19972 "C1A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19973 "C2A"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19974 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19975 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19976 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19977 "contextconformer": "C4B|C|C1B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19978 "resname": "CTR",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19979 "resid": 212,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19980 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19981 "pdbid": "example-pdb-4ENG",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19982 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19983 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19984 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19985 "-23.66",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19986 "-39.91",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19987 "-37.59"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19988 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19989 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19990 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19991 "C3B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19992 "C4B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19993 "C5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19994 "O5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19995 "C1B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19996 "C2B"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19997 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19998 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
19999 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20000 "contextconformer": "C2C|H|C1C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20001 "resname": "CTR",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20002 "resid": 212,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20003 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20004 "pdbid": "example-pdb-4ENG",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20005 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20006 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20007 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20008 "-27.59",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20009 "-47.95",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20010 "-31.47"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20011 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20012 "conformer": "2H1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20013 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20014 "C3C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20015 "C4C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20016 "C5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20017 "O5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20018 "C1C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20019 "C2C"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20020 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20021 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20022 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20023 "contextconformer": "C46|E|",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20024 "resname": "BCD",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20025 "resid": 1403,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20026 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20027 "pdbid": "bcd.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20028 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20029 "origconformer": "4E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20030 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20031 "-49.01",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20032 "43.18",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20033 "-58.10"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20034 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20035 "conformer": "4E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20036 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20037 "C36",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20038 "C46",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20039 "C56",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20040 "O56",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20041 "C16",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20042 "C26"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20043 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20044 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20045 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20046 "contextconformer": "C15C45|B|",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20047 "resname": "BCD",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20048 "resid": 1403,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20049 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20050 "pdbid": "bcd.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20051 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20052 "origconformer": "14B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20053 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20054 "-49.88",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20055 "60.71",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20056 "-25.47"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20057 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20058 "conformer": "14B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20059 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20060 "C35",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20061 "C45",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20062 "C55",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20063 "O55",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20064 "C15",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20065 "C25"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20066 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20067 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20068 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20069 "contextconformer": "C14|S|C54",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20070 "resname": "BCD",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20071 "resid": 1403,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20072 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20073 "pdbid": "bcd.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20074 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20075 "origconformer": "1S5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20076 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20077 "-55.88",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20078 "47.15",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20079 "-31.89"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20080 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20081 "conformer": "1S5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20082 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20083 "C34",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20084 "C44",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20085 "C54",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20086 "O54",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20087 "C14",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20088 "C24"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20089 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20090 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20091 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20092 "contextconformer": "C13|S|C33",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20093 "resname": "BCD",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20094 "resid": 1403,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20095 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20096 "pdbid": "bcd.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20097 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20098 "origconformer": "1S3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20099 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20100 "-12.03",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20101 "67.62",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20102 "-53.26"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20103 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20104 "conformer": "1S3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20105 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20106 "C33",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20107 "C43",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20108 "C53",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20109 "O53",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20110 "C13",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20111 "C23"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20112 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20113 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20114 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20115 "contextconformer": "C12|S|C52",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20116 "resname": "BCD",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20117 "resid": 1403,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20118 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20119 "pdbid": "bcd.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20120 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20121 "origconformer": "1S5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20122 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20123 "-64.39",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20124 "43.65",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20125 "-5.11"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20126 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20127 "conformer": "1S5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20128 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20129 "C32",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20130 "C42",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20131 "C52",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20132 "O52",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20133 "C12",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20134 "C22"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20135 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20136 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20137 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20138 "contextconformer": "C47|C|C17",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20139 "resname": "BCD",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20140 "resid": 1403,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20141 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20142 "pdbid": "bcd.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20143 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20144 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20145 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20146 "-30.55",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20147 "-33.09",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20148 "-47.08"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20149 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20150 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20151 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20152 "C37",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20153 "C47",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20154 "C57",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20155 "O57",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20156 "C17",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20157 "C27"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20158 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20159 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20160 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20161 "contextconformer": "C41|H|C51",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20162 "resname": "BCD",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20163 "resid": 1403,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20164 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20165 "pdbid": "bcd.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20166 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20167 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20168 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20169 "-55.66",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20170 "-17.72",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20171 "-25.25"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20172 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20173 "conformer": "4H5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20174 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20175 "C31",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20176 "C41",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20177 "C51",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20178 "O51",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20179 "C11",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20180 "C21"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20181 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20182 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20183 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20184 "contextconformer": "TS3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20185 "resname": "BCD",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20186 "resid": 1403,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20187 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20188 "pdbid": "bcd.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20189 "ringsize": 7,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20190 "origconformer": "TS3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20191 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20192 "14.00",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20193 "-12.28",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20194 "4.84",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20195 "15.42"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20196 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20197 "conformer": "TS3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20198 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20199 "C11C21C31C41C51O51",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20200 "C12C22C32C42C52O52",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20201 "C13C23C33C43C53O53",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20202 "C14C24C34C44C54O54",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20203 "C15C25C35C45C55O55",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20204 "C16C26C36C46C56O56",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20205 "C17C27C37C47C57O57"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20206 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20207 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20208 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20209 "contextconformer": "C4'|C|C1'",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20210 "resname": "MAL",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20211 "resid": 687,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20212 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20213 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20214 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20215 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20216 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20217 "-36.73",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20218 "-32.29",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20219 "-29.30"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20220 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20221 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20222 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20223 "C3'",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20224 "C4'",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20225 "C5'",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20226 "O5'",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20227 "C1'",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20228 "C2'"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20229 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20230 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20231 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20232 "contextconformer": "C4|C|C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20233 "resname": "MAL",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20234 "resid": 687,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20235 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20236 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20237 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20238 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20239 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20240 "-32.33",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20241 "-31.02",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20242 "-30.31"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20243 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20244 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20245 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20246 "C3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20247 "C4",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20248 "C5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20249 "O5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20250 "C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20251 "C2"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20252 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20253 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20254 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20255 "contextconformer": "C2D|H|C3D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20256 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20257 "resid": 688,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20258 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20259 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20260 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20261 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20262 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20263 "-21.97",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20264 "-31.68",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20265 "-34.65"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20266 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20267 "conformer": "2H3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20268 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20269 "C3D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20270 "C4D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20271 "C5D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20272 "O5D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20273 "C1D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20274 "C2D"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20275 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20276 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20277 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20278 "contextconformer": "C2E|H|C3E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20279 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20280 "resid": 688,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20281 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20282 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20283 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20284 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20285 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20286 "-17.75",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20287 "-34.68",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20288 "-37.57"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20289 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20290 "conformer": "2H3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20291 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20292 "C3E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20293 "C4E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20294 "C5E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20295 "O5E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20296 "C1E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20297 "C2E"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20298 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20299 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20300 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20301 "contextconformer": "C4B|C|C1B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20302 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20303 "resid": 688,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20304 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20305 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20306 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20307 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20308 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20309 "-34.55",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20310 "-37.81",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20311 "-29.07"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20312 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20313 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20314 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20315 "C3B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20316 "C4B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20317 "C5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20318 "O5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20319 "C1B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20320 "C2B"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20321 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20322 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20323 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20324 "contextconformer": "C4A|C|C1A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20325 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20326 "resid": 688,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20327 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20328 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20329 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20330 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20331 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20332 "-35.62",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20333 "-28.65",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20334 "-33.39"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20335 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20336 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20337 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20338 "C3A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20339 "C4A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20340 "C5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20341 "O5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20342 "C1A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20343 "C2A"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20344 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20345 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20346 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20347 "contextconformer": "C4C|C|C1C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20348 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20349 "resid": 688,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20350 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20351 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20352 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20353 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20354 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20355 "-26.33",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20356 "-39.11",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20357 "-29.79"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20358 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20359 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20360 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20361 "C3C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20362 "C4C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20363 "C5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20364 "O5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20365 "C1C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20366 "C2C"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20367 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20368 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20369 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20370 "contextconformer": "C2F|H|C1F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20371 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20372 "resid": 688,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20373 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20374 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20375 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20376 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20377 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20378 "-23.27",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20379 "-39.92",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20380 "-32.61"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20381 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20382 "conformer": "2H1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20383 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20384 "C3F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20385 "C4F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20386 "C5F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20387 "O5F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20388 "C1F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20389 "C2F"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20390 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20391 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20392 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20393 "contextconformer": "|P|",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20394 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20395 "resid": 688,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20396 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20397 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20398 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20399 "origconformer": "P",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20400 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20401 "-1.21",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20402 "0.16",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20403 "9.59"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20404 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20405 "conformer": "P",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20406 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20407 "C1AC2AC3AC4AC5AO5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20408 "C1BC2BC3BC4BC5BO5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20409 "C1CC2CC3CC4CC5CO5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20410 "C1DC2DC3DC4DC5DO5D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20411 "C1EC2EC3EC4EC5EO5E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20412 "C1FC2FC3FC4FC5FO5F"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20413 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20414 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20415 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20416 "contextconformer": "C4D|C|C1D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20417 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20418 "resid": 689,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20419 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20420 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20421 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20422 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20423 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20424 "-28.16",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20425 "-33.78",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20426 "-36.69"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20427 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20428 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20429 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20430 "C3D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20431 "C4D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20432 "C5D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20433 "O5D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20434 "C1D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20435 "C2D"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20436 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20437 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20438 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20439 "contextconformer": "C4E|C|C1E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20440 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20441 "resid": 689,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20442 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20443 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20444 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20445 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20446 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20447 "-30.39",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20448 "-39.03",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20449 "-31.50"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20450 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20451 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20452 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20453 "C3E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20454 "C4E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20455 "C5E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20456 "O5E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20457 "C1E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20458 "C2E"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20459 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20460 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20461 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20462 "contextconformer": "O5B|H|C1B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20463 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20464 "resid": 689,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20465 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20466 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20467 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20468 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20469 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20470 "-30.40",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20471 "-41.45",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20472 "-24.24"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20473 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20474 "conformer": "6H1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20475 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20476 "C3B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20477 "C4B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20478 "C5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20479 "O5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20480 "C1B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20481 "C2B"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20482 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20483 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20484 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20485 "contextconformer": "C2A|H|C1A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20486 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20487 "resid": 689,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20488 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20489 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20490 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20491 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20492 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20493 "-21.99",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20494 "-38.95",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20495 "-30.36"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20496 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20497 "conformer": "2H1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20498 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20499 "C3A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20500 "C4A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20501 "C5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20502 "O5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20503 "C1A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20504 "C2A"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20505 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20506 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20507 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20508 "contextconformer": "C4C|C|C1C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20509 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20510 "resid": 689,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20511 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20512 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20513 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20514 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20515 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20516 "-26.53",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20517 "-42.79",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20518 "-33.89"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20519 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20520 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20521 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20522 "C3C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20523 "C4C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20524 "C5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20525 "O5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20526 "C1C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20527 "C2C"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20528 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20529 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20530 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20531 "contextconformer": "C2F|H|C1F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20532 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20533 "resid": 689,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20534 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20535 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20536 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20537 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20538 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20539 "-21.92",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20540 "-42.21",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20541 "-25.15"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20542 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20543 "conformer": "2H1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20544 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20545 "C3F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20546 "C4F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20547 "C5F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20548 "O5F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20549 "C1F",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20550 "C2F"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20551 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20552 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20553 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20554 "contextconformer": "|P|",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20555 "resname": "ACX",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20556 "resid": 689,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20557 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20558 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20559 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20560 "origconformer": "P",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20561 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20562 "6.61",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20563 "-6.67",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20564 "13.64"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20565 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20566 "conformer": "P",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20567 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20568 "C1AC2AC3AC4AC5AO5A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20569 "C1BC2BC3BC4BC5BO5B",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20570 "C1CC2CC3CC4CC5CO5C",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20571 "C1DC2DC3DC4DC5DO5D",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20572 "C1EC2EC3EC4EC5EO5E",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20573 "C1FC2FC3FC4FC5FO5F"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20574 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20575 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20576 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20577 "contextconformer": "C2|H|C3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20578 "resname": "GLC",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20579 "resid": 692,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20580 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20581 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20582 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20583 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20584 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20585 "-21.92",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20586 "-23.11",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20587 "-39.86"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20588 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20589 "conformer": "2H3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20590 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20591 "C3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20592 "C4",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20593 "C5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20594 "O5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20595 "C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20596 "C2"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20597 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20598 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20599 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20600 "contextconformer": "C2|H|C3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20601 "resname": "GLC",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20602 "resid": 693,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20603 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20604 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20605 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20606 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20607 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20608 "-23.21",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20609 "-27.35",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20610 "-45.33"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20611 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20612 "conformer": "2H3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20613 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20614 "C3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20615 "C4",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20616 "C5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20617 "O5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20618 "C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20619 "C2"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20620 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20621 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20622 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20623 "contextconformer": "C4|H|C5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20624 "resname": "GLC",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20625 "resid": 694,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20626 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20627 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20628 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20629 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20630 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20631 "-35.13",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20632 "-19.34",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20633 "-33.50"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20634 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20635 "conformer": "4H5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20636 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20637 "C3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20638 "C4",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20639 "C5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20640 "O5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20641 "C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20642 "C2"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20643 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20644 },
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20645 {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20646 "contextconformer": "C4|C|C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20647 "resname": "GLC",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20648 "resid": 695,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20649 "chain": "A",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20650 "pdbid": "1CXF.pdb",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20651 "ringsize": 6,
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20652 "origconformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20653 "puckercoords": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20654 "-35.92",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20655 "-25.59",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20656 "-39.09"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20657 ],
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20658 "conformer": "4C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20659 "ringorder": [
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20660 "C3",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20661 "C4",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20662 "C5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20663 "O5",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20664 "C1",
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20665 "C2"
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20666 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20667 }
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20668 ]
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20669
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20670 console.log('data :' + data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20671 // data.forEach(function(d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20672 // d.pdbid = d.pdbid;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20673 // d.resname = d.resname;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20674 // d.conformer = d.conformer;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20675 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20676 // });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20677 //### Create Crossfilter Dimensions and Groups
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20678 //See the [crossfilter API](https://github.com/square/crossfilter/wiki/API-Reference) for reference.
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20679 var ndx = crossfilter(data);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20680 //var all = ndx.groupAll();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20681
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20682
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20683 // dimension by ring
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20684 var ringDim = ndx.dimension(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20685 return d.ringsize;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20686 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20687 // dimension by pdb
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20688 var pdbDim = ndx.dimension(function (d) {
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20689 return d.pdbid;
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20690 });
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20691
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20692
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20693 // countperPDB = pdbDim.group().reduceSum(function(d) {return +d.Spent;}),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20694 // countperRes = resnameDim.group().reduceSum(function(d) {return +d.Spent;}),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20695 // countperPDB = pdbDim.group().reduceSum(function(d) {return d.ringsize;}),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20696 // countperRes = resnameDim.group().reduceSum(function(d) {return d.ringsize;});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20697 countperRing = ringDim.group().reduceCount(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20698 countperPDB = pdbDim.group().reduceCount(),
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20699 //countperPDB = pdbDim.group().reduceSum(function(d) {return d.ringsize;});
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20700
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20701 //### Define Chart Attributes
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20702 //Define chart attributes using fluent methods. See the
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20703 // [dc API Reference](https://github.com/dc-js/dc.js/blob/master/web/docs/api-latest.md) for more information
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20704 //
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20705
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20706 ringCountChart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20707 .width(350).height(200)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20708 .dimension(ringDim)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20709 .group(countperRing)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20710 .x(d3.scale.linear().domain([0,10]))
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20711 .elasticY(true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20712 ringCountChart.xAxis().tickFormat(function(d) {return d}); // convert back to base unit
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20713 ringCountChart.yAxis().ticks(2);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20714
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20715
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20716 pdbCountChart
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20717 .width(350).height(200)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20718 .dimension(pdbDim)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20719 .group(countperPDB)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20720 .elasticX(true);
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20721
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20722
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20723
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20724
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20725 dc.renderAll();
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20726 //}); // END d3 json data load
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20727
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20728 </script>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20729
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20730 </body>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20731 </html>
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20732 """
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20733 out.write(output)
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20734
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20735 except Exception as e:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20736 raise e
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20737 finally:
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20738 out.close()
89592faa2875 Uploaded
chrisb
parents:
diff changeset
20739