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

+10
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

+4-2
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

+2-1
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

+25-9
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

+1
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

+2-17
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

+2-1
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

+22-1
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

+1
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

+4-18
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

+4-11
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

-3
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

-3
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

+1
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)