Skip to content

Commit 8846193

Browse files
committed
add funnel - chanegs to bar
1 parent dd5ff48 commit 8846193

File tree

4 files changed

+153
-104
lines changed

4 files changed

+153
-104
lines changed

src/traces/bar/cross_trace_calc.js

Lines changed: 72 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ function initBase(gd, pa, sa, calcTraces) {
119119
for(i = 0; i < calcTraces.length; i++) {
120120
var cd = calcTraces[i];
121121
var trace = cd[0].trace;
122-
var base = trace.base;
122+
var base = (trace.type === 'funnel') ? trace._base : trace.base;
123123
var b;
124124

125125
// not sure if it really makes sense to have dates for bar size data...
@@ -501,55 +501,100 @@ function setBaseAndTop(gd, sa, sieve) {
501501
var calcTrace = calcTraces[i];
502502
var fullTrace = calcTrace[0].trace;
503503
var pts = [];
504-
var allBarBaseAboveZero = true;
504+
var allBaseAboveZero = true;
505505

506506
for(var j = 0; j < calcTrace.length; j++) {
507507
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;
510510

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);
514514

515515
if(!bar.hasB || !(bar.b > 0 && bar.s > 0)) {
516-
allBarBaseAboveZero = false;
516+
allBaseAboveZero = false;
517517
}
518518
}
519519

520520
fullTrace._extremes[sa._id] = Axes.findExtremes(sa, pts, {
521-
tozero: !allBarBaseAboveZero,
521+
tozero: !allBaseAboveZero,
522522
padded: true
523523
});
524524
}
525525
}
526526

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+
527550
function stackBars(gd, sa, sieve) {
528551
var fullLayout = gd._fullLayout;
529552
var barnorm = fullLayout.barnorm;
530553
var sLetter = getAxisLetter(sa);
531554
var calcTraces = sieve.traces;
532555

556+
var totalValues = computeTotalVaules(sieve.traces);
557+
var seen = [];
558+
533559
for(var i = 0; i < calcTraces.length; i++) {
534560
var calcTrace = calcTraces[i];
535561
var fullTrace = calcTrace[0].trace;
536562
var pts = [];
537563

564+
var isFunnel = (fullTrace.type === 'funnel');
565+
538566
for(var j = 0; j < calcTrace.length; j++) {
539567
var bar = calcTrace[j];
540568

541569
if(bar.s !== BADNUM) {
542570
// 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;
545588

546589
// 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;
549592

550593
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+
}
553598
}
554599
}
555600
}
@@ -600,12 +645,12 @@ function unhideBarsWithinTrace(gd, sa, sieve) {
600645

601646
if(bar.p !== BADNUM) {
602647
// 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);
604649

605650
// if previous sum if non-zero, this means:
606651
// multiple bars have same starting point are potentially hidden,
607652
// shift them vertically so that all bars are visible by default
608-
if(barBase) bar.b = barBase;
653+
if(base) bar.b = base;
609654
}
610655
}
611656
}
@@ -636,7 +681,7 @@ function normalizeBars(gd, sa, sieve) {
636681
var calcTrace = calcTraces[i];
637682
var fullTrace = calcTrace[0].trace;
638683
var pts = [];
639-
var allBarBaseAboveZero = true;
684+
var allBaseAboveZero = true;
640685
var padded = false;
641686

642687
for(var j = 0; j < calcTrace.length; j++) {
@@ -647,26 +692,26 @@ function normalizeBars(gd, sa, sieve) {
647692
bar.b *= scale;
648693
bar.s *= scale;
649694

650-
var barBase = bar.b;
651-
var barTop = barBase + bar.s;
695+
var base = bar.b;
696+
var top = base + bar.s;
652697

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);
656701

657702
if(bar.hasB) {
658-
pts.push(barBase);
659-
padded = padded || needsPadding(barBase);
703+
pts.push(base);
704+
padded = padded || needsPadding(base);
660705
}
661706

662707
if(!bar.hasB || !(bar.b > 0 && bar.s > 0)) {
663-
allBarBaseAboveZero = false;
708+
allBaseAboveZero = false;
664709
}
665710
}
666711
}
667712

668713
fullTrace._extremes[sa._id] = Axes.findExtremes(sa, pts, {
669-
tozero: !allBarBaseAboveZero,
714+
tozero: !allBaseAboveZero,
670715
padded: padded
671716
});
672717
}

src/traces/bar/defaults.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ function handleText(traceIn, traceOut, layout, coerce, moduleHasSelUnselected) {
143143

144144
coerce('cliponaxis');
145145
}
146+
147+
if(hasInside && traceIn.type === 'funnel') {
148+
coerce('insidetextcenter');
149+
}
146150
}
147151

148152
module.exports = {

0 commit comments

Comments
 (0)