Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e746b08

Browse files
committed
consider alignment and offset group across matching axes
... as well as across trace types (confirmed behavior) to do so: - add getAxisGroup axis_ids.js util - mv alignmentgroup and offsetgroup coerce calls to crossTraceDefaults
1 parent a146340 commit e746b08

16 files changed

+189
-66
lines changed

src/plots/cartesian/axis_ids.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,13 @@ exports.idSort = function(id1, id2) {
114114
if(letter1 !== letter2) return letter1 > letter2 ? 1 : -1;
115115
return +(id1.substr(1) || 1) - +(id2.substr(1) || 1);
116116
};
117+
118+
exports.getAxisGroup = function getAxisGroup(fullLayout, axId) {
119+
var matchGroups = fullLayout._axisMatchGroups;
120+
121+
for(var i = 0; i < matchGroups.length; i++) {
122+
var group = matchGroups[i];
123+
if(group[axId]) return 'g' + i;
124+
}
125+
return axId;
126+
};

src/traces/bar/attributes.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ module.exports = {
180180
dflt: '',
181181
editType: 'calc',
182182
description: [
183-
'Set several traces linked to the same position axis to the same',
183+
'Set several traces linked to the same position axis',
184+
'or matching axes to the same',
184185
'offsetgroup where bars of the same position coordinate will line up.'
185186
].join(' ')
186187
},
@@ -190,7 +191,8 @@ module.exports = {
190191
dflt: '',
191192
editType: 'calc',
192193
description: [
193-
'Set several traces linked to the same position axis to the same',
194+
'Set several traces linked to the same position axis',
195+
'or matching axes to the same',
194196
'alignmentgroup. This controls whether bars compute their positional',
195197
'range dependently or independently.'
196198
].join(' ')

src/traces/bar/cross_trace_calc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var BADNUM = require('../../constants/numerical').BADNUM;
1414

1515
var Registry = require('../../registry');
1616
var Axes = require('../../plots/cartesian/axes');
17+
var getAxisGroup = require('../../plots/cartesian/axis_ids').getAxisGroup;
1718
var Sieve = require('./sieve.js');
1819

1920
/*
@@ -286,7 +287,7 @@ function setOffsetAndWidthInGroupMode(gd, pa, sieve) {
286287
var overlap = (positions.length !== distinctPositions.length);
287288
var barGroupWidth = minDiff * (1 - bargap);
288289

289-
var groupId = pa._id + calcTraces[0][0].trace.orientation;
290+
var groupId = getAxisGroup(fullLayout, pa._id) + calcTraces[0][0].trace.orientation;
290291
var alignmentGroups = fullLayout._alignmentOpts[groupId] || {};
291292

292293
for(var i = 0; i < nTraces; i++) {

src/traces/bar/defaults.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var Registry = require('../../registry');
1414

1515
var handleXYDefaults = require('../scatter/xy_defaults');
1616
var handleStyleDefaults = require('../bar/style_defaults');
17+
var getAxisGroup = require('../../plots/cartesian/axis_ids').getAxisGroup;
1718
var attributes = require('./attributes');
1819

1920
function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
@@ -76,21 +77,16 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
7677
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'});
7778
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'});
7879

79-
handleGroupingDefaults(traceIn, traceOut, layout, coerce);
80-
8180
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
8281
}
8382

84-
function handleGroupingDefaults(traceIn, traceOut, layout, coerce) {
83+
function handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce) {
8584
var orientation = traceOut.orientation;
86-
// TODO make this work across matching axes too?!?
87-
// TODO should this work per trace-type?
88-
// one set for bar/histogram another for box/violin?
89-
// or just one set for all trace trace types?
85+
// N.B. grouping is done across all trace trace types that support it
9086
var posAxId = traceOut[{v: 'x', h: 'y'}[orientation] + 'axis'];
91-
var groupId = posAxId + orientation;
87+
var groupId = getAxisGroup(fullLayout, posAxId) + orientation;
9288

93-
var alignmentOpts = layout._alignmentOpts || {};
89+
var alignmentOpts = fullLayout._alignmentOpts || {};
9490
var alignmentgroup = coerce('alignmentgroup');
9591

9692
var alignmentGroups = alignmentOpts[groupId];
@@ -123,7 +119,27 @@ function handleGroupingDefaults(traceIn, traceOut, layout, coerce) {
123119
}
124120
}
125121

122+
function crossTraceDefaults(fullData, fullLayout) {
123+
var traceIn, traceOut;
124+
125+
function coerce(attr) {
126+
return Lib.coerce(traceOut._input, traceOut, attributes, attr);
127+
}
128+
129+
for(var i = 0; i < fullData.length; i++) {
130+
traceOut = fullData[i];
131+
132+
if(traceOut.type === 'bar') {
133+
traceIn = traceOut._input;
134+
if(fullLayout.barmode === 'group') {
135+
handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce);
136+
}
137+
}
138+
}
139+
}
140+
126141
module.exports = {
127142
supplyDefaults: supplyDefaults,
143+
crossTraceDefaults: crossTraceDefaults,
128144
handleGroupingDefaults: handleGroupingDefaults
129145
};

src/traces/bar/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ var Bar = {};
1313
Bar.attributes = require('./attributes');
1414
Bar.layoutAttributes = require('./layout_attributes');
1515
Bar.supplyDefaults = require('./defaults').supplyDefaults;
16+
Bar.crossTraceDefaults = require('./defaults').crossTraceDefaults;
1617
Bar.supplyLayoutDefaults = require('./layout_defaults');
1718
Bar.calc = require('./calc');
1819
Bar.crossTraceCalc = require('./cross_trace_calc').crossTraceCalc;

src/traces/bar/layout_defaults.js

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ var Lib = require('../../lib');
1515
var layoutAttributes = require('./layout_attributes');
1616

1717
module.exports = function(layoutIn, layoutOut, fullData) {
18-
var i, trace;
19-
2018
function coerce(attr, dflt) {
2119
return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt);
2220
}
@@ -25,10 +23,9 @@ module.exports = function(layoutIn, layoutOut, fullData) {
2523
var shouldBeGapless = false;
2624
var gappedAnyway = false;
2725
var usedSubplots = {};
28-
var tracesWithGroupAttrs = [];
2926

30-
for(i = 0; i < fullData.length; i++) {
31-
trace = fullData[i];
27+
for(var i = 0; i < fullData.length; i++) {
28+
var trace = fullData[i];
3229
if(Registry.traceIs(trace, 'bar') && trace.visible) hasBars = true;
3330
else continue;
3431

@@ -45,10 +42,6 @@ module.exports = function(layoutIn, layoutOut, fullData) {
4542
trace[trace.orientation === 'v' ? 'xaxis' : 'yaxis']);
4643
if(pa.type !== 'category') shouldBeGapless = true;
4744
}
48-
49-
if(trace.alignmentgroup || trace.offsetgroup) {
50-
tracesWithGroupAttrs.push(trace);
51-
}
5245
}
5346

5447
if(!hasBars) return;
@@ -58,12 +51,4 @@ module.exports = function(layoutIn, layoutOut, fullData) {
5851

5952
coerce('bargap', (shouldBeGapless && !gappedAnyway) ? 0 : 0.2);
6053
coerce('bargroupgap');
61-
62-
if(mode !== 'group') {
63-
for(i = 0; i < tracesWithGroupAttrs.length; i++) {
64-
trace = tracesWithGroupAttrs[i];
65-
delete trace.alignmentgroup;
66-
delete trace.offsetgroup;
67-
}
68-
}
6954
};

src/traces/box/cross_trace_calc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
var Axes = require('../../plots/cartesian/axes');
1212
var Lib = require('../../lib');
13+
var getAxisGroup = require('../../plots/cartesian/axis_ids').getAxisGroup;
1314

1415
var orientations = ['v', 'h'];
1516

@@ -104,7 +105,7 @@ function setPositionOffset(traceType, gd, boxList, posAxis) {
104105
dPos = dPos0;
105106

106107
if(group) {
107-
var groupId = posAxis._id + trace.orientation;
108+
var groupId = getAxisGroup(fullLayout, posAxis._id) + trace.orientation;
108109
var alignmentGroups = fullLayout._alignmentOpts[groupId] || {};
109110
var alignmentGroupOpts = alignmentGroups[trace.alignmentgroup] || {};
110111
var nOffsetGroups = Object.keys(alignmentGroupOpts.offsetGroups || {}).length;

src/traces/box/defaults.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
3434
if(notched) coerce('notchwidth');
3535

3636
handlePointsDefaults(traceIn, traceOut, coerce, {prefix: 'box'});
37-
handleGroupingDefaults(traceIn, traceOut, layout, coerce);
3837
}
3938

4039
function handleSampleDefaults(traceIn, traceOut, coerce, layout) {
@@ -110,8 +109,30 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) {
110109
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
111110
}
112111

112+
function crossTraceDefaults(fullData, fullLayout) {
113+
var traceIn, traceOut;
114+
115+
function coerce(attr) {
116+
return Lib.coerce(traceOut._input, traceOut, attributes, attr);
117+
}
118+
119+
for(var i = 0; i < fullData.length; i++) {
120+
traceOut = fullData[i];
121+
var traceType = traceOut.type;
122+
123+
if(traceType === 'box' || traceType === 'violin') {
124+
traceIn = traceOut._input;
125+
if(fullLayout[traceType + 'mode'] === 'group') {
126+
handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce);
127+
}
128+
}
129+
}
130+
}
131+
113132
module.exports = {
114133
supplyDefaults: supplyDefaults,
134+
crossTraceDefaults: crossTraceDefaults,
135+
115136
handleSampleDefaults: handleSampleDefaults,
116137
handlePointsDefaults: handlePointsDefaults
117138
};

src/traces/box/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ var Box = {};
1313
Box.attributes = require('./attributes');
1414
Box.layoutAttributes = require('./layout_attributes');
1515
Box.supplyDefaults = require('./defaults').supplyDefaults;
16+
Box.crossTraceDefaults = require('./defaults').crossTraceDefaults;
1617
Box.supplyLayoutDefaults = require('./layout_defaults').supplyLayoutDefaults;
1718
Box.calc = require('./calc');
1819
Box.crossTraceCalc = require('./cross_trace_calc').crossTraceCalc;

src/traces/box/layout_defaults.js

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,22 @@ var Lib = require('../../lib');
1313
var layoutAttributes = require('./layout_attributes');
1414

1515
function _supply(layoutIn, layoutOut, fullData, coerce, traceType) {
16-
var i, trace;
17-
1816
var category = traceType + 'Layout';
1917
var hasTraceType = false;
20-
var tracesWithGroupAttrs = [];
2118

22-
for(i = 0; i < fullData.length; i++) {
23-
trace = fullData[i];
19+
for(var i = 0; i < fullData.length; i++) {
20+
var trace = fullData[i];
2421

2522
if(Registry.traceIs(trace, category)) {
2623
hasTraceType = true;
27-
28-
if(trace.alignmentgroup || trace.offsetgroup) {
29-
tracesWithGroupAttrs.push(trace);
30-
}
24+
break;
3125
}
3226
}
3327
if(!hasTraceType) return;
3428

35-
var mode = coerce(traceType + 'mode');
29+
coerce(traceType + 'mode');
3630
coerce(traceType + 'gap');
3731
coerce(traceType + 'groupgap');
38-
39-
if(mode !== 'group') {
40-
for(i = 0; i < tracesWithGroupAttrs.length; i++) {
41-
trace = tracesWithGroupAttrs[i];
42-
delete trace.alignmentgroup;
43-
delete trace.offsetgroup;
44-
}
45-
}
4632
}
4733

4834
function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {

src/traces/histogram/cross_trace_defaults.js

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
* LICENSE file in the root directory of this source tree.
77
*/
88

9-
109
'use strict';
1110

1211
var Lib = require('../../lib');
1312
var nestedProperty = Lib.nestedProperty;
1413

14+
var handleGroupingDefaults = require('../bar/defaults').handleGroupingDefaults;
15+
var getAxisGroup = require('../../plots/cartesian/axis_ids').getAxisGroup;
1516
var attributes = require('./attributes');
1617

1718
var BINATTRS = {
@@ -65,6 +66,8 @@ module.exports = function crossTraceDefaults(fullData, fullLayout) {
6566
direction: binDirection
6667
};
6768
}
69+
70+
handleGroupingDefaults(traceOut._input, traceOut, fullLayout, coerce);
6871
}
6972

