From 9187d53e11fc5b455a4c6e0dd30ebcb25e3412cd Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Tue, 19 Mar 2019 13:55:37 -0400 Subject: [PATCH 1/3] histogram: remove gap when barmode is relative --- src/traces/bar/layout_defaults.js | 5 +++-- .../baselines/histogram_barmode_relative.png | Bin 0 -> 15773 bytes .../image/mocks/histogram_barmode_relative.json | 13 +++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 test/image/baselines/histogram_barmode_relative.png create mode 100644 test/image/mocks/histogram_barmode_relative.json diff --git a/src/traces/bar/layout_defaults.js b/src/traces/bar/layout_defaults.js index 1f688164dd0..06e79bedd21 100644 --- a/src/traces/bar/layout_defaults.js +++ b/src/traces/bar/layout_defaults.js @@ -24,6 +24,8 @@ module.exports = function(layoutIn, layoutOut, fullData) { var gappedAnyway = false; var usedSubplots = {}; + var mode = coerce('barmode'); + for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; if(Registry.traceIs(trace, 'bar') && trace.visible) hasBars = true; @@ -31,7 +33,7 @@ module.exports = function(layoutIn, layoutOut, fullData) { // if we have at least 2 grouped bar traces on the same subplot, // we should default to a gap anyway, even if the data is histograms - if(layoutIn.barmode !== 'overlay' && layoutIn.barmode !== 'stack') { + if(mode === 'group') { var subploti = trace.xaxis + trace.yaxis; if(usedSubplots[subploti]) gappedAnyway = true; usedSubplots[subploti] = true; @@ -46,7 +48,6 @@ module.exports = function(layoutIn, layoutOut, fullData) { if(!hasBars) return; - var mode = coerce('barmode'); if(mode !== 'overlay') coerce('barnorm'); coerce('bargap', (shouldBeGapless && !gappedAnyway) ? 0 : 0.2); diff --git a/test/image/baselines/histogram_barmode_relative.png b/test/image/baselines/histogram_barmode_relative.png new file mode 100644 index 0000000000000000000000000000000000000000..34c8b61bbafb932a3151a763de9c9c98c4d6efdd GIT binary patch literal 15773 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 Date: Tue, 19 Mar 2019 14:55:04 -0400 Subject: [PATCH 2/3] bar trace: cleanup fullLayout if it doesn't have bars --- src/traces/bar/layout_defaults.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/traces/bar/layout_defaults.js b/src/traces/bar/layout_defaults.js index 06e79bedd21..528f5871be1 100644 --- a/src/traces/bar/layout_defaults.js +++ b/src/traces/bar/layout_defaults.js @@ -46,7 +46,10 @@ module.exports = function(layoutIn, layoutOut, fullData) { } } - if(!hasBars) return; + if(!hasBars) { + delete layoutOut.barmode; + return; + } if(mode !== 'overlay') coerce('barnorm'); From bc3890bce10109ff3dcb486d1530db49fac67621 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Tue, 19 Mar 2019 15:54:27 -0400 Subject: [PATCH 3/3] bar trace: :lock: down default `layout.barmode` --- test/jasmine/tests/bar_test.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/jasmine/tests/bar_test.js b/test/jasmine/tests/bar_test.js index 5a0934734be..eef374418f8 100644 --- a/test/jasmine/tests/bar_test.js +++ b/test/jasmine/tests/bar_test.js @@ -226,6 +226,20 @@ describe('Bar.supplyDefaults', function() { expect(gd._fullData[0].alignmentgroup).toBe(undefined, 'alignementgroup'); expect(gd._fullData[0].offsetgroup).toBe(undefined, 'offsetgroup'); }); + + it('should have a barmode only if it contains bars', function() { + var gd = { + data: [{type: 'histogram', y: [1], visible: false}], + layout: {} + }; + + supplyAllDefaults(gd); + expect(gd._fullLayout.barmode).toBe(undefined, '`barmode` should be undefined'); + + gd.data[0].visible = true; + supplyAllDefaults(gd); + expect(gd._fullLayout.barmode).toBe('group', '`barmode` should be set to its default '); + }); }); describe('bar calc / crossTraceCalc (formerly known as setPositions)', function() {