From 9b7cd8d68a0d623e1292a8806e2fefa9de8d88c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 25 Mar 2019 15:33:40 -0400 Subject: [PATCH 1/3] lint in Bar.crossTraceCalc - convert sieve instantiation to `new Sieve(traces, {/* */}` signature - more readable barmode switchboard --- src/traces/bar/cross_trace_calc.js | 111 ++++++++++++++++------------- src/traces/bar/sieve.js | 22 +++--- 2 files changed, 73 insertions(+), 60 deletions(-) diff --git a/src/traces/bar/cross_trace_calc.js b/src/traces/bar/cross_trace_calc.js index 916e853eec5..065969a595b 100644 --- a/src/traces/bar/cross_trace_calc.js +++ b/src/traces/bar/cross_trace_calc.js @@ -57,52 +57,57 @@ function setGroupPositions(gd, pa, sa, calcTraces) { if(!calcTraces.length) return; var barmode = gd._fullLayout.barmode; - var overlay = (barmode === 'overlay'); - var group = (barmode === 'group'); var excluded; var included; var i, calcTrace, fullTrace; initBase(gd, pa, sa, calcTraces); - if(overlay) { - setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces); - } else if(group) { - // exclude from the group those traces for which the user set an offset - excluded = []; - included = []; - for(i = 0; i < calcTraces.length; i++) { - calcTrace = calcTraces[i]; - fullTrace = calcTrace[0].trace; - - if(fullTrace.offset === undefined) included.push(calcTrace); - else excluded.push(calcTrace); - } + switch(barmode) { + case 'overlay': + setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces); + break; + + case 'group': + // exclude from the group those traces for which the user set an offset + excluded = []; + included = []; + for(i = 0; i < calcTraces.length; i++) { + calcTrace = calcTraces[i]; + fullTrace = calcTrace[0].trace; + + if(fullTrace.offset === undefined) included.push(calcTrace); + else excluded.push(calcTrace); + } - if(included.length) { - setGroupPositionsInGroupMode(gd, pa, sa, included); - } - if(excluded.length) { - setGroupPositionsInOverlayMode(gd, pa, sa, excluded); - } - } else { - // exclude from the stack those traces for which the user set a base - excluded = []; - included = []; - for(i = 0; i < calcTraces.length; i++) { - calcTrace = calcTraces[i]; - fullTrace = calcTrace[0].trace; - - if(fullTrace.base === undefined) included.push(calcTrace); - else excluded.push(calcTrace); - } + if(included.length) { + setGroupPositionsInGroupMode(gd, pa, sa, included); + } + if(excluded.length) { + setGroupPositionsInOverlayMode(gd, pa, sa, excluded); + } + break; + + case 'stack': + case 'relative': + // exclude from the stack those traces for which the user set a base + excluded = []; + included = []; + for(i = 0; i < calcTraces.length; i++) { + calcTrace = calcTraces[i]; + fullTrace = calcTrace[0].trace; + + if(fullTrace.base === undefined) included.push(calcTrace); + else excluded.push(calcTrace); + } - if(included.length) { - setGroupPositionsInStackOrRelativeMode(gd, pa, sa, included); - } - if(excluded.length) { - setGroupPositionsInOverlayMode(gd, pa, sa, excluded); - } + if(included.length) { + setGroupPositionsInStackOrRelativeMode(gd, pa, sa, included); + } + if(excluded.length) { + setGroupPositionsInOverlayMode(gd, pa, sa, excluded); + } + break; } collectExtents(calcTraces, pa); @@ -154,13 +159,15 @@ function initBase(gd, pa, sa, calcTraces) { function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces) { var barnorm = gd._fullLayout.barnorm; - var separateNegativeValues = false; - var dontMergeOverlappingData = !barnorm; // update position axis and set bar offsets and widths for(var i = 0; i < calcTraces.length; i++) { var calcTrace = calcTraces[i]; - var sieve = new Sieve([calcTrace], separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve([calcTrace], { + separateNegativeValues: false, + dontMergeOverlappingData: !barnorm + }); // set bar offsets and widths, and update position axis setOffsetAndWidth(gd, pa, sieve); @@ -182,9 +189,11 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces) { function setGroupPositionsInGroupMode(gd, pa, sa, calcTraces) { var fullLayout = gd._fullLayout; var barnorm = fullLayout.barnorm; - var separateNegativeValues = false; - var dontMergeOverlappingData = !barnorm; - var sieve = new Sieve(calcTraces, separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve(calcTraces, { + separateNegativeValues: false, + dontMergeOverlappingData: !barnorm + }); // set bar offsets and widths, and update position axis setOffsetAndWidthInGroupMode(gd, pa, sieve); @@ -201,12 +210,12 @@ function setGroupPositionsInGroupMode(gd, pa, sa, calcTraces) { function setGroupPositionsInStackOrRelativeMode(gd, pa, sa, calcTraces) { var fullLayout = gd._fullLayout; var barmode = fullLayout.barmode; - var stack = barmode === 'stack'; - var relative = barmode === 'relative'; var barnorm = fullLayout.barnorm; - var separateNegativeValues = relative; - var dontMergeOverlappingData = !(barnorm || stack || relative); - var sieve = new Sieve(calcTraces, separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve(calcTraces, { + separateNegativeValues: barmode === 'relative', + dontMergeOverlappingData: !(barnorm || barmode === 'stack' || barmode === 'relative') + }); // set bar offsets and widths, and update position axis setOffsetAndWidth(gd, pa, sieve); @@ -562,7 +571,9 @@ function sieveBars(gd, sa, sieve) { for(var j = 0; j < calcTrace.length; j++) { var bar = calcTrace[j]; - if(bar.s !== BADNUM) sieve.put(bar.p, bar.b + bar.s); + if(bar.s !== BADNUM) { + sieve.put(bar.p, bar.b + bar.s); + } } } } diff --git a/src/traces/bar/sieve.js b/src/traces/bar/sieve.js index fd22a27ec02..2005fb759a7 100644 --- a/src/traces/bar/sieve.js +++ b/src/traces/bar/sieve.js @@ -17,18 +17,20 @@ var BADNUM = require('../../constants/numerical').BADNUM; * Helper class to sieve data from traces into bins * * @class - * @param {Array} traces - * Array of calculated traces - * @param {boolean} [separateNegativeValues] - * If true, then split data at the same position into a bar - * for positive values and another for negative values - * @param {boolean} [dontMergeOverlappingData] - * If true, then don't merge overlapping bars into a single bar + * + * @param {Array} traces +* Array of calculated traces + * @param {object} opts + * - @param {boolean} [separateNegativeValues] + * If true, then split data at the same position into a bar + * for positive values and another for negative values + * - @param {boolean} [dontMergeOverlappingData] + * If true, then don't merge overlapping bars into a single bar */ -function Sieve(traces, separateNegativeValues, dontMergeOverlappingData) { +function Sieve(traces, opts) { this.traces = traces; - this.separateNegativeValues = separateNegativeValues; - this.dontMergeOverlappingData = dontMergeOverlappingData; + this.separateNegativeValues = opts.separateNegativeValues; + this.dontMergeOverlappingData = opts.dontMergeOverlappingData; // for single-bin histograms - see histogram/calc var width1 = Infinity; From 8a5c655cc2bdfedca5e6d74c3e0b4b87e3e22aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 25 Mar 2019 15:56:47 -0400 Subject: [PATCH 2/3] relative-stack bars within the same trace that would otherwise be hidden ... under barmode:'group' --- src/traces/bar/cross_trace_calc.js | 34 ++++++++++++++ test/image/baselines/bar_unhidden.png | Bin 0 -> 8620 bytes test/image/mocks/bar_unhidden.json | 27 ++++++++++++ test/jasmine/tests/bar_test.js | 61 ++++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 test/image/baselines/bar_unhidden.png create mode 100644 test/image/mocks/bar_unhidden.json diff --git a/src/traces/bar/cross_trace_calc.js b/src/traces/bar/cross_trace_calc.js index 065969a595b..448b5412281 100644 --- a/src/traces/bar/cross_trace_calc.js +++ b/src/traces/bar/cross_trace_calc.js @@ -198,6 +198,10 @@ function setGroupPositionsInGroupMode(gd, pa, sa, calcTraces) { // set bar offsets and widths, and update position axis setOffsetAndWidthInGroupMode(gd, pa, sieve); + // relative-stack bars within the same trace that would otherwise + // be hidden + unhideBarsWithinTrace(gd, sa, sieve); + // set bar bases and sizes, and update size axis if(barnorm) { sieveBars(gd, sa, sieve); @@ -578,6 +582,36 @@ function sieveBars(gd, sa, sieve) { } } +function unhideBarsWithinTrace(gd, sa, sieve) { + var calcTraces = sieve.traces; + + for(var i = 0; i < calcTraces.length; i++) { + var calcTrace = calcTraces[i]; + var fullTrace = calcTrace[0].trace; + + if(fullTrace.base === undefined) { + var inTraceSieve = new Sieve([calcTrace], { + separateNegativeValues: true, + dontMergeOverlappingData: true + }); + + for(var j = 0; j < calcTrace.length; j++) { + var bar = calcTrace[j]; + + if(bar.p !== BADNUM) { + // stack current bar and get previous sum + var barBase = inTraceSieve.put(bar.p, bar.b + bar.s); + + // if previous sum if non-zero, this means: + // multiple bars have same starting point are potentially hidden, + // shift them vertically so that all bars are visible by default + if(barBase) bar.b = barBase; + } + } + } + } +} + // Note: // // normalizeBars requires that either sieveBars or stackBars has been diff --git a/test/image/baselines/bar_unhidden.png b/test/image/baselines/bar_unhidden.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5d33a0e8b3417b35424566a4c3a68483341dd3 GIT binary patch literal 8620 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 Date: Thu, 28 Mar 2019 16:09:47 -0400 Subject: [PATCH 3/3] shorten sieve option keys --- src/traces/bar/cross_trace_calc.js | 16 ++++++++-------- src/traces/bar/sieve.js | 18 +++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/traces/bar/cross_trace_calc.js b/src/traces/bar/cross_trace_calc.js index 448b5412281..65591fcd587 100644 --- a/src/traces/bar/cross_trace_calc.js +++ b/src/traces/bar/cross_trace_calc.js @@ -165,8 +165,8 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces) { var calcTrace = calcTraces[i]; var sieve = new Sieve([calcTrace], { - separateNegativeValues: false, - dontMergeOverlappingData: !barnorm + sepNegVal: false, + overlapNoMerge: !barnorm }); // set bar offsets and widths, and update position axis @@ -191,8 +191,8 @@ function setGroupPositionsInGroupMode(gd, pa, sa, calcTraces) { var barnorm = fullLayout.barnorm; var sieve = new Sieve(calcTraces, { - separateNegativeValues: false, - dontMergeOverlappingData: !barnorm + sepNegVal: false, + overlapNoMerge: !barnorm }); // set bar offsets and widths, and update position axis @@ -217,8 +217,8 @@ function setGroupPositionsInStackOrRelativeMode(gd, pa, sa, calcTraces) { var barnorm = fullLayout.barnorm; var sieve = new Sieve(calcTraces, { - separateNegativeValues: barmode === 'relative', - dontMergeOverlappingData: !(barnorm || barmode === 'stack' || barmode === 'relative') + sepNegVal: barmode === 'relative', + overlapNoMerge: !(barnorm || barmode === 'stack' || barmode === 'relative') }); // set bar offsets and widths, and update position axis @@ -591,8 +591,8 @@ function unhideBarsWithinTrace(gd, sa, sieve) { if(fullTrace.base === undefined) { var inTraceSieve = new Sieve([calcTrace], { - separateNegativeValues: true, - dontMergeOverlappingData: true + sepNegVal: true, + overlapNoMerge: true }); for(var j = 0; j < calcTrace.length; j++) { diff --git a/src/traces/bar/sieve.js b/src/traces/bar/sieve.js index 2005fb759a7..d9490bd7a7a 100644 --- a/src/traces/bar/sieve.js +++ b/src/traces/bar/sieve.js @@ -21,16 +21,16 @@ var BADNUM = require('../../constants/numerical').BADNUM; * @param {Array} traces * Array of calculated traces * @param {object} opts - * - @param {boolean} [separateNegativeValues] + * - @param {boolean} [sepNegVal] * If true, then split data at the same position into a bar * for positive values and another for negative values - * - @param {boolean} [dontMergeOverlappingData] + * - @param {boolean} [overlapNoMerge] * If true, then don't merge overlapping bars into a single bar */ function Sieve(traces, opts) { this.traces = traces; - this.separateNegativeValues = opts.separateNegativeValues; - this.dontMergeOverlappingData = opts.dontMergeOverlappingData; + this.sepNegVal = opts.sepNegVal; + this.overlapNoMerge = opts.overlapNoMerge; // for single-bin histograms - see histogram/calc var width1 = Infinity; @@ -81,7 +81,7 @@ Sieve.prototype.put = function put(position, value) { * @method * @param {number} position Position of datum * @param {number} [value] Value of datum - * (required if this.separateNegativeValues is true) + * (required if this.sepNegVal is true) * @returns {number} Current bin value */ Sieve.prototype.get = function put(position, value) { @@ -95,14 +95,14 @@ Sieve.prototype.get = function put(position, value) { * @method * @param {number} position Position of datum * @param {number} [value] Value of datum - * (required if this.separateNegativeValues is true) + * (required if this.sepNegVal is true) * @returns {string} Bin label - * (prefixed with a 'v' if value is negative and this.separateNegativeValues is + * (prefixed with a 'v' if value is negative and this.sepNegVal is * true; otherwise prefixed with '^') */ Sieve.prototype.getLabel = function getLabel(position, value) { - var prefix = (value < 0 && this.separateNegativeValues) ? 'v' : '^'; - var label = (this.dontMergeOverlappingData) ? + var prefix = (value < 0 && this.sepNegVal) ? 'v' : '^'; + var label = (this.overlapNoMerge) ? position : Math.round(position / this.binWidth); return prefix + label;