pyk 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/lib/chardinjs.min.js +2 -0
  3. data/app/assets/javascripts/lib/crossfilter.js +1383 -1
  4. data/app/assets/javascripts/lib/{d3.js → d3.v3.js} +0 -0
  5. data/app/assets/javascripts/lib/dc.js +3492 -757
  6. data/app/assets/javascripts/lib/jquery.gridster.js +2 -3621
  7. data/app/assets/javascripts/lib/markermanager.js +2 -980
  8. data/app/assets/javascripts/lib/underscore.js +1276 -0
  9. data/app/assets/javascripts/nvd3/lib/colorbrewer.js +302 -0
  10. data/app/assets/javascripts/nvd3/lib/crossfilter.js +1180 -0
  11. data/app/assets/javascripts/nvd3/lib/crossfilter.min.js +1 -0
  12. data/app/assets/javascripts/nvd3/lib/d3.v2.js +7033 -0
  13. data/app/assets/javascripts/nvd3/lib/d3.v2.min.js +4 -0
  14. data/app/assets/javascripts/nvd3/lib/d3.v3.js +8436 -0
  15. data/app/assets/javascripts/nvd3/lib/fisheye.js +86 -0
  16. data/app/assets/javascripts/nvd3/lib/hive.js +80 -0
  17. data/app/assets/javascripts/nvd3/lib/horizon.js +192 -0
  18. data/app/assets/javascripts/nvd3/lib/sankey.js +292 -0
  19. data/app/assets/javascripts/nvd3/nv.d3.js +14312 -0
  20. data/app/assets/javascripts/nvd3/nv.d3.min.js +6 -0
  21. data/app/assets/javascripts/nvd3/src/core.js +122 -0
  22. data/app/assets/javascripts/nvd3/src/interactiveLayer.js +251 -0
  23. data/app/assets/javascripts/nvd3/src/models/axis.js +405 -0
  24. data/app/assets/javascripts/nvd3/src/models/backup/bullet.js +250 -0
  25. data/app/assets/javascripts/nvd3/src/models/backup/bulletChart.js +349 -0
  26. data/app/assets/javascripts/nvd3/src/models/boilerplate.js +104 -0
  27. data/app/assets/javascripts/nvd3/src/models/bullet.js +385 -0
  28. data/app/assets/javascripts/nvd3/src/models/bulletChart.js +343 -0
  29. data/app/assets/javascripts/nvd3/src/models/cumulativeLineChart.js +782 -0
  30. data/app/assets/javascripts/nvd3/src/models/discreteBar.js +349 -0
  31. data/app/assets/javascripts/nvd3/src/models/discreteBarChart.js +333 -0
  32. data/app/assets/javascripts/nvd3/src/models/distribution.js +148 -0
  33. data/app/assets/javascripts/nvd3/src/models/historicalBar.js +331 -0
  34. data/app/assets/javascripts/nvd3/src/models/historicalBarChart.js +419 -0
  35. data/app/assets/javascripts/nvd3/src/models/indentedTree.js +337 -0
  36. data/app/assets/javascripts/nvd3/src/models/legend.js +270 -0
  37. data/app/assets/javascripts/nvd3/src/models/line.js +284 -0
  38. data/app/assets/javascripts/nvd3/src/models/lineChart.js +465 -0
  39. data/app/assets/javascripts/nvd3/src/models/linePlusBarChart.js +433 -0
  40. data/app/assets/javascripts/nvd3/src/models/linePlusBarWithFocusChart.js +658 -0
  41. data/app/assets/javascripts/nvd3/src/models/lineWithFisheye.js +200 -0
  42. data/app/assets/javascripts/nvd3/src/models/lineWithFisheyeChart.js +297 -0
  43. data/app/assets/javascripts/nvd3/src/models/lineWithFocusChart.js +574 -0
  44. data/app/assets/javascripts/nvd3/src/models/multiBar.js +461 -0
  45. data/app/assets/javascripts/nvd3/src/models/multiBarChart.js +524 -0
  46. data/app/assets/javascripts/nvd3/src/models/multiBarHorizontal.js +424 -0
  47. data/app/assets/javascripts/nvd3/src/models/multiBarHorizontalChart.js +434 -0
  48. data/app/assets/javascripts/nvd3/src/models/multiBarTimeSeries.js +384 -0
  49. data/app/assets/javascripts/nvd3/src/models/multiBarTimeSeriesChart.js +405 -0
  50. data/app/assets/javascripts/nvd3/src/models/multiChart.js +452 -0
  51. data/app/assets/javascripts/nvd3/src/models/ohlcBar.js +380 -0
  52. data/app/assets/javascripts/nvd3/src/models/parallelCoordinates.js +239 -0
  53. data/app/assets/javascripts/nvd3/src/models/pie.js +398 -0
  54. data/app/assets/javascripts/nvd3/src/models/pieChart.js +292 -0
  55. data/app/assets/javascripts/nvd3/src/models/scatter.js +674 -0
  56. data/app/assets/javascripts/nvd3/src/models/scatterChart.js +628 -0
  57. data/app/assets/javascripts/nvd3/src/models/scatterPlusLineChart.js +620 -0
  58. data/app/assets/javascripts/nvd3/src/models/sparkline.js +194 -0
  59. data/app/assets/javascripts/nvd3/src/models/sparklinePlus.js +295 -0
  60. data/app/assets/javascripts/nvd3/src/models/stackedArea.js +368 -0
  61. data/app/assets/javascripts/nvd3/src/models/stackedAreaChart.js +629 -0
  62. data/app/assets/javascripts/nvd3/src/tooltip.js +490 -0
  63. data/app/assets/javascripts/nvd3/src/utils.js +152 -0
  64. data/app/assets/javascripts/pyk.js +1 -0
  65. data/app/assets/stylesheets/lib/chardinjs.css +82 -0
  66. data/app/assets/stylesheets/nvd3/nv.d3.css +769 -0
  67. data/app/assets/stylesheets/pyk.css.scss +1 -0
  68. metadata +61 -2
