Skip to content

Commit 32a890c

Browse files
committed
rank groups based on minimum legendranks within each group
1 parent a1f87b9 commit 32a890c

File tree

2 files changed

+41
-20
lines changed

2 files changed

+41
-20
lines changed

src/components/legend/get_legend_data.js

+29-8
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,7 @@ module.exports = function getLegendData(calcdata, opts) {
7272
// collapse all groups into one if all groups are blank
7373
var shouldCollapse = !hasOneNonBlankGroup || !grouped;
7474

75-
// rearrange lgroupToTraces into a d3-friendly array of arrays
76-
var legendData;
77-
78-
legendData = [];
75+
var legendData = [];
7976
for(i = 0; i < lgroups.length; i++) {
8077
var t = lgroupToTraces[lgroups[i]];
8178
if(shouldCollapse) {
@@ -86,19 +83,43 @@ module.exports = function getLegendData(calcdata, opts) {
8683
}
8784
if(shouldCollapse) legendData = [legendData];
8885

89-
var orderFn = function(a, b) {
86+
for(i = 0; i < legendData.length; i++) {
87+
// find minimum rank within group
88+
var groupMinRank = Infinity;
89+
for(j = 0; j < legendData[i].length; j++) {
90+
var rank = legendData[i][j].trace.legendrank;
91+
if(groupMinRank > rank) groupMinRank = rank;
92+
}
93+
94+
// record on first group element
95+
legendData[i][0]._groupMinRank = groupMinRank;
96+
legendData[i][0]._preGroupSort = i;
97+
}
98+
99+
var orderFn1 = function(a, b) {
100+
return (
101+
(a[0]._groupMinRank - b[0]._groupMinRank) ||
102+
(a[0]._preGroupSort - b[0]._preGroupSort) // fallback for old Chrome < 70 https://bugs.chromium.org/p/v8/issues/detail?id=90
103+
);
104+
};
105+
106+
var orderFn2 = function(a, b) {
90107
return (
91108
(a.trace.legendrank - b.trace.legendrank) ||
92109
(a._preSort - b._preSort) // fallback for old Chrome < 70 https://bugs.chromium.org/p/v8/issues/detail?id=90
93110
);
94111
};
112+
113+
// sort considering minimum group legendrank
114+
legendData.forEach(function(a, k) { a[0]._preGroupSort = k; });
115+
legendData.sort(orderFn1);
95116
for(i = 0; i < legendData.length; i++) {
96117
// sort considering trace.legendrank and legend.traceorder
97-
legendData[i].forEach(function(a, i) { a._preSort = i; });
98-
legendData[i].sort(orderFn);
118+
legendData[i].forEach(function(a, k) { a._preSort = k; });
119+
legendData[i].sort(orderFn2);
99120
if(reversed) legendData[i].reverse();
100121

101-
// add extra dim
122+
// rearrange lgroupToTraces into a d3-friendly array of arrays
102123
for(j = 0; j < legendData[i].length; j++) {
103124
legendData[i][j] = [
104125
legendData[i][j]

test/jasmine/tests/legend_test.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ describe('legend getLegendData user-defined legendrank', function() {
292292
legendgroup: 'group',
293293
showlegend: true
294294
}}],
295-
[{_preSort: 0, trace: {
295+
[{_groupMinRank: 1, _preGroupSort: 0, _preSort: 0, trace: {
296296
legendrank: 3,
297297
type: 'scatter',
298298
visible: true,
@@ -301,7 +301,7 @@ describe('legend getLegendData user-defined legendrank', function() {
301301
}}]
302302
],
303303
[
304-
[{_preSort: 0, trace: {
304+
[{_groupMinRank: 2, _preGroupSort: 1, _preSort: 0, trace: {
305305
legendrank: 2,
306306
type: 'bar',
307307
visible: 'legendonly',
@@ -361,7 +361,7 @@ describe('legend getLegendData user-defined legendrank', function() {
361361
legendgroup: '',
362362
showlegend: true
363363
}}],
364-
[{_preSort: 0, trace: {
364+
[{_groupMinRank: 1, _preGroupSort: 0, _preSort: 0, trace: {
365365
legendrank: 3,
366366
type: 'scatter',
367367
visible: true,
@@ -439,7 +439,7 @@ describe('legend getLegendData user-defined legendrank', function() {
439439

440440
expected = [
441441
[
442-
[{_preSort: 0, trace: {
442+
[{_groupMinRank: 1, _preGroupSort: 0, _preSort: 0, trace: {
443443
legendrank: 3,
444444
type: 'scatter',
445445
visible: true,
@@ -499,7 +499,7 @@ describe('legend getLegendData user-defined legendrank', function() {
499499

500500
expected = [
501501
[
502-
[{_preSort: 0, trace: {
502+
[{_groupMinRank: 1, _preGroupSort: 0, _preSort: 0, trace: {
503503
legendrank: 3,
504504
type: 'scatter',
505505
visible: true,
@@ -515,7 +515,7 @@ describe('legend getLegendData user-defined legendrank', function() {
515515
}}]
516516
],
517517
[
518-
[{_preSort: 0, trace: {
518+
[{_groupMinRank: 2, _preGroupSort: 1, _preSort: 0, trace: {
519519
legendrank: 2,
520520
type: 'bar',
521521
visible: 'legendonly',
@@ -564,7 +564,7 @@ describe('legend getLegendData default legendrank', function() {
564564

565565
expected = [
566566
[
567-
[{_preSort: 0, trace: {
567+
[{_groupMinRank: Infinity, _preGroupSort: 0, _preSort: 0, trace: {
568568
type: 'scatter',
569569
visible: true,
570570
legendgroup: 'group',
@@ -578,7 +578,7 @@ describe('legend getLegendData default legendrank', function() {
578578
}}]
579579
],
580580
[
581-
[{_preSort: 0, trace: {
581+
[{_groupMinRank: Infinity, _preGroupSort: 1, _preSort: 0, trace: {
582582
type: 'bar',
583583
visible: 'legendonly',
584584
legendgroup: '',
@@ -620,7 +620,7 @@ describe('legend getLegendData default legendrank', function() {
620620

621621
expected = [
622622
[
623-
[{_preSort: 0, trace: {
623+
[{_groupMinRank: Infinity, _preGroupSort: 0, _preSort: 0, trace: {
624624
type: 'scatter',
625625
visible: true,
626626
legendgroup: '',
@@ -715,7 +715,7 @@ describe('legend getLegendData default legendrank', function() {
715715
legendgroup: '',
716716
showlegend: true
717717
}}],
718-
[{_preSort: 0, trace: {
718+
[{_groupMinRank: Infinity, _preGroupSort: 0, _preSort: 0, trace: {
719719
type: 'scatter',
720720
visible: true,
721721
legendgroup: '',
@@ -763,15 +763,15 @@ describe('legend getLegendData default legendrank', function() {
763763
legendgroup: 'group',
764764
showlegend: true
765765
}}],
766-
[{_preSort: 0, trace: {
766+
[{_groupMinRank: Infinity, _preGroupSort: 0, _preSort: 0, trace: {
767767
type: 'scatter',
768768
visible: true,
769769
legendgroup: 'group',
770770
showlegend: true
771771
}}]
772772
],
773773
[
774-
[{_preSort: 0, trace: {
774+
[{_groupMinRank: Infinity, _preGroupSort: 1, _preSort: 0, trace: {
775775
type: 'bar',
776776
visible: 'legendonly',
777777
legendgroup: '',

0 commit comments

Comments
 (0)