7073
for(group in allBinOpts) {
@@ -111,13 +114,3 @@ module.exports = function crossTraceDefaults(fullData, fullLayout) {
111114
}
112115
}
113116
};
114-
115-
function getAxisGroup(fullLayout, axId) {
116-
var matchGroups = fullLayout._axisMatchGroups;
117-
118-
for(var i = 0; i < matchGroups.length; i++) {
119-
var group = matchGroups[i];
120-
if(group[axId]) return 'g' + i;
121-
}
122-
return axId;
123-
}

src/traces/histogram/defaults.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ var Lib = require('../../lib');
1313
var Color = require('../../components/color');
1414

1515
var handleStyleDefaults = require('../bar/style_defaults');
16-
var handleGroupingDefaults = require('../bar/defaults').handleGroupingDefaults;
1716
var attributes = require('./attributes');
1817

1918
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
@@ -70,6 +69,4 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
7069
var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults');
7170
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'});
7271
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'});
73-
74-
handleGroupingDefaults(traceIn, traceOut, layout, coerce);
7572
};

src/traces/violin/defaults.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ var Lib = require('../../lib');
1212
var Color = require('../../components/color');
1313

1414
var boxDefaults = require('../box/defaults');
15-
var handleGroupingDefaults = require('../bar/defaults').handleGroupingDefaults;
1615
var attributes = require('./attributes');
1716

1817
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
@@ -57,6 +56,4 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
5756
var meanLineWidth = coerce2('meanline.width', lineWidth);
5857
var meanLineVisible = coerce('meanline.visible', Boolean(meanLineColor || meanLineWidth));
5958
if(!meanLineVisible) traceOut.meanline = {visible: false};
60-
61-
handleGroupingDefaults(traceIn, traceOut, layout, coerce);
6259
};

src/traces/violin/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module.exports = {
1212
attributes: require('./attributes'),
1313
layoutAttributes: require('./layout_attributes'),
1414
supplyDefaults: require('./defaults'),
15+
crossTraceDefaults: require('../box/defaults').crossTraceDefaults,
1516
supplyLayoutDefaults: require('./layout_defaults'),
1617
calc: require('./calc'),
1718
crossTraceCalc: require('./cross_trace_calc'),
Loading

0 commit comments

Comments
 (0)