Skip to content

Commit b249c14

Browse files
authored
Merge pull request #6664 from plotly/per-legend-traceorder-dflt
Fix per legend `traceorder` defaults and legend groups in multi legends
2 parents c3397fc + f0ebd1f commit b249c14

File tree

3 files changed

+91
-5
lines changed

3 files changed

+91
-5
lines changed

draftlogs/6664_fix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Fix per legend traceorder defaults and legend groups when having multiple legends [[#6664](https://github.com/plotly/plotly.js/pull/6664)]

src/components/legend/defaults.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) {
4141
var legendReallyHasATrace = false;
4242
var defaultOrder = 'normal';
4343

44-
for(var i = 0; i < fullData.length; i++) {
45-
trace = fullData[i];
44+
var allLegendItems = fullData.filter(function(d) {
45+
return legendId === (d.legend || 'legend');
46+
});
47+
48+
for(var i = 0; i < allLegendItems.length; i++) {
49+
trace = allLegendItems[i];
4650

4751
if(!trace.visible) continue;
4852

@@ -87,10 +91,10 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) {
8791

8892
var showLegend = Lib.coerce(layoutIn, layoutOut,
8993
basePlotLayoutAttributes, 'showlegend',
90-
legendReallyHasATrace && legendTraceCount > 1);
94+
legendReallyHasATrace && (legendTraceCount > (legendId === 'legend' ? 1 : 0)));
9195

9296
// delete legend
93-
if(showLegend === false) layoutOut.legend = undefined;
97+
if(showLegend === false) layoutOut[legendId] = undefined;
9498

9599
if(showLegend === false && !containerIn.uirevision) return;
96100

@@ -166,7 +170,7 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) {
166170
}, 'y');
167171

168172
coerce('traceorder', defaultOrder);
169-
if(helpers.isGrouped(layoutOut.legend)) coerce('tracegroupgap');
173+
if(helpers.isGrouped(layoutOut[legendId])) coerce('tracegroupgap');
170174

171175
coerce('entrywidth');
172176
coerce('entrywidthmode');

test/jasmine/tests/legend_test.js

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,31 @@ describe('legend defaults', function() {
123123
expect(layoutOut.legend.traceorder).toEqual('reversed');
124124
});
125125

126+
it('should default traceorder to reversed for stack bar charts | multi-legend case', function() {
127+
fullData = allShown([
128+
{type: 'scatter'},
129+
{legend: 'legend2', type: 'bar', visible: 'legendonly'},
130+
{legend: 'legend2', type: 'bar', visible: 'legendonly'},
131+
{legend: 'legend2', type: 'scatter'},
132+
{legend: 'legend3', type: 'scatter'}
133+
]);
134+
135+
layoutOut.legend2 = {};
136+
layoutOut.legend3 = {};
137+
138+
supplyLayoutDefaults(layoutIn, layoutOut, fullData);
139+
expect(layoutOut.legend.traceorder).toEqual('normal');
140+
expect(layoutOut.legend2.traceorder).toEqual('normal');
141+
expect(layoutOut.legend3.traceorder).toEqual('normal');
142+
143+
layoutOut.barmode = 'stack';
144+
145+
supplyLayoutDefaults(layoutIn, layoutOut, fullData);
146+
expect(layoutOut.legend.traceorder).toEqual('normal');
147+
expect(layoutOut.legend2.traceorder).toEqual('reversed');
148+
expect(layoutOut.legend3.traceorder).toEqual('normal');
149+
});
150+
126151
it('should default traceorder to reversed for filled tonext scatter charts', function() {
127152
fullData = allShown([
128153
{type: 'scatter'},
@@ -148,6 +173,30 @@ describe('legend defaults', function() {
148173
expect(layoutOut.legend.traceorder).toEqual('grouped+reversed');
149174
});
150175

176+
it('should default traceorder to grouped when a group is present | multi-legend case', function() {
177+
fullData = allShown([
178+
{type: 'scatter'},
179+
{legend: 'legend2', type: 'scatter', legendgroup: 'group'},
180+
{legend: 'legend2', type: 'scatter'},
181+
{legend: 'legend3', type: 'scatter'}
182+
]);
183+
184+
layoutOut.legend2 = {};
185+
layoutOut.legend3 = {};
186+
187+
supplyLayoutDefaults(layoutIn, layoutOut, fullData);
188+
expect(layoutOut.legend.traceorder).toEqual('normal');
189+
expect(layoutOut.legend2.traceorder).toEqual('grouped');
190+
expect(layoutOut.legend3.traceorder).toEqual('normal');
191+
192+
fullData[1].fill = 'tonextx';
193+
194+
supplyLayoutDefaults(layoutIn, layoutOut, fullData);
195+
expect(layoutOut.legend.traceorder).toEqual('normal');
196+
expect(layoutOut.legend2.traceorder).toEqual('reversed+grouped');
197+
expect(layoutOut.legend3.traceorder).toEqual('normal');
198+
});
199+
151200
it('does not consider invisible traces for traceorder default', function() {
152201
fullData = allShown([
153202
{type: 'bar', visible: false},
@@ -169,6 +218,38 @@ describe('legend defaults', function() {
169218
expect(layoutOut.legend.traceorder).toEqual('normal');
170219
});
171220

221+
it('does not consider invisible traces for traceorder default | multi-legend case', function() {
222+
fullData = allShown([
223+
{type: 'scatter'},
224+
{legend: 'legend2', type: 'bar', visible: false},
225+
{legend: 'legend2', type: 'bar', visible: false},
226+
{legend: 'legend2', type: 'scatter'},
227+
{legend: 'legend3', type: 'scatter'},
228+
]);
229+
230+
layoutOut.legend2 = {};
231+
layoutOut.legend3 = {};
232+
233+
layoutOut.barmode = 'stack';
234+
235+
supplyLayoutDefaults(layoutIn, layoutOut, fullData);
236+
expect(layoutOut.legend.traceorder).toEqual('normal');
237+
expect(layoutOut.legend2.traceorder).toEqual('normal');
238+
expect(layoutOut.legend3.traceorder).toEqual('normal');
239+
240+
fullData = allShown([
241+
{type: 'scatter'},
242+
{legend: 'legend2', type: 'scatter', legendgroup: 'group', visible: false},
243+
{legend: 'legend2', type: 'scatter'},
244+
{legend: 'legend3', type: 'scatter'}
245+
]);
246+
247+
supplyLayoutDefaults(layoutIn, layoutOut, fullData);
248+
expect(layoutOut.legend.traceorder).toEqual('normal');
249+
expect(layoutOut.legend2.traceorder).toEqual('normal');
250+
expect(layoutOut.legend3.traceorder).toEqual('normal');
251+
});
252+
172253
it('should default orientation to vertical', function() {
173254
supplyLayoutDefaults(layoutIn, layoutOut, []);
174255
expect(layoutOut.legend.orientation).toEqual('v');

0 commit comments

Comments
 (0)