@@ -0,0 +1,574 @@
1
+ nv.models.lineWithFocusChart = function() {
2
+ "use strict";
3
+ //============================================================
4
+ // Public Variables with Default Settings
5
+ //------------------------------------------------------------
6
+
7
+ var lines = nv.models.line()
8
+ , lines2 = nv.models.line()
9
+ , xAxis = nv.models.axis()
10
+ , yAxis = nv.models.axis()
11
+ , x2Axis = nv.models.axis()
12
+ , y2Axis = nv.models.axis()
13
+ , legend = nv.models.legend()
14
+ , brush = d3.svg.brush()
15
+ ;
16
+
17
+ var margin = {top: 30, right: 30, bottom: 30, left: 60}
18
+ , margin2 = {top: 0, right: 30, bottom: 20, left: 60}
19
+ , color = nv.utils.defaultColor()
20
+ , width = null
21
+ , height = null
22
+ , height2 = 100
23
+ , x
24
+ , y
25
+ , x2
26
+ , y2
27
+ , showLegend = true
28
+ , brushExtent = null
29
+ , tooltips = true
30
+ , tooltip = function(key, x, y, e, graph) {
31
+ return '<h3>' + key + '</h3>' +
32
+ '<p>' + y + ' at ' + x + '</p>'
33
+ }
34
+ , noData = "No Data Available."
35
+ , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'brush')
36
+ , transitionDuration = 250
37
+ ;
38
+
39
+ lines
40
+ .clipEdge(true)
41
+ ;
42
+ lines2
43
+ .interactive(false)
44
+ ;
45
+ xAxis
46
+ .orient('bottom')
47
+ .tickPadding(5)
48
+ ;
49
+ yAxis
50
+ .orient('left')
51
+ ;
52
+ x2Axis
53
+ .orient('bottom')
54
+ .tickPadding(5)
55
+ ;
56
+ y2Axis
57
+ .orient('left')
58
+ ;
59
+ //============================================================
60
+
61
+
62
+ //============================================================
63
+ // Private Variables
64
+ //------------------------------------------------------------
65
+
66
+ var showTooltip = function(e, offsetElement) {
67
+ var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ),
68
+ top = e.pos[1] + ( offsetElement.offsetTop || 0),
69
+ x = xAxis.tickFormat()(lines.x()(e.point, e.pointIndex)),
70
+ y = yAxis.tickFormat()(lines.y()(e.point, e.pointIndex)),
71
+ content = tooltip(e.series.key, x, y, e, chart);
72
+
73
+ nv.tooltip.show([left, top], content, null, null, offsetElement);
74
+ };
75
+
76
+ //============================================================
77
+
78
+
79
+ function chart(selection) {
80
+ selection.each(function(data) {
81
+ var container = d3.select(this),
82
+ that = this;
83
+
84
+ var availableWidth = (width || parseInt(container.style('width')) || 960)
85
+ - margin.left - margin.right,
86
+ availableHeight1 = (height || parseInt(container.style('height')) || 400)
87
+ - margin.top - margin.bottom - height2,
88
+ availableHeight2 = height2 - margin2.top - margin2.bottom;
89
+
90
+ chart.update = function() { container.transition().duration(transitionDuration).call(chart) };
91
+ chart.container = this;
92
+
93
+
94
+ //------------------------------------------------------------
95
+ // Display No Data message if there's nothing to show.
96
+
97
+ if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {
98
+ var noDataText = container.selectAll('.nv-noData').data([noData]);
99
+
100
+ noDataText.enter().append('text')
101
+ .attr('class', 'nvd3 nv-noData')
102
+ .attr('dy', '-.7em')
103
+ .style('text-anchor', 'middle');
104
+
105
+ noDataText
106
+ .attr('x', margin.left + availableWidth / 2)
107
+ .attr('y', margin.top + availableHeight1 / 2)
108
+ .text(function(d) { return d });
109
+
110
+ return chart;
111
+ } else {
112
+ container.selectAll('.nv-noData').remove();
113
+ }
114
+
115
+ //------------------------------------------------------------
116
+
117
+
118
+ //------------------------------------------------------------
119
+ // Setup Scales
120
+
121
+ x = lines.xScale();
122
+ y = lines.yScale();
123
+ x2 = lines2.xScale();
124
+ y2 = lines2.yScale();
125
+
126
+ //------------------------------------------------------------
127
+
128
+
129
+ //------------------------------------------------------------
130
+ // Setup containers and skeleton of chart
131
+
132
+ var wrap = container.selectAll('g.nv-wrap.nv-lineWithFocusChart').data([data]);
133
+ var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-lineWithFocusChart').append('g');
134
+ var g = wrap.select('g');
135
+
136
+ gEnter.append('g').attr('class', 'nv-legendWrap');
137
+
138
+ var focusEnter = gEnter.append('g').attr('class', 'nv-focus');
139
+ focusEnter.append('g').attr('class', 'nv-x nv-axis');
140
+ focusEnter.append('g').attr('class', 'nv-y nv-axis');
141
+ focusEnter.append('g').attr('class', 'nv-linesWrap');
142
+
143
+ var contextEnter = gEnter.append('g').attr('class', 'nv-context');
144
+ contextEnter.append('g').attr('class', 'nv-x nv-axis');
145
+ contextEnter.append('g').attr('class', 'nv-y nv-axis');
146
+ contextEnter.append('g').attr('class', 'nv-linesWrap');
147
+ contextEnter.append('g').attr('class', 'nv-brushBackground');
148
+ contextEnter.append('g').attr('class', 'nv-x nv-brush');
149
+
150
+ //------------------------------------------------------------
151
+
152
+
153
+ //------------------------------------------------------------
154
+ // Legend
155
+
156
+ if (showLegend) {
157
+ legend.width(availableWidth);
158
+
159
+ g.select('.nv-legendWrap')
160
+ .datum(data)
161
+ .call(legend);
162
+
163
+ if ( margin.top != legend.height()) {
164
+ margin.top = legend.height();
165
+ availableHeight1 = (height || parseInt(container.style('height')) || 400)
166
+ - margin.top - margin.bottom - height2;
167
+ }
168
+
169
+ g.select('.nv-legendWrap')
170
+ .attr('transform', 'translate(0,' + (-margin.top) +')')
171
+ }
172
+
173
+ //------------------------------------------------------------
174
+
175
+
176
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
177
+
178
+
179
+ //------------------------------------------------------------
180
+ // Main Chart Component(s)
181
+
182
+ lines
183
+ .width(availableWidth)
184
+ .height(availableHeight1)
185
+ .color(
186
+ data
187
+ .map(function(d,i) {
188
+ return d.color || color(d, i);
189
+ })
190
+ .filter(function(d,i) {
191
+ return !data[i].disabled;
192
+ })
193
+ );
194
+
195
+ lines2
196
+ .defined(lines.defined())
197
+ .width(availableWidth)
198
+ .height(availableHeight2)
199
+ .color(
200
+ data
201
+ .map(function(d,i) {
202
+ return d.color || color(d, i);
203
+ })
204
+ .filter(function(d,i) {
205
+ return !data[i].disabled;
206
+ })
207
+ );
208
+
209
+ g.select('.nv-context')
210
+ .attr('transform', 'translate(0,' + ( availableHeight1 + margin.bottom + margin2.top) + ')')
211
+
212
+ var contextLinesWrap = g.select('.nv-context .nv-linesWrap')
213
+ .datum(data.filter(function(d) { return !d.disabled }))
214
+
215
+ d3.transition(contextLinesWrap).call(lines2);
216
+
217
+ //------------------------------------------------------------
218
+
219
+
220
+ /*
221
+ var focusLinesWrap = g.select('.nv-focus .nv-linesWrap')
222
+ .datum(data.filter(function(d) { return !d.disabled }))
223
+
224
+ d3.transition(focusLinesWrap).call(lines);
225
+ */
226
+
227
+
228
+ //------------------------------------------------------------
229
+ // Setup Main (Focus) Axes
230
+
231
+ xAxis
232
+ .scale(x)
233
+ .ticks( availableWidth / 100 )
234
+ .tickSize(-availableHeight1, 0);
235
+
236
+ yAxis
237
+ .scale(y)
238
+ .ticks( availableHeight1 / 36 )
239
+ .tickSize( -availableWidth, 0);
240
+
241
+ g.select('.nv-focus .nv-x.nv-axis')
242
+ .attr('transform', 'translate(0,' + availableHeight1 + ')');
243
+
244
+ //------------------------------------------------------------
245
+
246
+
247
+ //------------------------------------------------------------
248
+ // Setup Brush
249
+
250
+ brush
251
+ .x(x2)
252
+ .on('brush', function() {
253
+ //When brushing, turn off transitions because chart needs to change immediately.
254
+ var oldTransition = chart.transitionDuration();
255
+ chart.transitionDuration(0);
256
+ onBrush();
257
+ chart.transitionDuration(oldTransition);
258
+ });
259
+
260
+ if (brushExtent) brush.extent(brushExtent);
261
+
262
+ var brushBG = g.select('.nv-brushBackground').selectAll('g')
263
+ .data([brushExtent || brush.extent()])
264
+
265
+ var brushBGenter = brushBG.enter()
266
+ .append('g');
267
+
268
+ brushBGenter.append('rect')
269
+ .attr('class', 'left')
270
+ .attr('x', 0)
271
+ .attr('y', 0)
272
+ .attr('height', availableHeight2);
273
+
274
+ brushBGenter.append('rect')
275
+ .attr('class', 'right')
276
+ .attr('x', 0)
277
+ .attr('y', 0)
278
+ .attr('height', availableHeight2);
279
+
280
+ var gBrush = g.select('.nv-x.nv-brush')
281
+ .call(brush);
282
+ gBrush.selectAll('rect')
283
+ //.attr('y', -5)
284
+ .attr('height', availableHeight2);
285
+ gBrush.selectAll('.resize').append('path').attr('d', resizePath);
286
+
287
+ onBrush();
288
+
289
+ //------------------------------------------------------------
290
+
291
+
292
+ //------------------------------------------------------------
293
+ // Setup Secondary (Context) Axes
294
+
295
+ x2Axis
296
+ .scale(x2)
297
+ .ticks( availableWidth / 100 )
298
+ .tickSize(-availableHeight2, 0);
299
+
300
+ g.select('.nv-context .nv-x.nv-axis')
301
+ .attr('transform', 'translate(0,' + y2.range()[0] + ')');
302
+ d3.transition(g.select('.nv-context .nv-x.nv-axis'))
303
+ .call(x2Axis);
304
+
305
+
306
+ y2Axis
307
+ .scale(y2)
308
+ .ticks( availableHeight2 / 36 )
309
+ .tickSize( -availableWidth, 0);
310
+
311
+ d3.transition(g.select('.nv-context .nv-y.nv-axis'))
312
+ .call(y2Axis);
313
+
314
+ g.select('.nv-context .nv-x.nv-axis')
315
+ .attr('transform', 'translate(0,' + y2.range()[0] + ')');
316
+
317
+ //------------------------------------------------------------
318
+
319
+
320
+ //============================================================
321
+ // Event Handling/Dispatching (in chart's scope)
322
+ //------------------------------------------------------------
323
+
324
+ legend.dispatch.on('stateChange', function(newState) {
325
+ chart.update();
326
+ });
327
+
328
+ dispatch.on('tooltipShow', function(e) {
329
+ if (tooltips) showTooltip(e, that.parentNode);
330
+ });
331
+
332
+ //============================================================
333
+
334
+
335
+ //============================================================
336
+ // Functions
337
+ //------------------------------------------------------------
338
+
339
+ // Taken from crossfilter (http://square.github.com/crossfilter/)
340
+ function resizePath(d) {
341
+ var e = +(d == 'e'),
342
+ x = e ? 1 : -1,
343
+ y = availableHeight2 / 3;
344
+ return 'M' + (.5 * x) + ',' + y
345
+ + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6)
346
+ + 'V' + (2 * y - 6)
347
+ + 'A6,6 0 0 ' + e + ' ' + (.5 * x) + ',' + (2 * y)
348
+ + 'Z'
349
+ + 'M' + (2.5 * x) + ',' + (y + 8)
350
+ + 'V' + (2 * y - 8)
351
+ + 'M' + (4.5 * x) + ',' + (y + 8)
352
+ + 'V' + (2 * y - 8);
353
+ }
354
+
355
+
356
+ function updateBrushBG() {
357
+ if (!brush.empty()) brush.extent(brushExtent);
358
+ brushBG
359
+ .data([brush.empty() ? x2.domain() : brushExtent])
360
+ .each(function(d,i) {
361
+ var leftWidth = x2(d[0]) - x.range()[0],
362
+ rightWidth = x.range()[1] - x2(d[1]);
363
+ d3.select(this).select('.left')
364
+ .attr('width', leftWidth < 0 ? 0 : leftWidth);
365
+
366
+ d3.select(this).select('.right')
367
+ .attr('x', x2(d[1]))
368
+ .attr('width', rightWidth < 0 ? 0 : rightWidth);
369
+ });
370
+ }
371
+
372
+
373
+ function onBrush() {
374
+ brushExtent = brush.empty() ? null : brush.extent();
375
+ var extent = brush.empty() ? x2.domain() : brush.extent();
376
+
377
+ //The brush extent cannot be less than one. If it is, don't update the line chart.
378
+ if (Math.abs(extent[0] - extent[1]) <= 1) {
379
+ return;
380
+ }
381
+
382
+ dispatch.brush({extent: extent, brush: brush});
383
+
384
+
385
+ updateBrushBG();
386
+
387
+ // Update Main (Focus)
388
+ var focusLinesWrap = g.select('.nv-focus .nv-linesWrap')
389
+ .datum(
390
+ data
391
+ .filter(function(d) { return !d.disabled })
392
+ .map(function(d,i) {
393
+ return {
394
+ key: d.key,
395
+ values: d.values.filter(function(d,i) {
396
+ return lines.x()(d,i) >= extent[0] && lines.x()(d,i) <= extent[1];
397
+ })
398
+ }
399
+ })
400
+ );
401
+ focusLinesWrap.transition().duration(transitionDuration).call(lines);
402
+
403
+
404
+ // Update Main (Focus) Axes
405
+ g.select('.nv-focus .nv-x.nv-axis').transition().duration(transitionDuration)
406
+ .call(xAxis);
407
+ g.select('.nv-focus .nv-y.nv-axis').transition().duration(transitionDuration)
408
+ .call(yAxis);
409
+ }
410
+
411
+ //============================================================
412
+
413
+
414
+ });
415
+
416
+ return chart;
417
+ }
418
+
419
+
420
+ //============================================================
421
+ // Event Handling/Dispatching (out of chart's scope)
422
+ //------------------------------------------------------------
423
+
424
+ lines.dispatch.on('elementMouseover.tooltip', function(e) {
425
+ e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top];
426
+ dispatch.tooltipShow(e);
427
+ });
428
+
429
+ lines.dispatch.on('elementMouseout.tooltip', function(e) {
430
+ dispatch.tooltipHide(e);
431
+ });
432
+
433
+ dispatch.on('tooltipHide', function() {
434
+ if (tooltips) nv.tooltip.cleanup();
435
+ });
436
+
437
+ //============================================================
438
+
439
+
440
+ //============================================================
441
+ // Expose Public Variables
442
+ //------------------------------------------------------------
443
+
444
+ // expose chart's sub-components
445
+ chart.dispatch = dispatch;
446
+ chart.legend = legend;
447
+ chart.lines = lines;
448
+ chart.lines2 = lines2;
449
+ chart.xAxis = xAxis;
450
+ chart.yAxis = yAxis;
451
+ chart.x2Axis = x2Axis;
452
+ chart.y2Axis = y2Axis;
453
+
454
+ d3.rebind(chart, lines, 'defined', 'isArea', 'size', 'xDomain', 'yDomain', 'xRange', 'yRange', 'forceX', 'forceY', 'interactive', 'clipEdge', 'clipVoronoi', 'id');
455
+
456
+ chart.options = nv.utils.optionsFunc.bind(chart);
457
+
458
+ chart.x = function(_) {
459
+ if (!arguments.length) return lines.x;
460
+ lines.x(_);
461
+ lines2.x(_);
462
+ return chart;
463
+ };
464
+
465
+ chart.y = function(_) {
466
+ if (!arguments.length) return lines.y;
467
+ lines.y(_);
468
+ lines2.y(_);
469
+ return chart;
470
+ };
471
+
472
+ chart.margin = function(_) {
473
+ if (!arguments.length) return margin;
474
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
475
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
476
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
477
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
478
+ return chart;
479
+ };
480
+
481
+ chart.margin2 = function(_) {
482
+ if (!arguments.length) return margin2;
483
+ margin2 = _;
484
+ return chart;
485
+ };
486
+
487
+ chart.width = function(_) {
488
+ if (!arguments.length) return width;
489
+ width = _;
490
+ return chart;
491
+ };
492
+
493
+ chart.height = function(_) {
494
+ if (!arguments.length) return height;
495
+ height = _;
496
+ return chart;
497
+ };
498
+
499
+ chart.height2 = function(_) {
500
+ if (!arguments.length) return height2;
501
+ height2 = _;
502
+ return chart;
503
+ };
504
+
505
+ chart.color = function(_) {
506
+ if (!arguments.length) return color;
507
+ color =nv.utils.getColor(_);
508
+ legend.color(color);
509
+ return chart;
510
+ };
511
+
512
+ chart.showLegend = function(_) {
513
+ if (!arguments.length) return showLegend;
514
+ showLegend = _;
515
+ return chart;
516
+ };
517
+
518
+ chart.tooltips = function(_) {
519
+ if (!arguments.length) return tooltips;
520
+ tooltips = _;
521
+ return chart;
522
+ };
523
+
524
+ chart.tooltipContent = function(_) {
525
+ if (!arguments.length) return tooltip;
526
+ tooltip = _;
527
+ return chart;
528
+ };
529
+
530
+ chart.interpolate = function(_) {
531
+ if (!arguments.length) return lines.interpolate();
532
+ lines.interpolate(_);
533
+ lines2.interpolate(_);
534
+ return chart;
535
+ };
536
+
537
+ chart.noData = function(_) {
538
+ if (!arguments.length) return noData;
539
+ noData = _;
540
+ return chart;
541
+ };
542
+
543
+ // Chart has multiple similar Axes, to prevent code duplication, probably need to link all axis functions manually like below
544
+ chart.xTickFormat = function(_) {
545
+ if (!arguments.length) return xAxis.tickFormat();
546
+ xAxis.tickFormat(_);
547
+ x2Axis.tickFormat(_);
548
+ return chart;
549
+ };
550
+
551
+ chart.yTickFormat = function(_) {
552
+ if (!arguments.length) return yAxis.tickFormat();
553
+ yAxis.tickFormat(_);
554
+ y2Axis.tickFormat(_);
555
+ return chart;
556
+ };
557
+
558
+ chart.brushExtent = function(_) {
559
+ if (!arguments.length) return brushExtent;
560
+ brushExtent = _;
561
+ return chart;
562
+ };
563
+
564
+ chart.transitionDuration = function(_) {
565
+ if (!arguments.length) return transitionDuration;
566
+ transitionDuration = _;
567
+ return chart;
568
+ };
569
+
570
+ //============================================================
571
+
572
+
573
+ return chart;
574
+ }