novus-nvd3-rails 1.8.4 → 1.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/novus/nvd3/rails/version.rb +1 -1
- data/novus-nvd3-rails.gemspec +1 -1
- data/vendor/assets/javascripts/nv.d3.js +833 -119
- data/vendor/assets/stylesheets/nv.d3.css +61 -82
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27caa71fa31191352db665a99346297a44beb342
|
4
|
+
data.tar.gz: 387b68dda653bac75183ce5054544d0472919f7b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac1095ea207a2b638a845fc02ab24303c6f2a583e72455562a8c3d13a81b8ec730e1df403d9d5f21bbebf7f14b3a21e15332698ef9d6b044f8ad58359d03f496
|
7
|
+
data.tar.gz: f8312d124b7850009d4454dce38e253f74af85eefb1035f151d6b30e68027896670b7e8cf580297171616a19619a30c23278efeceecf7d7fe098f9a014447577
|
data/novus-nvd3-rails.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.12"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
-
spec.add_development_dependency 'rails', '4.
|
23
|
+
spec.add_development_dependency 'rails', '>= 4.0', '< 5.1'
|
24
24
|
spec.add_development_dependency 'rspec-rails', '~> 3.0'
|
25
25
|
spec.add_development_dependency 'capybara', '~> 2.6'
|
26
26
|
spec.add_development_dependency 'sqlite3', '~> 1.3'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/* nvd3 version 1.8.
|
1
|
+
/* nvd3 version 1.8.5 (https://github.com/novus/nvd3) 2016-12-01 */
|
2
2
|
(function(){
|
3
3
|
|
4
4
|
// set up main nv object
|
@@ -779,7 +779,7 @@ nv.models.tooltip = function() {
|
|
779
779
|
// Create new tooltip div if it doesn't exist on DOM.
|
780
780
|
|
781
781
|
var data = [1];
|
782
|
-
tooltip = d3.select(document.body).
|
782
|
+
tooltip = d3.select(document.body).select('#'+id).data(data);
|
783
783
|
|
784
784
|
tooltip.enter().append('div')
|
785
785
|
.attr("class", "nvtooltip " + (classes ? classes : "xy-tooltip"))
|
@@ -2085,7 +2085,7 @@ nv.models.boxPlot = function() {
|
|
2085
2085
|
boxEnter.each(function(d,i) {
|
2086
2086
|
var box = d3.select(this);
|
2087
2087
|
[getWl, getWh].forEach(function (f) {
|
2088
|
-
if (f(d)) {
|
2088
|
+
if (f(d) !== undefined && f(d) !== null) {
|
2089
2089
|
var key = (f === getWl) ? 'low' : 'high';
|
2090
2090
|
box.append('line')
|
2091
2091
|
.style('stroke', getColor(d) || color(d,i))
|
@@ -2565,6 +2565,7 @@ nv.models.bullet = function() {
|
|
2565
2565
|
, dispatch = d3.dispatch('elementMouseover', 'elementMouseout', 'elementMousemove')
|
2566
2566
|
, defaultRangeLabels = ["Maximum", "Mean", "Minimum"]
|
2567
2567
|
, legacyRangeClassNames = ["Max", "Avg", "Min"]
|
2568
|
+
, duration = 1000
|
2568
2569
|
;
|
2569
2570
|
|
2570
2571
|
function sortLabels(labels, values){
|
@@ -2586,7 +2587,7 @@ nv.models.bullet = function() {
|
|
2586
2587
|
|
2587
2588
|
var rangez = ranges.call(this, d, i).slice(),
|
2588
2589
|
markerz = markers.call(this, d, i).slice(),
|
2589
|
-
markerLinez = markerLines.call(this, d, i).slice()
|
2590
|
+
markerLinez = markerLines.call(this, d, i).slice(),
|
2590
2591
|
measurez = measures.call(this, d, i).slice(),
|
2591
2592
|
rangeLabelz = rangeLabels.call(this, d, i).slice(),
|
2592
2593
|
markerLabelz = markerLabels.call(this, d, i).slice(),
|
@@ -2602,6 +2603,7 @@ nv.models.bullet = function() {
|
|
2602
2603
|
// sort values descending
|
2603
2604
|
rangez.sort(d3.descending);
|
2604
2605
|
markerz.sort(d3.descending);
|
2606
|
+
markerLinez.sort(d3.descending);
|
2605
2607
|
measurez.sort(d3.descending);
|
2606
2608
|
|
2607
2609
|
// Setup Scales
|
@@ -2648,20 +2650,18 @@ nv.models.bullet = function() {
|
|
2648
2650
|
for(var i=0,il=rangez.length; i<il; i++){
|
2649
2651
|
var range = rangez[i];
|
2650
2652
|
g.select('rect.nv-range'+i)
|
2653
|
+
.datum(range)
|
2651
2654
|
.attr('height', availableHeight)
|
2655
|
+
.transition()
|
2656
|
+
.duration(duration)
|
2652
2657
|
.attr('width', w1(range))
|
2653
2658
|
.attr('x', xp1(range))
|
2654
|
-
.datum(range)
|
2655
2659
|
}
|
2656
2660
|
|
2657
2661
|
g.select('rect.nv-measure')
|
2658
2662
|
.style('fill', color)
|
2659
2663
|
.attr('height', availableHeight / 3)
|
2660
2664
|
.attr('y', availableHeight / 3)
|
2661
|
-
.attr('width', measurez < 0 ?
|
2662
|
-
x1(0) - x1(measurez[0])
|
2663
|
-
: x1(measurez[0]) - x1(0))
|
2664
|
-
.attr('x', xp1(measurez))
|
2665
2665
|
.on('mouseover', function() {
|
2666
2666
|
dispatch.elementMouseover({
|
2667
2667
|
value: measurez[0],
|
@@ -2682,7 +2682,13 @@ nv.models.bullet = function() {
|
|
2682
2682
|
label: measureLabelz[0] || 'Current',
|
2683
2683
|
color: d3.select(this).style("fill")
|
2684
2684
|
})
|
2685
|
-
})
|
2685
|
+
})
|
2686
|
+
.transition()
|
2687
|
+
.duration(duration)
|
2688
|
+
.attr('width', measurez < 0 ?
|
2689
|
+
x1(0) - x1(measurez[0])
|
2690
|
+
: x1(measurez[0]) - x1(0))
|
2691
|
+
.attr('x', xp1(measurez));
|
2686
2692
|
|
2687
2693
|
var h3 = availableHeight / 6;
|
2688
2694
|
|
@@ -2722,13 +2728,15 @@ nv.models.bullet = function() {
|
|
2722
2728
|
|
2723
2729
|
g.selectAll("path.nv-markerTriangle")
|
2724
2730
|
.data(markerData)
|
2731
|
+
.transition()
|
2732
|
+
.duration(duration)
|
2725
2733
|
.attr('transform', function(d) { return 'translate(' + x1(d.value) + ',' + (availableHeight / 2) + ')' });
|
2726
2734
|
|
2727
2735
|
var markerLinesData = markerLinez.map( function(marker, index) {
|
2728
2736
|
return {value: marker, label: markerLineLabelz[index]}
|
2729
2737
|
});
|
2730
2738
|
gEnter
|
2731
|
-
.selectAll("
|
2739
|
+
.selectAll("line.nv-markerLine")
|
2732
2740
|
.data(markerLinesData)
|
2733
2741
|
.enter()
|
2734
2742
|
.append('line')
|
@@ -2762,9 +2770,12 @@ nv.models.bullet = function() {
|
|
2762
2770
|
})
|
2763
2771
|
});
|
2764
2772
|
|
2765
|
-
g.selectAll("
|
2773
|
+
g.selectAll("line.nv-markerLine")
|
2766
2774
|
.data(markerLinesData)
|
2767
|
-
.
|
2775
|
+
.transition()
|
2776
|
+
.duration(duration)
|
2777
|
+
.attr('x1', function(d) { return x1(d.value) })
|
2778
|
+
.attr('x2', function(d) { return x1(d.value) });
|
2768
2779
|
|
2769
2780
|
wrap.selectAll('.nv-range')
|
2770
2781
|
.on('mouseover', function(d,i) {
|
@@ -2811,6 +2822,7 @@ nv.models.bullet = function() {
|
|
2811
2822
|
width: {get: function(){return width;}, set: function(_){width=_;}},
|
2812
2823
|
height: {get: function(){return height;}, set: function(_){height=_;}},
|
2813
2824
|
tickFormat: {get: function(){return tickFormat;}, set: function(_){tickFormat=_;}},
|
2825
|
+
duration: {get: function(){return duration;}, set: function(_){duration=_;}},
|
2814
2826
|
|
2815
2827
|
// options that require extra logic in the setter
|
2816
2828
|
margin: {get: function(){return margin;}, set: function(_){
|
@@ -2856,7 +2868,7 @@ nv.models.bulletChart = function() {
|
|
2856
2868
|
, width = null
|
2857
2869
|
, height = 55
|
2858
2870
|
, tickFormat = null
|
2859
|
-
|
2871
|
+
, ticks = null
|
2860
2872
|
, noData = null
|
2861
2873
|
, dispatch = d3.dispatch()
|
2862
2874
|
;
|
@@ -2930,7 +2942,7 @@ nv.models.bulletChart = function() {
|
|
2930
2942
|
|
2931
2943
|
bullet
|
2932
2944
|
.width(availableWidth)
|
2933
|
-
.height(availableHeight)
|
2945
|
+
.height(availableHeight);
|
2934
2946
|
|
2935
2947
|
var bulletWrap = g.select('.nv-bulletWrap');
|
2936
2948
|
d3.transition(bulletWrap).call(bullet);
|
@@ -2962,6 +2974,8 @@ nv.models.bulletChart = function() {
|
|
2962
2974
|
|
2963
2975
|
// Transition the updating ticks to the new scale, x1.
|
2964
2976
|
var tickUpdate = d3.transition(tick)
|
2977
|
+
.transition()
|
2978
|
+
.duration(bullet.duration())
|
2965
2979
|
.attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' })
|
2966
2980
|
.style('opacity', 1);
|
2967
2981
|
|
@@ -2974,6 +2988,8 @@ nv.models.bulletChart = function() {
|
|
2974
2988
|
|
2975
2989
|
// Transition the exiting ticks to the new scale, x1.
|
2976
2990
|
d3.transition(tick.exit())
|
2991
|
+
.transition()
|
2992
|
+
.duration(bullet.duration())
|
2977
2993
|
.attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' })
|
2978
2994
|
.style('opacity', 1e-6)
|
2979
2995
|
.remove();
|
@@ -3289,6 +3305,7 @@ nv.models.cumulativeLineChart = function() {
|
|
3289
3305
|
;
|
3290
3306
|
|
3291
3307
|
var margin = {top: 30, right: 30, bottom: 50, left: 60}
|
3308
|
+
, marginTop = null
|
3292
3309
|
, color = nv.utils.defaultColor()
|
3293
3310
|
, width = null
|
3294
3311
|
, height = null
|
@@ -3493,7 +3510,7 @@ nv.models.cumulativeLineChart = function() {
|
|
3493
3510
|
.datum(data)
|
3494
3511
|
.call(legend);
|
3495
3512
|
|
3496
|
-
if (legend.height()
|
3513
|
+
if (!marginTop && legend.height() !== margin.top) {
|
3497
3514
|
margin.top = legend.height();
|
3498
3515
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
3499
3516
|
}
|
@@ -3887,7 +3904,10 @@ nv.models.cumulativeLineChart = function() {
|
|
3887
3904
|
|
3888
3905
|
// options that require extra logic in the setter
|
3889
3906
|
margin: {get: function(){return margin;}, set: function(_){
|
3890
|
-
|
3907
|
+
if (_.top !== undefined) {
|
3908
|
+
margin.top = _.top;
|
3909
|
+
marginTop = _.top;
|
3910
|
+
}
|
3891
3911
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
3892
3912
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
3893
3913
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -4191,6 +4211,7 @@ nv.models.discreteBarChart = function() {
|
|
4191
4211
|
;
|
4192
4212
|
|
4193
4213
|
var margin = {top: 15, right: 10, bottom: 50, left: 60}
|
4214
|
+
, marginTop = null
|
4194
4215
|
, width = null
|
4195
4216
|
, height = null
|
4196
4217
|
, color = nv.utils.getColor()
|
@@ -4291,7 +4312,7 @@ nv.models.discreteBarChart = function() {
|
|
4291
4312
|
.datum(data)
|
4292
4313
|
.call(legend);
|
4293
4314
|
|
4294
|
-
if (legend.height()
|
4315
|
+
if (!marginTop && legend.height() !== margin.top) {
|
4295
4316
|
margin.top = legend.height();
|
4296
4317
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
4297
4318
|
}
|
@@ -4426,7 +4447,10 @@ nv.models.discreteBarChart = function() {
|
|
4426
4447
|
|
4427
4448
|
// options that require extra logic in the setter
|
4428
4449
|
margin: {get: function(){return margin;}, set: function(_){
|
4429
|
-
|
4450
|
+
if (_.top !== undefined) {
|
4451
|
+
margin.top = _.top;
|
4452
|
+
marginTop = _.top;
|
4453
|
+
}
|
4430
4454
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
4431
4455
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
4432
4456
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -4640,6 +4664,7 @@ nv.models.focus = function(content) {
|
|
4640
4664
|
, brushExtent = null
|
4641
4665
|
, duration = 250
|
4642
4666
|
, dispatch = d3.dispatch('brush', 'onBrush', 'renderEnd')
|
4667
|
+
, syncBrushing = true
|
4643
4668
|
;
|
4644
4669
|
|
4645
4670
|
content.interactive(false);
|
@@ -4715,9 +4740,15 @@ nv.models.focus = function(content) {
|
|
4715
4740
|
brush
|
4716
4741
|
.x(x)
|
4717
4742
|
.on('brush', function() {
|
4718
|
-
onBrush();
|
4743
|
+
onBrush(syncBrushing);
|
4719
4744
|
});
|
4720
4745
|
|
4746
|
+
brush.on('brushend', function () {
|
4747
|
+
if (!syncBrushing) {
|
4748
|
+
dispatch.onBrush(brush.empty() ? x.domain() : brush.extent());
|
4749
|
+
}
|
4750
|
+
});
|
4751
|
+
|
4721
4752
|
if (brushExtent) brush.extent(brushExtent);
|
4722
4753
|
|
4723
4754
|
var brushBG = g.select('.nv-brushBackground').selectAll('g')
|
@@ -4744,7 +4775,7 @@ nv.models.focus = function(content) {
|
|
4744
4775
|
.attr('height', availableHeight);
|
4745
4776
|
gBrush.selectAll('.resize').append('path').attr('d', resizePath);
|
4746
4777
|
|
4747
|
-
onBrush();
|
4778
|
+
onBrush(true);
|
4748
4779
|
|
4749
4780
|
g.select('.nv-background rect')
|
4750
4781
|
.attr('width', availableWidth)
|
@@ -4814,24 +4845,17 @@ nv.models.focus = function(content) {
|
|
4814
4845
|
.attr('width', rightWidth < 0 ? 0 : rightWidth);
|
4815
4846
|
});
|
4816
4847
|
}
|
4817
|
-
|
4818
|
-
|
4819
|
-
function onBrush() {
|
4848
|
+
|
4849
|
+
|
4850
|
+
function onBrush(shouldDispatch) {
|
4820
4851
|
brushExtent = brush.empty() ? null : brush.extent();
|
4821
4852
|
var extent = brush.empty() ? x.domain() : brush.extent();
|
4822
|
-
|
4823
|
-
//The brush extent cannot be less than one. If it is, don't update the line chart.
|
4824
|
-
if (Math.abs(extent[0] - extent[1]) <= 1) {
|
4825
|
-
return;
|
4826
|
-
}
|
4827
|
-
|
4828
4853
|
dispatch.brush({extent: extent, brush: brush});
|
4829
|
-
|
4830
4854
|
updateBrushBG();
|
4831
|
-
|
4855
|
+
if (shouldDispatch) {
|
4856
|
+
dispatch.onBrush(extent);
|
4857
|
+
}
|
4832
4858
|
}
|
4833
|
-
|
4834
|
-
|
4835
4859
|
});
|
4836
4860
|
|
4837
4861
|
renderWatch.renderEnd('focus immediate');
|
@@ -4862,6 +4886,7 @@ nv.models.focus = function(content) {
|
|
4862
4886
|
showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},
|
4863
4887
|
showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},
|
4864
4888
|
brushExtent: {get: function(){return brushExtent;}, set: function(_){brushExtent=_;}},
|
4889
|
+
syncBrushing: {get: function(){return syncBrushing;}, set: function(_){syncBrushing=_;}},
|
4865
4890
|
|
4866
4891
|
// options that require extra logic in the setter
|
4867
4892
|
margin: {get: function(){return margin;}, set: function(_){
|
@@ -4899,7 +4924,7 @@ nv.models.focus = function(content) {
|
|
4899
4924
|
rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){
|
4900
4925
|
rightAlignYAxis = _;
|
4901
4926
|
yAxis.orient( rightAlignYAxis ? 'right' : 'left');
|
4902
|
-
}}
|
4927
|
+
}}
|
4903
4928
|
});
|
4904
4929
|
|
4905
4930
|
nv.utils.inheritOptions(chart, content);
|
@@ -5577,10 +5602,13 @@ nv.models.historicalBar = function() {
|
|
5577
5602
|
})
|
5578
5603
|
.on('click', function(d,i) {
|
5579
5604
|
if (!interactive) return;
|
5605
|
+
var element = this;
|
5580
5606
|
dispatch.elementClick({
|
5581
5607
|
data: d,
|
5582
5608
|
index: i,
|
5583
|
-
color: d3.select(this).style("fill")
|
5609
|
+
color: d3.select(this).style("fill"),
|
5610
|
+
event: d3.event,
|
5611
|
+
element: element
|
5584
5612
|
});
|
5585
5613
|
d3.event.stopPropagation();
|
5586
5614
|
})
|
@@ -5694,6 +5722,7 @@ nv.models.historicalBarChart = function(bar_model) {
|
|
5694
5722
|
|
5695
5723
|
|
5696
5724
|
var margin = {top: 30, right: 90, bottom: 50, left: 90}
|
5725
|
+
, marginTop = null
|
5697
5726
|
, color = nv.utils.defaultColor()
|
5698
5727
|
, width = null
|
5699
5728
|
, height = null
|
@@ -5793,7 +5822,7 @@ nv.models.historicalBarChart = function(bar_model) {
|
|
5793
5822
|
.datum(data)
|
5794
5823
|
.call(legend);
|
5795
5824
|
|
5796
|
-
if (legend.height()
|
5825
|
+
if (!marginTop && legend.height() !== margin.top) {
|
5797
5826
|
margin.top = legend.height();
|
5798
5827
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
5799
5828
|
}
|
@@ -5996,7 +6025,10 @@ nv.models.historicalBarChart = function(bar_model) {
|
|
5996
6025
|
|
5997
6026
|
// options that require extra logic in the setter
|
5998
6027
|
margin: {get: function(){return margin;}, set: function(_){
|
5999
|
-
|
6028
|
+
if (_.top !== undefined) {
|
6029
|
+
margin.top = _.top;
|
6030
|
+
marginTop = _.top;
|
6031
|
+
}
|
6000
6032
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
6001
6033
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
6002
6034
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -6111,7 +6143,10 @@ nv.models.legend = function() {
|
|
6111
6143
|
var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-legend').append('g');
|
6112
6144
|
var g = wrap.select('g');
|
6113
6145
|
|
6114
|
-
|
6146
|
+
if (rightAlign)
|
6147
|
+
wrap.attr('transform', 'translate(' + (- margin.right) + ',' + margin.top + ')');
|
6148
|
+
else
|
6149
|
+
wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
|
6115
6150
|
|
6116
6151
|
var series = g.selectAll('.nv-series')
|
6117
6152
|
.data(function(d) {
|
@@ -6703,6 +6738,7 @@ nv.models.lineChart = function() {
|
|
6703
6738
|
;
|
6704
6739
|
|
6705
6740
|
var margin = {top: 30, right: 20, bottom: 50, left: 60}
|
6741
|
+
, marginTop = null
|
6706
6742
|
, color = nv.utils.defaultColor()
|
6707
6743
|
, width = null
|
6708
6744
|
, height = null
|
@@ -6850,7 +6886,7 @@ nv.models.lineChart = function() {
|
|
6850
6886
|
wrap.select('.nv-legendWrap')
|
6851
6887
|
.attr('transform', 'translate(0,' + availableHeight +')');
|
6852
6888
|
} else if (legendPosition === 'top') {
|
6853
|
-
if (legend.height()
|
6889
|
+
if (!marginTop && legend.height() !== margin.top) {
|
6854
6890
|
margin.top = legend.height();
|
6855
6891
|
availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height() : 0);
|
6856
6892
|
}
|
@@ -6974,14 +7010,20 @@ nv.models.lineChart = function() {
|
|
6974
7010
|
.forEach(function(series,i) {
|
6975
7011
|
var extent = focusEnable ? (focus.brush.empty() ? focus.xScale().domain() : focus.brush.extent()) : x.domain();
|
6976
7012
|
var currentValues = series.values.filter(function(d,i) {
|
6977
|
-
|
7013
|
+
// Checks if the x point is between the extents, handling case where extent[0] is greater than extent[1]
|
7014
|
+
// (e.g. x domain is manually set to reverse the x-axis)
|
7015
|
+
if(extent[0] <= extent[1]) {
|
7016
|
+
return lines.x()(d,i) >= extent[0] && lines.x()(d,i) <= extent[1];
|
7017
|
+
} else {
|
7018
|
+
return lines.x()(d,i) >= extent[1] && lines.x()(d,i) <= extent[0];
|
7019
|
+
}
|
6978
7020
|
});
|
6979
7021
|
|
6980
7022
|
pointIndex = nv.interactiveBisect(currentValues, e.pointXValue, lines.x());
|
6981
7023
|
var point = currentValues[pointIndex];
|
6982
7024
|
var pointYValue = chart.y()(point, pointIndex);
|
6983
7025
|
if (pointYValue !== null) {
|
6984
|
-
lines.highlightPoint(
|
7026
|
+
lines.highlightPoint(i, pointIndex, true);
|
6985
7027
|
}
|
6986
7028
|
if (point === undefined) return;
|
6987
7029
|
if (singlePoint === undefined) singlePoint = point;
|
@@ -7160,7 +7202,10 @@ nv.models.lineChart = function() {
|
|
7160
7202
|
|
7161
7203
|
// options that require extra logic in the setter
|
7162
7204
|
focusMargin: {get: function(){return focus.margin}, set: function(_){
|
7163
|
-
|
7205
|
+
if (_.top !== undefined) {
|
7206
|
+
margin.top = _.top;
|
7207
|
+
marginTop = _.top;
|
7208
|
+
}
|
7164
7209
|
focus.margin.right = _.right !== undefined ? _.right : focus.margin.right;
|
7165
7210
|
focus.margin.bottom = _.bottom !== undefined ? _.bottom : focus.margin.bottom;
|
7166
7211
|
focus.margin.left = _.left !== undefined ? _.left : focus.margin.left;
|
@@ -7252,6 +7297,7 @@ nv.models.linePlusBarChart = function() {
|
|
7252
7297
|
;
|
7253
7298
|
|
7254
7299
|
var margin = {top: 30, right: 30, bottom: 30, left: 60}
|
7300
|
+
, marginTop = null
|
7255
7301
|
, margin2 = {top: 0, right: 30, bottom: 20, left: 60}
|
7256
7302
|
, width = null
|
7257
7303
|
, height = null
|
@@ -7463,7 +7509,7 @@ nv.models.linePlusBarChart = function() {
|
|
7463
7509
|
}))
|
7464
7510
|
.call(legend);
|
7465
7511
|
|
7466
|
-
if (legend.height()
|
7512
|
+
if (!marginTop && legend.height() !== margin.top) {
|
7467
7513
|
margin.top = legend.height();
|
7468
7514
|
// FIXME: shouldn't this be "- (focusEnabled ? focusHeight : 0)"?
|
7469
7515
|
availableHeight1 = nv.utils.availableHeight(height, container, margin) - focusHeight;
|
@@ -7837,7 +7883,10 @@ nv.models.linePlusBarChart = function() {
|
|
7837
7883
|
|
7838
7884
|
// options that require extra logic in the setter
|
7839
7885
|
margin: {get: function(){return margin;}, set: function(_){
|
7840
|
-
|
7886
|
+
if (_.top !== undefined) {
|
7887
|
+
margin.top = _.top;
|
7888
|
+
marginTop = _.top;
|
7889
|
+
}
|
7841
7890
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
7842
7891
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
7843
7892
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -8341,6 +8390,7 @@ nv.models.multiBarChart = function() {
|
|
8341
8390
|
;
|
8342
8391
|
|
8343
8392
|
var margin = {top: 30, right: 20, bottom: 50, left: 60}
|
8393
|
+
, marginTop = null
|
8344
8394
|
, width = null
|
8345
8395
|
, height = null
|
8346
8396
|
, color = nv.utils.defaultColor()
|
@@ -8388,6 +8438,31 @@ nv.models.multiBarChart = function() {
|
|
8388
8438
|
return xAxis.tickFormat()(d, i);
|
8389
8439
|
});
|
8390
8440
|
|
8441
|
+
interactiveLayer.tooltip
|
8442
|
+
.valueFormatter(function(d, i) {
|
8443
|
+
return d == null ? "N/A" : yAxis.tickFormat()(d, i);
|
8444
|
+
})
|
8445
|
+
.headerFormatter(function(d, i) {
|
8446
|
+
return xAxis.tickFormat()(d, i);
|
8447
|
+
});
|
8448
|
+
|
8449
|
+
interactiveLayer.tooltip
|
8450
|
+
.valueFormatter(function (d, i) {
|
8451
|
+
return d == null ? "N/A" : yAxis.tickFormat()(d, i);
|
8452
|
+
})
|
8453
|
+
.headerFormatter(function (d, i) {
|
8454
|
+
return xAxis.tickFormat()(d, i);
|
8455
|
+
});
|
8456
|
+
|
8457
|
+
interactiveLayer.tooltip
|
8458
|
+
.duration(0)
|
8459
|
+
.valueFormatter(function(d, i) {
|
8460
|
+
return yAxis.tickFormat()(d, i);
|
8461
|
+
})
|
8462
|
+
.headerFormatter(function(d, i) {
|
8463
|
+
return xAxis.tickFormat()(d, i);
|
8464
|
+
});
|
8465
|
+
|
8391
8466
|
controls.updateState(false);
|
8392
8467
|
|
8393
8468
|
//============================================================
|
@@ -8493,7 +8568,7 @@ nv.models.multiBarChart = function() {
|
|
8493
8568
|
.datum(data)
|
8494
8569
|
.call(legend);
|
8495
8570
|
|
8496
|
-
if (legend.height()
|
8571
|
+
if (!marginTop && legend.height() !== margin.top) {
|
8497
8572
|
margin.top = legend.height();
|
8498
8573
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
8499
8574
|
}
|
@@ -8773,7 +8848,10 @@ nv.models.multiBarChart = function() {
|
|
8773
8848
|
|
8774
8849
|
// options that require extra logic in the setter
|
8775
8850
|
margin: {get: function(){return margin;}, set: function(_){
|
8776
|
-
|
8851
|
+
if (_.top !== undefined) {
|
8852
|
+
margin.top = _.top;
|
8853
|
+
marginTop = _.top;
|
8854
|
+
}
|
8777
8855
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
8778
8856
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
8779
8857
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -9186,6 +9264,7 @@ nv.models.multiBarHorizontalChart = function() {
|
|
9186
9264
|
;
|
9187
9265
|
|
9188
9266
|
var margin = {top: 30, right: 20, bottom: 50, left: 60}
|
9267
|
+
, marginTop = null
|
9189
9268
|
, width = null
|
9190
9269
|
, height = null
|
9191
9270
|
, color = nv.utils.defaultColor()
|
@@ -9329,7 +9408,7 @@ nv.models.multiBarHorizontalChart = function() {
|
|
9329
9408
|
.datum(data)
|
9330
9409
|
.call(legend);
|
9331
9410
|
|
9332
|
-
if (legend.height()
|
9411
|
+
if (!marginTop && legend.height() !== margin.top) {
|
9333
9412
|
margin.top = legend.height();
|
9334
9413
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
9335
9414
|
}
|
@@ -9517,7 +9596,10 @@ nv.models.multiBarHorizontalChart = function() {
|
|
9517
9596
|
|
9518
9597
|
// options that require extra logic in the setter
|
9519
9598
|
margin: {get: function(){return margin;}, set: function(_){
|
9520
|
-
|
9599
|
+
if (_.top !== undefined) {
|
9600
|
+
margin.top = _.top;
|
9601
|
+
marginTop = _.top;
|
9602
|
+
}
|
9521
9603
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
9522
9604
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
9523
9605
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -9552,6 +9634,7 @@ nv.models.multiChart = function() {
|
|
9552
9634
|
//------------------------------------------------------------
|
9553
9635
|
|
9554
9636
|
var margin = {top: 30, right: 20, bottom: 50, left: 60},
|
9637
|
+
marginTop = null,
|
9555
9638
|
color = nv.utils.defaultColor(),
|
9556
9639
|
width = null,
|
9557
9640
|
height = null,
|
@@ -9565,7 +9648,8 @@ nv.models.multiChart = function() {
|
|
9565
9648
|
useVoronoi = true,
|
9566
9649
|
interactiveLayer = nv.interactiveGuideline(),
|
9567
9650
|
useInteractiveGuideline = false,
|
9568
|
-
legendRightAxisHint = ' (right axis)'
|
9651
|
+
legendRightAxisHint = ' (right axis)',
|
9652
|
+
duration = 250
|
9569
9653
|
;
|
9570
9654
|
|
9571
9655
|
//============================================================
|
@@ -9576,21 +9660,21 @@ nv.models.multiChart = function() {
|
|
9576
9660
|
yScale1 = d3.scale.linear(),
|
9577
9661
|
yScale2 = d3.scale.linear(),
|
9578
9662
|
|
9579
|
-
lines1 = nv.models.line().yScale(yScale1),
|
9580
|
-
lines2 = nv.models.line().yScale(yScale2),
|
9663
|
+
lines1 = nv.models.line().yScale(yScale1).duration(duration),
|
9664
|
+
lines2 = nv.models.line().yScale(yScale2).duration(duration),
|
9581
9665
|
|
9582
|
-
scatters1 = nv.models.scatter().yScale(yScale1),
|
9583
|
-
scatters2 = nv.models.scatter().yScale(yScale2),
|
9666
|
+
scatters1 = nv.models.scatter().yScale(yScale1).duration(duration),
|
9667
|
+
scatters2 = nv.models.scatter().yScale(yScale2).duration(duration),
|
9584
9668
|
|
9585
|
-
bars1 = nv.models.multiBar().stacked(false).yScale(yScale1),
|
9586
|
-
bars2 = nv.models.multiBar().stacked(false).yScale(yScale2),
|
9669
|
+
bars1 = nv.models.multiBar().stacked(false).yScale(yScale1).duration(duration),
|
9670
|
+
bars2 = nv.models.multiBar().stacked(false).yScale(yScale2).duration(duration),
|
9587
9671
|
|
9588
|
-
stack1 = nv.models.stackedArea().yScale(yScale1),
|
9589
|
-
stack2 = nv.models.stackedArea().yScale(yScale2),
|
9672
|
+
stack1 = nv.models.stackedArea().yScale(yScale1).duration(duration),
|
9673
|
+
stack2 = nv.models.stackedArea().yScale(yScale2).duration(duration),
|
9590
9674
|
|
9591
|
-
xAxis = nv.models.axis().scale(x).orient('bottom').tickPadding(5),
|
9592
|
-
yAxis1 = nv.models.axis().scale(yScale1).orient('left'),
|
9593
|
-
yAxis2 = nv.models.axis().scale(yScale2).orient('right'),
|
9675
|
+
xAxis = nv.models.axis().scale(x).orient('bottom').tickPadding(5).duration(duration),
|
9676
|
+
yAxis1 = nv.models.axis().scale(yScale1).orient('left').duration(duration),
|
9677
|
+
yAxis2 = nv.models.axis().scale(yScale2).orient('right').duration(duration),
|
9594
9678
|
|
9595
9679
|
legend = nv.models.legend().height(30),
|
9596
9680
|
tooltip = nv.models.tooltip(),
|
@@ -9685,7 +9769,7 @@ nv.models.multiChart = function() {
|
|
9685
9769
|
}))
|
9686
9770
|
.call(legend);
|
9687
9771
|
|
9688
|
-
if (legend.height()
|
9772
|
+
if (!marginTop && legend.height() !== margin.top) {
|
9689
9773
|
margin.top = legend.height();
|
9690
9774
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
9691
9775
|
}
|
@@ -10071,7 +10155,10 @@ nv.models.multiChart = function() {
|
|
10071
10155
|
|
10072
10156
|
// options that require extra logic in the setter
|
10073
10157
|
margin: {get: function(){return margin;}, set: function(_){
|
10074
|
-
|
10158
|
+
if (_.top !== undefined) {
|
10159
|
+
margin.top = _.top;
|
10160
|
+
marginTop = _.top;
|
10161
|
+
}
|
10075
10162
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
10076
10163
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
10077
10164
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -10123,6 +10210,13 @@ nv.models.multiChart = function() {
|
|
10123
10210
|
scatters1.interactive(false);
|
10124
10211
|
scatters2.interactive(false);
|
10125
10212
|
}
|
10213
|
+
}},
|
10214
|
+
|
10215
|
+
duration: {get: function(){return duration;}, set: function(_) {
|
10216
|
+
duration = _;
|
10217
|
+
[lines1, lines2, stack1, stack2, scatters1, scatters2, xAxis, yAxis1, yAxis2].forEach(function(model){
|
10218
|
+
model.duration(duration);
|
10219
|
+
});
|
10126
10220
|
}}
|
10127
10221
|
});
|
10128
10222
|
|
@@ -10507,6 +10601,7 @@ nv.models.parallelCoordinates = function() {
|
|
10507
10601
|
//Add missing value line at the bottom of the chart
|
10508
10602
|
var missingValuesline, missingValueslineText;
|
10509
10603
|
var step = x.range()[1] - x.range()[0];
|
10604
|
+
step = isNaN(step) ? x.range()[0] : step;
|
10510
10605
|
if (!isNaN(step)) {
|
10511
10606
|
var lineData = [0 + step / 2, availableHeight - 12, availableWidth - step / 2, availableHeight - 12];
|
10512
10607
|
missingValuesline = wrap.select('.missingValuesline').selectAll('line').data([lineData]);
|
@@ -10863,10 +10958,11 @@ nv.models.parallelCoordinatesChart = function () {
|
|
10863
10958
|
var dimensionTooltip = nv.models.tooltip();
|
10864
10959
|
|
10865
10960
|
var margin = { top: 0, right: 0, bottom: 0, left: 0 }
|
10961
|
+
, marginTop = null
|
10866
10962
|
, width = null
|
10867
|
-
|
10963
|
+
, height = null
|
10868
10964
|
, showLegend = true
|
10869
|
-
|
10965
|
+
, color = nv.utils.defaultColor()
|
10870
10966
|
, state = nv.utils.state()
|
10871
10967
|
, dimensionData = []
|
10872
10968
|
, displayBrush = true
|
@@ -10996,7 +11092,7 @@ nv.models.parallelCoordinatesChart = function () {
|
|
10996
11092
|
.datum(dimensionData.sort(function (a, b) { return a.originalPosition - b.originalPosition; }))
|
10997
11093
|
.call(legend);
|
10998
11094
|
|
10999
|
-
if (legend.height()
|
11095
|
+
if (!marginTop && legend.height() !== margin.top) {
|
11000
11096
|
margin.top = legend.height();
|
11001
11097
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
11002
11098
|
}
|
@@ -11129,7 +11225,10 @@ nv.models.parallelCoordinatesChart = function () {
|
|
11129
11225
|
margin: {
|
11130
11226
|
get: function () { return margin; },
|
11131
11227
|
set: function (_) {
|
11132
|
-
|
11228
|
+
if (_.top !== undefined) {
|
11229
|
+
margin.top = _.top;
|
11230
|
+
marginTop = _.top;
|
11231
|
+
}
|
11133
11232
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
11134
11233
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
11135
11234
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -11595,6 +11694,7 @@ nv.models.pieChart = function() {
|
|
11595
11694
|
var tooltip = nv.models.tooltip();
|
11596
11695
|
|
11597
11696
|
var margin = {top: 30, right: 20, bottom: 20, left: 20}
|
11697
|
+
, marginTop = null
|
11598
11698
|
, width = null
|
11599
11699
|
, height = null
|
11600
11700
|
, showTooltipPercent = false
|
@@ -11703,7 +11803,7 @@ nv.models.pieChart = function() {
|
|
11703
11803
|
.datum(data)
|
11704
11804
|
.call(legend);
|
11705
11805
|
|
11706
|
-
if (legend.height()
|
11806
|
+
if (!marginTop && legend.height() !== margin.top) {
|
11707
11807
|
margin.top = legend.height();
|
11708
11808
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
11709
11809
|
}
|
@@ -11820,7 +11920,10 @@ nv.models.pieChart = function() {
|
|
11820
11920
|
pie.duration(duration);
|
11821
11921
|
}},
|
11822
11922
|
margin: {get: function(){return margin;}, set: function(_){
|
11823
|
-
|
11923
|
+
if (_.top !== undefined) {
|
11924
|
+
margin.top = _.top;
|
11925
|
+
marginTop = _.top;
|
11926
|
+
}
|
11824
11927
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
11825
11928
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
11826
11929
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -11830,6 +11933,568 @@ nv.models.pieChart = function() {
|
|
11830
11933
|
nv.utils.initOptions(chart);
|
11831
11934
|
return chart;
|
11832
11935
|
};
|
11936
|
+
nv.models.sankey = function() {
|
11937
|
+
'use strict';
|
11938
|
+
|
11939
|
+
// Sources:
|
11940
|
+
// - https://bost.ocks.org/mike/sankey/
|
11941
|
+
// - https://github.com/soxofaan/d3-plugin-captain-sankey
|
11942
|
+
|
11943
|
+
//============================================================
|
11944
|
+
// Public Variables with Default Settings
|
11945
|
+
//------------------------------------------------------------
|
11946
|
+
|
11947
|
+
var sankey = {},
|
11948
|
+
nodeWidth = 24,
|
11949
|
+
nodePadding = 8,
|
11950
|
+
size = [1, 1],
|
11951
|
+
nodes = [],
|
11952
|
+
links = [],
|
11953
|
+
sinksRight = true;
|
11954
|
+
|
11955
|
+
var layout = function(iterations) {
|
11956
|
+
computeNodeLinks();
|
11957
|
+
computeNodeValues();
|
11958
|
+
computeNodeBreadths();
|
11959
|
+
computeNodeDepths(iterations);
|
11960
|
+
};
|
11961
|
+
|
11962
|
+
var relayout = function() {
|
11963
|
+
computeLinkDepths();
|
11964
|
+
};
|
11965
|
+
|
11966
|
+
// SVG path data generator, to be used as 'd' attribute on 'path' element selection.
|
11967
|
+
var link = function() {
|
11968
|
+
var curvature = .5;
|
11969
|
+
|
11970
|
+
function link(d) {
|
11971
|
+
|
11972
|
+
var x0 = d.source.x + d.source.dx,
|
11973
|
+
x1 = d.target.x,
|
11974
|
+
xi = d3.interpolateNumber(x0, x1),
|
11975
|
+
x2 = xi(curvature),
|
11976
|
+
x3 = xi(1 - curvature),
|
11977
|
+
y0 = d.source.y + d.sy + d.dy / 2,
|
11978
|
+
y1 = d.target.y + d.ty + d.dy / 2;
|
11979
|
+
var linkPath = 'M' + x0 + ',' + y0
|
11980
|
+
+ 'C' + x2 + ',' + y0
|
11981
|
+
+ ' ' + x3 + ',' + y1
|
11982
|
+
+ ' ' + x1 + ',' + y1;
|
11983
|
+
return linkPath;
|
11984
|
+
}
|
11985
|
+
|
11986
|
+
link.curvature = function(_) {
|
11987
|
+
if (!arguments.length) return curvature;
|
11988
|
+
curvature = +_;
|
11989
|
+
return link;
|
11990
|
+
};
|
11991
|
+
|
11992
|
+
return link;
|
11993
|
+
};
|
11994
|
+
|
11995
|
+
// Y-position of the middle of a node.
|
11996
|
+
var center = function(node) {
|
11997
|
+
return node.y + node.dy / 2;
|
11998
|
+
};
|
11999
|
+
|
12000
|
+
//============================================================
|
12001
|
+
// Private Variables
|
12002
|
+
//------------------------------------------------------------
|
12003
|
+
|
12004
|
+
// Populate the sourceLinks and targetLinks for each node.
|
12005
|
+
// Also, if the source and target are not objects, assume they are indices.
|
12006
|
+
function computeNodeLinks() {
|
12007
|
+
nodes.forEach(function(node) {
|
12008
|
+
// Links that have this node as source.
|
12009
|
+
node.sourceLinks = [];
|
12010
|
+
// Links that have this node as target.
|
12011
|
+
node.targetLinks = [];
|
12012
|
+
});
|
12013
|
+
links.forEach(function(link) {
|
12014
|
+
var source = link.source,
|
12015
|
+
target = link.target;
|
12016
|
+
if (typeof source === 'number') source = link.source = nodes[link.source];
|
12017
|
+
if (typeof target === 'number') target = link.target = nodes[link.target];
|
12018
|
+
source.sourceLinks.push(link);
|
12019
|
+
target.targetLinks.push(link);
|
12020
|
+
});
|
12021
|
+
}
|
12022
|
+
|
12023
|
+
// Compute the value (size) of each node by summing the associated links.
|
12024
|
+
function computeNodeValues() {
|
12025
|
+
nodes.forEach(function(node) {
|
12026
|
+
node.value = Math.max(
|
12027
|
+
d3.sum(node.sourceLinks, value),
|
12028
|
+
d3.sum(node.targetLinks, value)
|
12029
|
+
);
|
12030
|
+
});
|
12031
|
+
}
|
12032
|
+
|
12033
|
+
// Iteratively assign the breadth (x-position) for each node.
|
12034
|
+
// Nodes are assigned the maximum breadth of incoming neighbors plus one;
|
12035
|
+
// nodes with no incoming links are assigned breadth zero, while
|
12036
|
+
// nodes with no outgoing links are assigned the maximum breadth.
|
12037
|
+
function computeNodeBreadths() {
|
12038
|
+
//
|
12039
|
+
var remainingNodes = nodes,
|
12040
|
+
nextNodes,
|
12041
|
+
x = 0;
|
12042
|
+
|
12043
|
+
// Work from left to right.
|
12044
|
+
// Keep updating the breath (x-position) of nodes that are target of recently updated nodes.
|
12045
|
+
//
|
12046
|
+
while (remainingNodes.length && x < nodes.length) {
|
12047
|
+
nextNodes = [];
|
12048
|
+
remainingNodes.forEach(function(node) {
|
12049
|
+
node.x = x;
|
12050
|
+
node.dx = nodeWidth;
|
12051
|
+
node.sourceLinks.forEach(function(link) {
|
12052
|
+
if (nextNodes.indexOf(link.target) < 0) {
|
12053
|
+
nextNodes.push(link.target);
|
12054
|
+
}
|
12055
|
+
});
|
12056
|
+
});
|
12057
|
+
remainingNodes = nextNodes;
|
12058
|
+
++x;
|
12059
|
+
//
|
12060
|
+
}
|
12061
|
+
|
12062
|
+
// Optionally move pure sinks always to the right.
|
12063
|
+
if (sinksRight) {
|
12064
|
+
moveSinksRight(x);
|
12065
|
+
}
|
12066
|
+
|
12067
|
+
scaleNodeBreadths((size[0] - nodeWidth) / (x - 1));
|
12068
|
+
}
|
12069
|
+
|
12070
|
+
function moveSourcesRight() {
|
12071
|
+
nodes.forEach(function(node) {
|
12072
|
+
if (!node.targetLinks.length) {
|
12073
|
+
node.x = d3.min(node.sourceLinks, function(d) { return d.target.x; }) - 1;
|
12074
|
+
}
|
12075
|
+
});
|
12076
|
+
}
|
12077
|
+
|
12078
|
+
function moveSinksRight(x) {
|
12079
|
+
nodes.forEach(function(node) {
|
12080
|
+
if (!node.sourceLinks.length) {
|
12081
|
+
node.x = x - 1;
|
12082
|
+
}
|
12083
|
+
});
|
12084
|
+
}
|
12085
|
+
|
12086
|
+
function scaleNodeBreadths(kx) {
|
12087
|
+
nodes.forEach(function(node) {
|
12088
|
+
node.x *= kx;
|
12089
|
+
});
|
12090
|
+
}
|
12091
|
+
|
12092
|
+
// Compute the depth (y-position) for each node.
|
12093
|
+
function computeNodeDepths(iterations) {
|
12094
|
+
// Group nodes by breath.
|
12095
|
+
var nodesByBreadth = d3.nest()
|
12096
|
+
.key(function(d) { return d.x; })
|
12097
|
+
.sortKeys(d3.ascending)
|
12098
|
+
.entries(nodes)
|
12099
|
+
.map(function(d) { return d.values; });
|
12100
|
+
|
12101
|
+
//
|
12102
|
+
initializeNodeDepth();
|
12103
|
+
resolveCollisions();
|
12104
|
+
computeLinkDepths();
|
12105
|
+
for (var alpha = 1; iterations > 0; --iterations) {
|
12106
|
+
relaxRightToLeft(alpha *= .99);
|
12107
|
+
resolveCollisions();
|
12108
|
+
computeLinkDepths();
|
12109
|
+
relaxLeftToRight(alpha);
|
12110
|
+
resolveCollisions();
|
12111
|
+
computeLinkDepths();
|
12112
|
+
}
|
12113
|
+
|
12114
|
+
function initializeNodeDepth() {
|
12115
|
+
// Calculate vertical scaling factor.
|
12116
|
+
var ky = d3.min(nodesByBreadth, function(nodes) {
|
12117
|
+
return (size[1] - (nodes.length - 1) * nodePadding) / d3.sum(nodes, value);
|
12118
|
+
});
|
12119
|
+
|
12120
|
+
nodesByBreadth.forEach(function(nodes) {
|
12121
|
+
nodes.forEach(function(node, i) {
|
12122
|
+
node.y = i;
|
12123
|
+
node.dy = node.value * ky;
|
12124
|
+
});
|
12125
|
+
});
|
12126
|
+
|
12127
|
+
links.forEach(function(link) {
|
12128
|
+
link.dy = link.value * ky;
|
12129
|
+
});
|
12130
|
+
}
|
12131
|
+
|
12132
|
+
function relaxLeftToRight(alpha) {
|
12133
|
+
nodesByBreadth.forEach(function(nodes, breadth) {
|
12134
|
+
nodes.forEach(function(node) {
|
12135
|
+
if (node.targetLinks.length) {
|
12136
|
+
// Value-weighted average of the y-position of source node centers linked to this node.
|
12137
|
+
var y = d3.sum(node.targetLinks, weightedSource) / d3.sum(node.targetLinks, value);
|
12138
|
+
node.y += (y - center(node)) * alpha;
|
12139
|
+
}
|
12140
|
+
});
|
12141
|
+
});
|
12142
|
+
|
12143
|
+
function weightedSource(link) {
|
12144
|
+
return (link.source.y + link.sy + link.dy / 2) * link.value;
|
12145
|
+
}
|
12146
|
+
}
|
12147
|
+
|
12148
|
+
function relaxRightToLeft(alpha) {
|
12149
|
+
nodesByBreadth.slice().reverse().forEach(function(nodes) {
|
12150
|
+
nodes.forEach(function(node) {
|
12151
|
+
if (node.sourceLinks.length) {
|
12152
|
+
// Value-weighted average of the y-positions of target nodes linked to this node.
|
12153
|
+
var y = d3.sum(node.sourceLinks, weightedTarget) / d3.sum(node.sourceLinks, value);
|
12154
|
+
node.y += (y - center(node)) * alpha;
|
12155
|
+
}
|
12156
|
+
});
|
12157
|
+
});
|
12158
|
+
|
12159
|
+
function weightedTarget(link) {
|
12160
|
+
return (link.target.y + link.ty + link.dy / 2) * link.value;
|
12161
|
+
}
|
12162
|
+
}
|
12163
|
+
|
12164
|
+
function resolveCollisions() {
|
12165
|
+
nodesByBreadth.forEach(function(nodes) {
|
12166
|
+
var node,
|
12167
|
+
dy,
|
12168
|
+
y0 = 0,
|
12169
|
+
n = nodes.length,
|
12170
|
+
i;
|
12171
|
+
|
12172
|
+
// Push any overlapping nodes down.
|
12173
|
+
nodes.sort(ascendingDepth);
|
12174
|
+
for (i = 0; i < n; ++i) {
|
12175
|
+
node = nodes[i];
|
12176
|
+
dy = y0 - node.y;
|
12177
|
+
if (dy > 0) node.y += dy;
|
12178
|
+
y0 = node.y + node.dy + nodePadding;
|
12179
|
+
}
|
12180
|
+
|
12181
|
+
// If the bottommost node goes outside the bounds, push it back up.
|
12182
|
+
dy = y0 - nodePadding - size[1];
|
12183
|
+
if (dy > 0) {
|
12184
|
+
y0 = node.y -= dy;
|
12185
|
+
|
12186
|
+
// Push any overlapping nodes back up.
|
12187
|
+
for (i = n - 2; i >= 0; --i) {
|
12188
|
+
node = nodes[i];
|
12189
|
+
dy = node.y + node.dy + nodePadding - y0;
|
12190
|
+
if (dy > 0) node.y -= dy;
|
12191
|
+
y0 = node.y;
|
12192
|
+
}
|
12193
|
+
}
|
12194
|
+
});
|
12195
|
+
}
|
12196
|
+
|
12197
|
+
function ascendingDepth(a, b) {
|
12198
|
+
return a.y - b.y;
|
12199
|
+
}
|
12200
|
+
}
|
12201
|
+
|
12202
|
+
// Compute y-offset of the source endpoint (sy) and target endpoints (ty) of links,
|
12203
|
+
// relative to the source/target node's y-position.
|
12204
|
+
function computeLinkDepths() {
|
12205
|
+
nodes.forEach(function(node) {
|
12206
|
+
node.sourceLinks.sort(ascendingTargetDepth);
|
12207
|
+
node.targetLinks.sort(ascendingSourceDepth);
|
12208
|
+
});
|
12209
|
+
nodes.forEach(function(node) {
|
12210
|
+
var sy = 0, ty = 0;
|
12211
|
+
node.sourceLinks.forEach(function(link) {
|
12212
|
+
link.sy = sy;
|
12213
|
+
sy += link.dy;
|
12214
|
+
});
|
12215
|
+
node.targetLinks.forEach(function(link) {
|
12216
|
+
link.ty = ty;
|
12217
|
+
ty += link.dy;
|
12218
|
+
});
|
12219
|
+
});
|
12220
|
+
|
12221
|
+
function ascendingSourceDepth(a, b) {
|
12222
|
+
return a.source.y - b.source.y;
|
12223
|
+
}
|
12224
|
+
|
12225
|
+
function ascendingTargetDepth(a, b) {
|
12226
|
+
return a.target.y - b.target.y;
|
12227
|
+
}
|
12228
|
+
}
|
12229
|
+
|
12230
|
+
// Value property accessor.
|
12231
|
+
function value(x) {
|
12232
|
+
return x.value;
|
12233
|
+
}
|
12234
|
+
|
12235
|
+
sankey.options = nv.utils.optionsFunc.bind(sankey);
|
12236
|
+
sankey._options = Object.create({}, {
|
12237
|
+
nodeWidth: {get: function(){return nodeWidth;}, set: function(_){nodeWidth=+_;}},
|
12238
|
+
nodePadding: {get: function(){return nodePadding;}, set: function(_){nodePadding=_;}},
|
12239
|
+
nodes: {get: function(){return nodes;}, set: function(_){nodes=_;}},
|
12240
|
+
links: {get: function(){return links ;}, set: function(_){links=_;}},
|
12241
|
+
size: {get: function(){return size;}, set: function(_){size=_;}},
|
12242
|
+
sinksRight: {get: function(){return sinksRight;}, set: function(_){sinksRight=_;}},
|
12243
|
+
|
12244
|
+
layout: {get: function(){layout(32);}, set: function(_){layout(_);}},
|
12245
|
+
relayout: {get: function(){relayout();}, set: function(_){}},
|
12246
|
+
center: {get: function(){return center();}, set: function(_){
|
12247
|
+
if(typeof _ === 'function'){
|
12248
|
+
center=_;
|
12249
|
+
}
|
12250
|
+
}},
|
12251
|
+
link: {get: function(){return link();}, set: function(_){
|
12252
|
+
if(typeof _ === 'function'){
|
12253
|
+
link=_;
|
12254
|
+
}
|
12255
|
+
return link();
|
12256
|
+
}}
|
12257
|
+
});
|
12258
|
+
|
12259
|
+
nv.utils.initOptions(sankey);
|
12260
|
+
|
12261
|
+
return sankey;
|
12262
|
+
};
|
12263
|
+
nv.models.sankeyChart = function() {
|
12264
|
+
"use strict";
|
12265
|
+
|
12266
|
+
// Sources:
|
12267
|
+
// - https://bost.ocks.org/mike/sankey/
|
12268
|
+
// - https://github.com/soxofaan/d3-plugin-captain-sankey
|
12269
|
+
|
12270
|
+
//============================================================
|
12271
|
+
// Public Variables with Default Settings
|
12272
|
+
//------------------------------------------------------------
|
12273
|
+
|
12274
|
+
var margin = {top: 5, right: 0, bottom: 5, left: 0}
|
12275
|
+
, sankey = nv.models.sankey()
|
12276
|
+
, width = 600
|
12277
|
+
, height = 400
|
12278
|
+
, nodeWidth = 36
|
12279
|
+
, nodePadding = 40
|
12280
|
+
, units = 'units'
|
12281
|
+
, center = undefined
|
12282
|
+
;
|
12283
|
+
|
12284
|
+
//============================================================
|
12285
|
+
// Private Variables
|
12286
|
+
//------------------------------------------------------------
|
12287
|
+
|
12288
|
+
var formatNumber = d3.format(',.0f'); // zero decimal places
|
12289
|
+
var format = function(d) {
|
12290
|
+
return formatNumber(d) + ' ' + units;
|
12291
|
+
};
|
12292
|
+
var color = d3.scale.category20();
|
12293
|
+
var linkTitle = function(d){
|
12294
|
+
return d.source.name + ' → ' + d.target.name + '\n' + format(d.value);
|
12295
|
+
};
|
12296
|
+
var nodeFillColor = function(d){
|
12297
|
+
return d.color = color(d.name.replace(/ .*/, ''));
|
12298
|
+
};
|
12299
|
+
var nodeStrokeColor = function(d){
|
12300
|
+
return d3.rgb(d.color).darker(2);
|
12301
|
+
};
|
12302
|
+
var nodeTitle = function(d){
|
12303
|
+
return d.name + '\n' + format(d.value);
|
12304
|
+
};
|
12305
|
+
|
12306
|
+
var showError = function(element, message) {
|
12307
|
+
element.append('text')
|
12308
|
+
.attr('x', 0)
|
12309
|
+
.attr('y', 0)
|
12310
|
+
.attr('class', 'nvd3-sankey-chart-error')
|
12311
|
+
.attr('text-anchor', 'middle')
|
12312
|
+
.text(message);
|
12313
|
+
};
|
12314
|
+
|
12315
|
+
function chart(selection) {
|
12316
|
+
selection.each(function(data) {
|
12317
|
+
|
12318
|
+
var testData = {
|
12319
|
+
nodes:
|
12320
|
+
[
|
12321
|
+
{'node': 1, 'name': 'Test 1'},
|
12322
|
+
{'node': 2, 'name': 'Test 2'},
|
12323
|
+
{'node': 3, 'name': 'Test 3'},
|
12324
|
+
{'node': 4, 'name': 'Test 4'},
|
12325
|
+
{'node': 5, 'name': 'Test 5'},
|
12326
|
+
{'node': 6, 'name': 'Test 6'}
|
12327
|
+
],
|
12328
|
+
links:
|
12329
|
+
[
|
12330
|
+
{'source': 0, 'target': 1, 'value': 2295},
|
12331
|
+
{'source': 0, 'target': 5, 'value': 1199},
|
12332
|
+
{'source': 1, 'target': 2, 'value': 1119},
|
12333
|
+
{'source': 1, 'target': 5, 'value': 1176},
|
12334
|
+
{'source': 2, 'target': 3, 'value': 487},
|
12335
|
+
{'source': 2, 'target': 5, 'value': 632},
|
12336
|
+
{'source': 3, 'target': 4, 'value': 301},
|
12337
|
+
{'source': 3, 'target': 5, 'value': 186}
|
12338
|
+
]
|
12339
|
+
};
|
12340
|
+
|
12341
|
+
// Error handling
|
12342
|
+
var isDataValid = false;
|
12343
|
+
var dataAvailable = false;
|
12344
|
+
|
12345
|
+
// check if data is valid
|
12346
|
+
if(
|
12347
|
+
(typeof data['nodes'] === 'object' && data['nodes'].length) >= 0 &&
|
12348
|
+
(typeof data['links'] === 'object' && data['links'].length) >= 0
|
12349
|
+
){
|
12350
|
+
isDataValid = true;
|
12351
|
+
}
|
12352
|
+
|
12353
|
+
// check if data is available
|
12354
|
+
if(
|
12355
|
+
data['nodes'] && data['nodes'].length > 0 &&
|
12356
|
+
data['links'] && data['links'].length > 0
|
12357
|
+
) {
|
12358
|
+
dataAvailable = true;
|
12359
|
+
}
|
12360
|
+
|
12361
|
+
// show error
|
12362
|
+
if(!isDataValid) {
|
12363
|
+
console.error('NVD3 Sankey chart error:', 'invalid data format for', data);
|
12364
|
+
console.info('Valid data format is: ', testData, JSON.stringify(testData));
|
12365
|
+
showError(selection, 'Error loading chart, data is invalid');
|
12366
|
+
return false;
|
12367
|
+
}
|
12368
|
+
|
12369
|
+
// TODO use nv.utils.noData
|
12370
|
+
if(!dataAvailable) {
|
12371
|
+
showError(selection, 'No data available');
|
12372
|
+
return false;
|
12373
|
+
}
|
12374
|
+
|
12375
|
+
// No errors, continue
|
12376
|
+
|
12377
|
+
// append the svg canvas to the page
|
12378
|
+
var svg = selection.append('svg')
|
12379
|
+
.attr('width', width)
|
12380
|
+
.attr('height', height)
|
12381
|
+
.append('g')
|
12382
|
+
.attr('class', 'nvd3 nv-wrap nv-sankeyChart');
|
12383
|
+
|
12384
|
+
// Set the sankey diagram properties
|
12385
|
+
sankey
|
12386
|
+
.nodeWidth(nodeWidth)
|
12387
|
+
.nodePadding(nodePadding)
|
12388
|
+
.size([width, height]);
|
12389
|
+
|
12390
|
+
var path = sankey.link();
|
12391
|
+
|
12392
|
+
sankey
|
12393
|
+
.nodes(data.nodes)
|
12394
|
+
.links(data.links)
|
12395
|
+
.layout(32)
|
12396
|
+
.center(center);
|
12397
|
+
|
12398
|
+
// add in the links
|
12399
|
+
var link = svg.append('g').selectAll('.link')
|
12400
|
+
.data(data.links)
|
12401
|
+
.enter().append('path')
|
12402
|
+
.attr('class', 'link')
|
12403
|
+
.attr('d', path)
|
12404
|
+
.style('stroke-width', function(d) { return Math.max(1, d.dy); })
|
12405
|
+
.sort(function(a,b) { return b.dy - a.dy; });
|
12406
|
+
|
12407
|
+
// add the link titles
|
12408
|
+
link.append('title')
|
12409
|
+
.text(linkTitle);
|
12410
|
+
|
12411
|
+
// add in the nodes
|
12412
|
+
var node = svg.append('g').selectAll('.node')
|
12413
|
+
.data(data.nodes)
|
12414
|
+
.enter().append('g')
|
12415
|
+
.attr('class', 'node')
|
12416
|
+
.attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')'; })
|
12417
|
+
.call(
|
12418
|
+
d3.behavior
|
12419
|
+
.drag()
|
12420
|
+
.origin(function(d) { return d; })
|
12421
|
+
.on('dragstart', function() {
|
12422
|
+
this.parentNode.appendChild(this);
|
12423
|
+
})
|
12424
|
+
.on('drag', dragmove)
|
12425
|
+
);
|
12426
|
+
|
12427
|
+
// add the rectangles for the nodes
|
12428
|
+
node.append('rect')
|
12429
|
+
.attr('height', function(d) { return d.dy; })
|
12430
|
+
.attr('width', sankey.nodeWidth())
|
12431
|
+
.style('fill', nodeFillColor)
|
12432
|
+
.style('stroke', nodeStrokeColor)
|
12433
|
+
.append('title')
|
12434
|
+
.text(nodeTitle);
|
12435
|
+
|
12436
|
+
// add in the title for the nodes
|
12437
|
+
node.append('text')
|
12438
|
+
.attr('x', -6)
|
12439
|
+
.attr('y', function(d) { return d.dy / 2; })
|
12440
|
+
.attr('dy', '.35em')
|
12441
|
+
.attr('text-anchor', 'end')
|
12442
|
+
.attr('transform', null)
|
12443
|
+
.text(function(d) { return d.name; })
|
12444
|
+
.filter(function(d) { return d.x < width / 2; })
|
12445
|
+
.attr('x', 6 + sankey.nodeWidth())
|
12446
|
+
.attr('text-anchor', 'start');
|
12447
|
+
|
12448
|
+
// the function for moving the nodes
|
12449
|
+
function dragmove(d) {
|
12450
|
+
d3.select(this).attr('transform',
|
12451
|
+
'translate(' + d.x + ',' + (
|
12452
|
+
d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))
|
12453
|
+
) + ')');
|
12454
|
+
sankey.relayout();
|
12455
|
+
link.attr('d', path);
|
12456
|
+
}
|
12457
|
+
});
|
12458
|
+
|
12459
|
+
return chart;
|
12460
|
+
}
|
12461
|
+
|
12462
|
+
//============================================================
|
12463
|
+
// Expose Public Variables
|
12464
|
+
//------------------------------------------------------------
|
12465
|
+
|
12466
|
+
chart.options = nv.utils.optionsFunc.bind(chart);
|
12467
|
+
|
12468
|
+
chart._options = Object.create({}, {
|
12469
|
+
// simple options, just get/set the necessary values
|
12470
|
+
units: {get: function(){return units;}, set: function(_){units=_;}},
|
12471
|
+
width: {get: function(){return width;}, set: function(_){width=_;}},
|
12472
|
+
height: {get: function(){return height;}, set: function(_){height=_;}},
|
12473
|
+
format: {get: function(){return format;}, set: function(_){format=_;}},
|
12474
|
+
linkTitle: {get: function(){return linkTitle;}, set: function(_){linkTitle=_;}},
|
12475
|
+
nodeWidth: {get: function(){return nodeWidth;}, set: function(_){nodeWidth=_;}},
|
12476
|
+
nodePadding: {get: function(){return nodePadding;}, set: function(_){nodePadding=_;}},
|
12477
|
+
center: {get: function(){return center}, set: function(_){center=_}},
|
12478
|
+
|
12479
|
+
// options that require extra logic in the setter
|
12480
|
+
margin: {get: function(){return margin;}, set: function(_){
|
12481
|
+
margin.top = _.top !== undefined ? _.top : margin.top;
|
12482
|
+
margin.right = _.right !== undefined ? _.right : margin.right;
|
12483
|
+
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
12484
|
+
margin.left = _.left !== undefined ? _.left : margin.left;
|
12485
|
+
}},
|
12486
|
+
nodeStyle: {get: function(){return {};}, set: function(_){
|
12487
|
+
nodeFillColor = _.fillColor !== undefined ? _.fillColor : nodeFillColor;
|
12488
|
+
nodeStrokeColor = _.strokeColor !== undefined ? _.strokeColor : nodeStrokeColor;
|
12489
|
+
nodeTitle = _.title !== undefined ? _.title : nodeTitle;
|
12490
|
+
}}
|
12491
|
+
|
12492
|
+
});
|
12493
|
+
|
12494
|
+
nv.utils.initOptions(chart);
|
12495
|
+
|
12496
|
+
return chart;
|
12497
|
+
};
|
11833
12498
|
|
11834
12499
|
nv.models.scatter = function() {
|
11835
12500
|
"use strict";
|
@@ -11842,6 +12507,7 @@ nv.models.scatter = function() {
|
|
11842
12507
|
, width = null
|
11843
12508
|
, height = null
|
11844
12509
|
, color = nv.utils.defaultColor() // chooses color
|
12510
|
+
, pointBorderColor = null
|
11845
12511
|
, id = Math.floor(Math.random() * 100000) //Create semi-unique ID incase user doesn't select one
|
11846
12512
|
, container = null
|
11847
12513
|
, x = d3.scale.linear()
|
@@ -11873,7 +12539,7 @@ nv.models.scatter = function() {
|
|
11873
12539
|
, useVoronoi = true
|
11874
12540
|
, duration = 250
|
11875
12541
|
, interactiveUpdateDelay = 300
|
11876
|
-
, showLabels = false
|
12542
|
+
, showLabels = false
|
11877
12543
|
;
|
11878
12544
|
|
11879
12545
|
|
@@ -11882,32 +12548,37 @@ nv.models.scatter = function() {
|
|
11882
12548
|
//------------------------------------------------------------
|
11883
12549
|
|
11884
12550
|
var x0, y0, z0 // used to store previous scales
|
12551
|
+
, width0
|
12552
|
+
, height0
|
11885
12553
|
, timeoutID
|
11886
12554
|
, needsUpdate = false // Flag for when the points are visually updating, but the interactive layer is behind, to disable tooltips
|
11887
12555
|
, renderWatch = nv.utils.renderWatch(dispatch, duration)
|
11888
12556
|
, _sizeRange_def = [16, 256]
|
11889
|
-
,
|
12557
|
+
, _cache = {}
|
11890
12558
|
;
|
11891
12559
|
|
11892
12560
|
function getCache(d) {
|
11893
|
-
var
|
11894
|
-
|
11895
|
-
|
11896
|
-
|
11897
|
-
|
11898
|
-
|
11899
|
-
|
12561
|
+
var key, val;
|
12562
|
+
key = d[0].series + ':' + d[1];
|
12563
|
+
val = _cache[key] = _cache[key] || {};
|
12564
|
+
return val;
|
12565
|
+
}
|
12566
|
+
|
12567
|
+
function delCache(d) {
|
12568
|
+
var key, val;
|
12569
|
+
key = d[0].series + ':' + d[1];
|
12570
|
+
delete _cache[key];
|
11900
12571
|
}
|
11901
12572
|
|
11902
12573
|
function getDiffs(d) {
|
11903
|
-
var i, key,
|
11904
|
-
point = d[0],
|
12574
|
+
var i, key, val,
|
11905
12575
|
cache = getCache(d),
|
11906
12576
|
diffs = false;
|
11907
|
-
for (i = 1; i < arguments.length; i
|
12577
|
+
for (i = 1; i < arguments.length; i += 2) {
|
11908
12578
|
key = arguments[i];
|
11909
|
-
|
11910
|
-
|
12579
|
+
val = arguments[i + 1](d[0], d[1]);
|
12580
|
+
if (cache[key] !== val || !cache.hasOwnProperty(key)) {
|
12581
|
+
cache[key] = val;
|
11911
12582
|
diffs = true;
|
11912
12583
|
}
|
11913
12584
|
}
|
@@ -11931,7 +12602,7 @@ nv.models.scatter = function() {
|
|
11931
12602
|
});
|
11932
12603
|
|
11933
12604
|
// Setup Scales
|
11934
|
-
var logScale = chart.yScale().name === d3.scale.log().name ? true : false;
|
12605
|
+
var logScale = chart.yScale().name === d3.scale.log().name ? true : false;
|
11935
12606
|
// remap and flatten the data for use in calculating the scales' domains
|
11936
12607
|
var seriesData = (xDomain && yDomain && sizeDomain) ? [] : // if we know xDomain and yDomain and sizeDomain, no need to calculate.... if Size is constant remember to set sizeDomain to speed up performance
|
11937
12608
|
d3.merge(
|
@@ -11993,6 +12664,11 @@ nv.models.scatter = function() {
|
|
11993
12664
|
|
11994
12665
|
var scaleDiff = x(1) !== x0(1) || y(1) !== y0(1) || z(1) !== z0(1);
|
11995
12666
|
|
12667
|
+
width0 = width0 || width;
|
12668
|
+
height0 = height0 || height;
|
12669
|
+
|
12670
|
+
var sizeDiff = width0 !== width || height0 !== height;
|
12671
|
+
|
11996
12672
|
// Setup containers and skeleton of chart
|
11997
12673
|
var wrap = container.selectAll('g.nv-wrap.nv-scatter').data([data]);
|
11998
12674
|
var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-scatter nv-chart-' + id);
|
@@ -12009,11 +12685,12 @@ nv.models.scatter = function() {
|
|
12009
12685
|
|
12010
12686
|
defsEnter.append('clipPath')
|
12011
12687
|
.attr('id', 'nv-edge-clip-' + id)
|
12012
|
-
.append('rect')
|
12013
|
-
|
12688
|
+
.append('rect')
|
12689
|
+
.attr('transform', 'translate( -10, -10)');
|
12690
|
+
|
12014
12691
|
wrap.select('#nv-edge-clip-' + id + ' rect')
|
12015
|
-
.attr('width', availableWidth)
|
12016
|
-
.attr('height', (availableHeight > 0) ? availableHeight : 0);
|
12692
|
+
.attr('width', availableWidth + 20)
|
12693
|
+
.attr('height', (availableHeight > 0) ? availableHeight + 20 : 0);
|
12017
12694
|
|
12018
12695
|
g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : '');
|
12019
12696
|
|
@@ -12111,7 +12788,7 @@ nv.models.scatter = function() {
|
|
12111
12788
|
.attr('r', clipRadius);
|
12112
12789
|
}
|
12113
12790
|
|
12114
|
-
var mouseEventCallback = function(d, mDispatch) {
|
12791
|
+
var mouseEventCallback = function(el, d, mDispatch) {
|
12115
12792
|
if (needsUpdate) return 0;
|
12116
12793
|
var series = data[d.series];
|
12117
12794
|
if (series === undefined) return;
|
@@ -12138,22 +12815,24 @@ nv.models.scatter = function() {
|
|
12138
12815
|
pos: pos,
|
12139
12816
|
relativePos: [x(getX(point, d.point)) + margin.left, y(getY(point, d.point)) + margin.top],
|
12140
12817
|
seriesIndex: d.series,
|
12141
|
-
pointIndex: d.point
|
12818
|
+
pointIndex: d.point,
|
12819
|
+
event: d3.event,
|
12820
|
+
element: el
|
12142
12821
|
});
|
12143
12822
|
};
|
12144
12823
|
|
12145
12824
|
pointPaths
|
12146
12825
|
.on('click', function(d) {
|
12147
|
-
mouseEventCallback(d, dispatch.elementClick);
|
12826
|
+
mouseEventCallback(this, d, dispatch.elementClick);
|
12148
12827
|
})
|
12149
12828
|
.on('dblclick', function(d) {
|
12150
|
-
mouseEventCallback(d, dispatch.elementDblClick);
|
12829
|
+
mouseEventCallback(this, d, dispatch.elementDblClick);
|
12151
12830
|
})
|
12152
12831
|
.on('mouseover', function(d) {
|
12153
|
-
mouseEventCallback(d, dispatch.elementMouseover);
|
12832
|
+
mouseEventCallback(this, d, dispatch.elementMouseover);
|
12154
12833
|
})
|
12155
12834
|
.on('mouseout', function(d, i) {
|
12156
|
-
mouseEventCallback(d, dispatch.elementMouseout);
|
12835
|
+
mouseEventCallback(this, d, dispatch.elementMouseout);
|
12157
12836
|
});
|
12158
12837
|
|
12159
12838
|
} else {
|
@@ -12242,7 +12921,7 @@ nv.models.scatter = function() {
|
|
12242
12921
|
.classed('hover', function(d) { return d.hover });
|
12243
12922
|
groups.watchTransition(renderWatch, 'scatter: groups')
|
12244
12923
|
.style('fill', function(d,i) { return color(d, i) })
|
12245
|
-
.style('stroke', function(d,i) { return color(d, i) })
|
12924
|
+
.style('stroke', function(d,i) { return d.pointBorderColor || pointBorderColor || color(d, i) })
|
12246
12925
|
.style('stroke-opacity', 1)
|
12247
12926
|
.style('fill-opacity', .5);
|
12248
12927
|
|
@@ -12271,30 +12950,32 @@ nv.models.scatter = function() {
|
|
12271
12950
|
.type(function(d) { return getShape(d[0]); })
|
12272
12951
|
.size(function(d) { return z(getSize(d[0],d[1])) })
|
12273
12952
|
);
|
12274
|
-
points.exit().remove();
|
12953
|
+
points.exit().each(delCache).remove();
|
12275
12954
|
groups.exit().selectAll('path.nv-point')
|
12276
12955
|
.watchTransition(renderWatch, 'scatter exit')
|
12277
12956
|
.attr('transform', function(d) {
|
12278
12957
|
return 'translate(' + nv.utils.NaNtoZero(x(getX(d[0],d[1]))) + ',' + nv.utils.NaNtoZero(y(getY(d[0],d[1]))) + ')'
|
12279
12958
|
})
|
12280
12959
|
.remove();
|
12281
|
-
|
12960
|
+
// Update points position only if "x" or "y" have changed
|
12961
|
+
points.filter(function (d) { return scaleDiff || sizeDiff || getDiffs(d, 'x', getX, 'y', getY); })
|
12282
12962
|
.watchTransition(renderWatch, 'scatter points')
|
12283
12963
|
.attr('transform', function(d) {
|
12284
12964
|
//nv.log(d, getX(d[0],d[1]), x(getX(d[0],d[1])));
|
12285
12965
|
return 'translate(' + nv.utils.NaNtoZero(x(getX(d[0],d[1]))) + ',' + nv.utils.NaNtoZero(y(getY(d[0],d[1]))) + ')'
|
12286
12966
|
});
|
12287
|
-
|
12967
|
+
// Update points appearance only if "shape" or "size" have changed
|
12968
|
+
points.filter(function (d) { return scaleDiff || sizeDiff || getDiffs(d, 'shape', getShape, 'size', getSize); })
|
12288
12969
|
.watchTransition(renderWatch, 'scatter points')
|
12289
12970
|
.attr('d',
|
12290
12971
|
nv.utils.symbol()
|
12291
12972
|
.type(function(d) { return getShape(d[0]); })
|
12292
12973
|
.size(function(d) { return z(getSize(d[0],d[1])) })
|
12293
12974
|
);
|
12294
|
-
|
12295
|
-
// add label a label to scatter chart
|
12975
|
+
|
12976
|
+
// add label a label to scatter chart
|
12296
12977
|
if(showLabels)
|
12297
|
-
{
|
12978
|
+
{
|
12298
12979
|
var titles = groups.selectAll('.nv-label')
|
12299
12980
|
.data(function(d) {
|
12300
12981
|
return d.values.map(
|
@@ -12307,7 +12988,7 @@ nv.models.scatter = function() {
|
|
12307
12988
|
});
|
12308
12989
|
|
12309
12990
|
titles.enter().append('text')
|
12310
|
-
.style('fill', function (d,i) {
|
12991
|
+
.style('fill', function (d,i) {
|
12311
12992
|
return d.color })
|
12312
12993
|
.style('stroke-opacity', 0)
|
12313
12994
|
.style('fill-opacity', 1)
|
@@ -12355,6 +13036,9 @@ nv.models.scatter = function() {
|
|
12355
13036
|
y0 = y.copy();
|
12356
13037
|
z0 = z.copy();
|
12357
13038
|
|
13039
|
+
width0 = width;
|
13040
|
+
height0 = height;
|
13041
|
+
|
12358
13042
|
});
|
12359
13043
|
renderWatch.renderEnd('scatter immediate');
|
12360
13044
|
return chart;
|
@@ -12421,6 +13105,7 @@ nv.models.scatter = function() {
|
|
12421
13105
|
id: {get: function(){return id;}, set: function(_){id=_;}},
|
12422
13106
|
interactiveUpdateDelay: {get:function(){return interactiveUpdateDelay;}, set: function(_){interactiveUpdateDelay=_;}},
|
12423
13107
|
showLabels: {get: function(){return showLabels;}, set: function(_){ showLabels = _;}},
|
13108
|
+
pointBorderColor: {get: function(){return pointBorderColor;}, set: function(_){pointBorderColor=_;}},
|
12424
13109
|
|
12425
13110
|
// simple functor options
|
12426
13111
|
x: {get: function(){return getX;}, set: function(_){getX = d3.functor(_);}},
|
@@ -12471,6 +13156,7 @@ nv.models.scatterChart = function() {
|
|
12471
13156
|
;
|
12472
13157
|
|
12473
13158
|
var margin = {top: 30, right: 20, bottom: 50, left: 75}
|
13159
|
+
, marginTop = null
|
12474
13160
|
, width = null
|
12475
13161
|
, height = null
|
12476
13162
|
, container = null
|
@@ -12620,7 +13306,7 @@ nv.models.scatterChart = function() {
|
|
12620
13306
|
.datum(data)
|
12621
13307
|
.call(legend);
|
12622
13308
|
|
12623
|
-
if (legend.height()
|
13309
|
+
if (!marginTop && legend.height() !== margin.top) {
|
12624
13310
|
margin.top = legend.height();
|
12625
13311
|
availableHeight = nv.utils.availableHeight(height, container, margin);
|
12626
13312
|
}
|
@@ -12821,7 +13507,10 @@ nv.models.scatterChart = function() {
|
|
12821
13507
|
|
12822
13508
|
// options that require extra logic in the setter
|
12823
13509
|
margin: {get: function(){return margin;}, set: function(_){
|
12824
|
-
|
13510
|
+
if (_.top !== undefined) {
|
13511
|
+
margin.top = _.top;
|
13512
|
+
marginTop = _.top;
|
13513
|
+
}
|
12825
13514
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
12826
13515
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
12827
13516
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -13550,12 +14239,14 @@ nv.models.stackedAreaChart = function() {
|
|
13550
14239
|
, focus = nv.models.focus(nv.models.stackedArea())
|
13551
14240
|
;
|
13552
14241
|
|
13553
|
-
var margin = {top:
|
14242
|
+
var margin = {top: 10, right: 25, bottom: 50, left: 60}
|
14243
|
+
, marginTop = null
|
13554
14244
|
, width = null
|
13555
14245
|
, height = null
|
13556
14246
|
, color = nv.utils.defaultColor()
|
13557
14247
|
, showControls = true
|
13558
14248
|
, showLegend = true
|
14249
|
+
, legendPosition = 'top'
|
13559
14250
|
, showXAxis = true
|
13560
14251
|
, showYAxis = true
|
13561
14252
|
, rightAlignYAxis = false
|
@@ -13699,18 +14390,28 @@ nv.models.stackedAreaChart = function() {
|
|
13699
14390
|
if (!showLegend) {
|
13700
14391
|
g.select('.nv-legendWrap').selectAll('*').remove();
|
13701
14392
|
} else {
|
13702
|
-
var legendWidth = (showControls) ? availableWidth - controlWidth : availableWidth;
|
14393
|
+
var legendWidth = (showControls && legendPosition === 'top') ? availableWidth - controlWidth : availableWidth;
|
13703
14394
|
|
13704
14395
|
legend.width(legendWidth);
|
13705
14396
|
g.select('.nv-legendWrap').datum(data).call(legend);
|
13706
14397
|
|
13707
|
-
if (
|
13708
|
-
|
13709
|
-
|
13710
|
-
|
14398
|
+
if (legendPosition === 'bottom') {
|
14399
|
+
// constant from axis.js, plus some margin for better layout
|
14400
|
+
var xAxisHeight = (showXAxis ? 12 : 0) + 10;
|
14401
|
+
margin.bottom = Math.max(legend.height() + xAxisHeight, margin.bottom);
|
14402
|
+
availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height() : 0);
|
14403
|
+
var legendTop = availableHeight + xAxisHeight;
|
14404
|
+
g.select('.nv-legendWrap')
|
14405
|
+
.attr('transform', 'translate(0,' + legendTop +')');
|
14406
|
+
} else if (legendPosition === 'top') {
|
14407
|
+
if (!marginTop && margin.top != legend.height()) {
|
14408
|
+
margin.top = legend.height();
|
14409
|
+
availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height() : 0);
|
14410
|
+
}
|
13711
14411
|
|
13712
|
-
|
13713
|
-
|
14412
|
+
g.select('.nv-legendWrap')
|
14413
|
+
.attr('transform', 'translate(' + (availableWidth-legendWidth) + ',' + (-margin.top) +')');
|
14414
|
+
}
|
13714
14415
|
}
|
13715
14416
|
|
13716
14417
|
// Controls
|
@@ -13757,9 +14458,11 @@ nv.models.stackedAreaChart = function() {
|
|
13757
14458
|
.datum(controlsData)
|
13758
14459
|
.call(controls);
|
13759
14460
|
|
13760
|
-
|
13761
|
-
|
13762
|
-
|
14461
|
+
var requiredTop = Math.max(controls.height(), showLegend && (legendPosition === 'top') ? legend.height() : 0);
|
14462
|
+
|
14463
|
+
if ( margin.top != requiredTop ) {
|
14464
|
+
margin.top = requiredTop;
|
14465
|
+
availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height() : 0);
|
13763
14466
|
}
|
13764
14467
|
|
13765
14468
|
g.select('.nv-controlsWrap')
|
@@ -14117,6 +14820,7 @@ nv.models.stackedAreaChart = function() {
|
|
14117
14820
|
width: {get: function(){return width;}, set: function(_){width=_;}},
|
14118
14821
|
height: {get: function(){return height;}, set: function(_){height=_;}},
|
14119
14822
|
showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}},
|
14823
|
+
legendPosition: {get: function(){return legendPosition;}, set: function(_){legendPosition=_;}},
|
14120
14824
|
showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}},
|
14121
14825
|
showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}},
|
14122
14826
|
defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}},
|
@@ -14132,7 +14836,10 @@ nv.models.stackedAreaChart = function() {
|
|
14132
14836
|
|
14133
14837
|
// options that require extra logic in the setter
|
14134
14838
|
margin: {get: function(){return margin;}, set: function(_){
|
14135
|
-
|
14839
|
+
if (_.top !== undefined) {
|
14840
|
+
margin.top = _.top;
|
14841
|
+
marginTop = _.top;
|
14842
|
+
}
|
14136
14843
|
margin.right = _.right !== undefined ? _.right : margin.right;
|
14137
14844
|
margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;
|
14138
14845
|
margin.left = _.left !== undefined ? _.left : margin.left;
|
@@ -14444,7 +15151,13 @@ nv.models.sunburst = function() {
|
|
14444
15151
|
}
|
14445
15152
|
})
|
14446
15153
|
.style("stroke", "#FFF")
|
14447
|
-
.on("click",
|
15154
|
+
.on("click", function(d,i){
|
15155
|
+
zoomClick(d);
|
15156
|
+
dispatch.elementClick({
|
15157
|
+
data: d,
|
15158
|
+
index: i
|
15159
|
+
})
|
15160
|
+
})
|
14448
15161
|
.on('mouseover', function(d,i){
|
14449
15162
|
d3.select(this).classed('hover', true).style('opacity', 0.8);
|
14450
15163
|
dispatch.elementMouseover({
|
@@ -14707,5 +15420,6 @@ nv.models.sunburstChart = function() {
|
|
14707
15420
|
|
14708
15421
|
};
|
14709
15422
|
|
14710
|
-
nv.version = "1.8.
|
14711
|
-
})();
|
15423
|
+
nv.version = "1.8.5";
|
15424
|
+
})();
|
15425
|
+
//# sourceMappingURL=nv.d3.js.map
|