@@ -119,7 +119,7 @@ function initBase(gd, pa, sa, calcTraces) {
119
119
for ( i = 0 ; i < calcTraces . length ; i ++ ) {
120
120
var cd = calcTraces [ i ] ;
121
121
var trace = cd [ 0 ] . trace ;
122
- var base = trace . base ;
122
+ var base = ( trace . type === 'funnel' ) ? trace . _base : trace . base ;
123
123
var b ;
124
124
125
125
// not sure if it really makes sense to have dates for bar size data...
@@ -501,55 +501,100 @@ function setBaseAndTop(gd, sa, sieve) {
501
501
var calcTrace = calcTraces [ i ] ;
502
502
var fullTrace = calcTrace [ 0 ] . trace ;
503
503
var pts = [ ] ;
504
- var allBarBaseAboveZero = true ;
504
+ var allBaseAboveZero = true ;
505
505
506
506
for ( var j = 0 ; j < calcTrace . length ; j ++ ) {
507
507
var bar = calcTrace [ j ] ;
508
- var barBase = bar . b ;
509
- var barTop = barBase + bar . s ;
508
+ var base = bar . b ;
509
+ var top = base + bar . s ;
510
510
511
- bar [ sLetter ] = barTop ;
512
- pts . push ( barTop ) ;
513
- if ( bar . hasB ) pts . push ( barBase ) ;
511
+ bar [ sLetter ] = top ;
512
+ pts . push ( top ) ;
513
+ if ( bar . hasB ) pts . push ( base ) ;
514
514
515
515
if ( ! bar . hasB || ! ( bar . b > 0 && bar . s > 0 ) ) {
516
- allBarBaseAboveZero = false ;
516
+ allBaseAboveZero = false ;
517
517
}
518
518
}
519
519
520
520
fullTrace . _extremes [ sa . _id ] = Axes . findExtremes ( sa , pts , {
521
- tozero : ! allBarBaseAboveZero ,
521
+ tozero : ! allBaseAboveZero ,
522
522
padded : true
523
523
} ) ;
524
524
}
525
525
}
526
526
527
+ function computeTotalVaules ( calcTraces ) {
528
+ var totalValues = [ ] ;
529
+
530
+ for ( var i = 0 ; i < calcTraces . length ; i ++ ) {
531
+ var calcTrace = calcTraces [ i ] ;
532
+ var fullTrace = calcTrace [ 0 ] . trace ;
533
+
534
+ var isFunnel = ( fullTrace . type === 'funnel' ) ;
535
+ if ( ! isFunnel ) continue ; // for the moment we only need to compute this for funnels
536
+
537
+ for ( var j = 0 ; j < calcTrace . length ; j ++ ) {
538
+ totalValues [ j ] = totalValues [ j ] || 0 ;
539
+
540
+ var bar = calcTrace [ j ] ;
541
+ if ( bar . s !== BADNUM ) {
542
+ totalValues [ j ] += bar . s ;
543
+ }
544
+ }
545
+ }
546
+
547
+ return totalValues ;
548
+ }
549
+
527
550
function stackBars ( gd , sa , sieve ) {
528
551
var fullLayout = gd . _fullLayout ;
529
552
var barnorm = fullLayout . barnorm ;
530
553
var sLetter = getAxisLetter ( sa ) ;
531
554
var calcTraces = sieve . traces ;
532
555
556
+ var totalValues = computeTotalVaules ( sieve . traces ) ;
557
+ var seen = [ ] ;
558
+
533
559
for ( var i = 0 ; i < calcTraces . length ; i ++ ) {
534
560
var calcTrace = calcTraces [ i ] ;
535
561
var fullTrace = calcTrace [ 0 ] . trace ;
536
562
var pts = [ ] ;
537
563
564
+ var isFunnel = ( fullTrace . type === 'funnel' ) ;
565
+
538
566
for ( var j = 0 ; j < calcTrace . length ; j ++ ) {
539
567
var bar = calcTrace [ j ] ;
540
568
541
569
if ( bar . s !== BADNUM ) {
542
570
// stack current bar and get previous sum
543
- var barBase = sieve . put ( bar . p , bar . b + bar . s ) ;
544
- var barTop = barBase + bar . b + bar . s ;
571
+ var value ;
572
+ if ( isFunnel ) {
573
+ value = bar . s ;
574
+ } else {
575
+ value = bar . s + bar . b ;
576
+ }
577
+
578
+ var initValue = 0 ;
579
+ if ( isFunnel ) {
580
+ if ( ! seen [ j ] ) {
581
+ seen [ j ] = true ;
582
+ initValue = - 0.5 * totalValues [ j ] ;
583
+ }
584
+ }
585
+ var base = sieve . put ( bar . p , value , initValue ) ;
586
+
587
+ var top = base + value ;
545
588
546
589
// store the bar base and top in each calcdata item
547
- bar . b = barBase ;
548
- bar [ sLetter ] = barTop ;
590
+ bar . b = base ;
591
+ bar [ sLetter ] = top ;
549
592
550
593
if ( ! barnorm ) {
551
- pts . push ( barTop ) ;
552
- if ( bar . hasB ) pts . push ( barBase ) ;
594
+ pts . push ( top ) ;
595
+ if ( bar . hasB ) {
596
+ pts . push ( base ) ;
597
+ }
553
598
}
554
599
}
555
600
}
@@ -600,12 +645,12 @@ function unhideBarsWithinTrace(gd, sa, sieve) {
600
645
601
646
if ( bar . p !== BADNUM ) {
602
647
// stack current bar and get previous sum
603
- var barBase = inTraceSieve . put ( bar . p , bar . b + bar . s ) ;
648
+ var base = inTraceSieve . put ( bar . p , bar . b + bar . s ) ;
604
649
605
650
// if previous sum if non-zero, this means:
606
651
// multiple bars have same starting point are potentially hidden,
607
652
// shift them vertically so that all bars are visible by default
608
- if ( barBase ) bar . b = barBase ;
653
+ if ( base ) bar . b = base ;
609
654
}
610
655
}
611
656
}
@@ -636,7 +681,7 @@ function normalizeBars(gd, sa, sieve) {
636
681
var calcTrace = calcTraces [ i ] ;
637
682
var fullTrace = calcTrace [ 0 ] . trace ;
638
683
var pts = [ ] ;
639
- var allBarBaseAboveZero = true ;
684
+ var allBaseAboveZero = true ;
640
685
var padded = false ;
641
686
642
687
for ( var j = 0 ; j < calcTrace . length ; j ++ ) {
@@ -647,26 +692,26 @@ function normalizeBars(gd, sa, sieve) {
647
692
bar . b *= scale ;
648
693
bar . s *= scale ;
649
694
650
- var barBase = bar . b ;
651
- var barTop = barBase + bar . s ;
695
+ var base = bar . b ;
696
+ var top = base + bar . s ;
652
697
653
- bar [ sLetter ] = barTop ;
654
- pts . push ( barTop ) ;
655
- padded = padded || needsPadding ( barTop ) ;
698
+ bar [ sLetter ] = top ;
699
+ pts . push ( top ) ;
700
+ padded = padded || needsPadding ( top ) ;
656
701
657
702
if ( bar . hasB ) {
658
- pts . push ( barBase ) ;
659
- padded = padded || needsPadding ( barBase ) ;
703
+ pts . push ( base ) ;
704
+ padded = padded || needsPadding ( base ) ;
660
705
}
661
706
662
707
if ( ! bar . hasB || ! ( bar . b > 0 && bar . s > 0 ) ) {
663
- allBarBaseAboveZero = false ;
708
+ allBaseAboveZero = false ;
664
709
}
665
710
}
666
711
}
667
712
668
713
fullTrace . _extremes [ sa . _id ] = Axes . findExtremes ( sa , pts , {
669
- tozero : ! allBarBaseAboveZero ,
714
+ tozero : ! allBaseAboveZero ,
670
715
padded : padded
671
716
} ) ;
672
717
}
0 commit comments