From 4fc0e3b68ccd28b77097c1876a04a2bfcf1b2f6e Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 1 Oct 2025 13:48:09 +0200 Subject: [PATCH 1/9] Make pie.showlegend accept a boolean array to configure individual slice legend visibility. --- src/components/legend/draw.js | 6 +++++- src/components/legend/get_legend_data.js | 4 ++++ src/lib/coerce.js | 2 +- src/traces/pie/attributes.js | 4 +++- test/plot-schema.json | 6 ++++++ 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/components/legend/draw.js b/src/components/legend/draw.js index 8c7907358a1..8f8cbc9c01e 100644 --- a/src/components/legend/draw.js +++ b/src/components/legend/draw.js @@ -633,7 +633,11 @@ function textLayout(s, g, gd, legendObj, aTitle) { function computeTextDimensions(g, gd, legendObj, aTitle) { var legendItem = g.data()[0][0]; - if(!legendObj._inHover && legendItem && !legendItem.trace.showlegend) { + var showlegend = legendItem && legendItem.trace.showlegend; + if (Array.isArray(showlegend)) { + showlegend = showlegend[legendItem.i] !== false; + } + if(!legendObj._inHover && legendItem && !showlegend) { g.remove(); return; } diff --git a/src/components/legend/get_legend_data.js b/src/components/legend/get_legend_data.js index 4bb7ec60f27..b80fa6001b7 100644 --- a/src/components/legend/get_legend_data.js +++ b/src/components/legend/get_legend_data.js @@ -47,9 +47,13 @@ module.exports = function getLegendData(calcdata, opts, hasMultipleLegends) { if(!inHover && (!trace.visible || !trace.showlegend)) continue; if(Registry.traceIs(trace, 'pie-like')) { + var showlegendPerSlice = Array.isArray(trace.showlegend); if(!slicesShown[lgroup]) slicesShown[lgroup] = {}; for(j = 0; j < cd.length; j++) { + if (showlegendPerSlice && trace.showlegend[cd[j].i] === false) { + continue; + } var labelj = cd[j].label; if(!slicesShown[lgroup][labelj]) { diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 9fa59255bc1..95dc8950876 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -86,7 +86,7 @@ exports.valObjectMeta = { boolean: { description: 'A boolean (true/false) value.', requiredOpts: [], - otherOpts: ['dflt'], + otherOpts: ['dflt', 'arrayOk'], coerceFunction: function(v, propOut, dflt) { if(v === true || v === false) propOut.set(v); else propOut.set(dflt); diff --git a/src/traces/pie/attributes.js b/src/traces/pie/attributes.js index cd1c657346f..571734b1211 100644 --- a/src/traces/pie/attributes.js +++ b/src/traces/pie/attributes.js @@ -196,7 +196,9 @@ module.exports = { 'Determines whether outside text labels can push the margins.' ].join(' ') }, - + showlegend: extendFlat({}, baseAttrs.showlegend, { + arrayOk: true + }), title: { text: { valType: 'string', diff --git a/test/plot-schema.json b/test/plot-schema.json index dbc320a4631..e9002978a2b 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -56801,11 +56801,17 @@ "valType": "string" }, "showlegend": { + "arrayOk": true, "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", "dflt": true, "editType": "style", "valType": "boolean" }, + "showlegendsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `showlegend`.", + "editType": "none", + "valType": "string" + }, "sort": { "description": "Determines whether or not the sectors are reordered from largest to smallest.", "dflt": true, From 417ca2e8d268a0796f1c611cd07415112c94d857 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 10 Oct 2025 15:57:08 +0200 Subject: [PATCH 2/9] Make pie.legend accept a boolean array to configure individual slice legend assignment. --- src/components/legend/defaults.js | 65 ++++++++++++++++++++---- src/components/legend/get_legend_data.js | 4 ++ src/lib/coerce.js | 6 ++- src/plots/plots.js | 6 ++- src/traces/pie/attributes.js | 3 ++ test/plot-schema.json | 6 +++ 6 files changed, 76 insertions(+), 14 deletions(-) diff --git a/src/components/legend/defaults.js b/src/components/legend/defaults.js index ec8e91bca69..b634f8dc96c 100644 --- a/src/components/legend/defaults.js +++ b/src/components/legend/defaults.js @@ -45,8 +45,44 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { var shapesWithLegend = (layoutOut.shapes || []).filter(function(d) { return d.showlegend; }); + fullData + .filter(function(trace) { return Registry.traceIs(trace, 'pie-like'); }) + .map(function (trace, idx) { + if (trace.visible) { + legendTraceCount++; + } + if (Array.isArray(trace.legend)) { + for (var index = 0; index < trace._length; index++) { + var legend = trace.legend[index] || 'legend'; + if(legend === legendId) { + // showlegend can be undefined, boolean or a boolean array. + // will fall back to default if undefined or if array index is out-of-range + if ( + !Array.isArray(trace.showlegend) + ? trace.showlegend || trace._dfltShowLegend + : trace.showlegend[index] == null + ? trace._dfltShowLegend + : trace.showlegend[index] + ) { + legendReallyHasATrace = true; + legendTraceCount++; + } + } + } + if (legendId === 'legend' && trace._length > trace.legend.length) { + for (var idx = trace.legend.length; idx < trace._length; idx++) { + legendReallyHasATrace = true; + legendTraceCount++; + } + } + } else if (legendId === (trace.legend || 'legend')) { + legendReallyHasATrace = true; + legendTraceCount += trace._length; + } + }); + var allLegendItems = fullData.concat(shapesWithLegend).filter(function(d) { - return legendId === (d.legend || 'legend'); + return !Registry.traceIs(trace, 'pie-like') && legendId === (d.legend || 'legend'); }); for(var i = 0; i < allLegendItems.length; i++) { @@ -71,18 +107,15 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { legendTraceCount++; if(trace.showlegend) { legendReallyHasATrace = true; - // Always show the legend by default if there's a pie, - // or if there's only one trace but it's explicitly shown - if(!isShape && Registry.traceIs(trace, 'pie-like') || - trace._input.showlegend === true - ) { + // Always show the legend by default if there's only one trace + // but it's explicitly shown + if(trace._input.showlegend === true) { legendTraceCount++; } } Lib.coerceFont(traceCoerce, 'legendgrouptitle.font', grouptitlefont); } - if((!isShape && Registry.traceIs(trace, 'bar') && layoutOut.barmode === 'stack') || ['tonextx', 'tonexty'].indexOf(trace.fill) !== -1) { defaultOrder = helpers.isGrouped({ traceorder: defaultOrder }) ? @@ -95,9 +128,15 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { } } - var showLegend = Lib.coerce(layoutIn, layoutOut, - basePlotLayoutAttributes, 'showlegend', - legendReallyHasATrace && (legendTraceCount > (legendId === 'legend' ? 1 : 0))); + var showLegend = Lib.coerce( + layoutIn, + layoutOut, + basePlotLayoutAttributes, + 'showlegend', + layoutOut.showlegend || + (legendReallyHasATrace && + legendTraceCount > (legendId === 'legend' ? 1 : 0)) + ); // delete legend if(showLegend === false) layoutOut[legendId] = undefined; @@ -230,7 +269,11 @@ module.exports = function legendDefaults(layoutIn, layoutOut, fullData) { var legends = ['legend']; for(i = 0; i < allLegendsData.length; i++) { - Lib.pushUnique(legends, allLegendsData[i].legend); + if (Array.isArray(allLegendsData[i].legend)) { + Lib.extendFlat(legends, allLegendsData[i].legend); + } else { + Lib.pushUnique(legends, allLegendsData[i].legend); + } } layoutOut._legends = []; diff --git a/src/components/legend/get_legend_data.js b/src/components/legend/get_legend_data.js index b80fa6001b7..c389ad4d726 100644 --- a/src/components/legend/get_legend_data.js +++ b/src/components/legend/get_legend_data.js @@ -47,6 +47,7 @@ module.exports = function getLegendData(calcdata, opts, hasMultipleLegends) { if(!inHover && (!trace.visible || !trace.showlegend)) continue; if(Registry.traceIs(trace, 'pie-like')) { + var legendPerSlice = Array.isArray(trace.legend); var showlegendPerSlice = Array.isArray(trace.showlegend); if(!slicesShown[lgroup]) slicesShown[lgroup] = {}; @@ -54,6 +55,9 @@ module.exports = function getLegendData(calcdata, opts, hasMultipleLegends) { if (showlegendPerSlice && trace.showlegend[cd[j].i] === false) { continue; } + if (legendPerSlice) { + lid = trace.legend[cd[j].i] || 'legend'; + } var labelj = cd[j].label; if(!slicesShown[lgroup][labelj]) { diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 95dc8950876..c44361dc110 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -225,8 +225,12 @@ exports.valObjectMeta = { '\'geo\', \'geo2\', \'geo3\', ...' ].join(' '), requiredOpts: ['dflt'], - otherOpts: ['regex'], + otherOpts: ['regex', 'arrayOk'], coerceFunction: function(v, propOut, dflt, opts) { + if(opts.arrayOk && isArrayOrTypedArray(v)) { + propOut.set(v); + return; + } var regex = opts.regex || counterRegex(dflt); if(typeof v === 'string' && regex.test(v)) { propOut.set(v); diff --git a/src/plots/plots.js b/src/plots/plots.js index 6550eb353a8..e68454a5196 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -1254,8 +1254,10 @@ plots.supplyTraceDefaults = function(traceIn, traceOut, colorIndex, layout, trac _module.attributes.showlegend ? _module.attributes : plots.attributes, 'showlegend' ); - - coerce('legend'); + Lib.coerce(traceIn, traceOut, + _module.attributes.legend ? _module.attributes : plots.attributes, + 'legend' + ); coerce('legendwidth'); coerce('legendgroup'); coerce('legendgrouptitle.text'); diff --git a/src/traces/pie/attributes.js b/src/traces/pie/attributes.js index 571734b1211..fccfdb4ac9f 100644 --- a/src/traces/pie/attributes.js +++ b/src/traces/pie/attributes.js @@ -199,6 +199,9 @@ module.exports = { showlegend: extendFlat({}, baseAttrs.showlegend, { arrayOk: true }), + legend: extendFlat({}, baseAttrs.legend, { + arrayOk: true + }), title: { text: { valType: 'string', diff --git a/test/plot-schema.json b/test/plot-schema.json index e9002978a2b..0f06e186293 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -56338,6 +56338,7 @@ "valType": "string" }, "legend": { + "arrayOk": true, "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", "dflt": "legend", "editType": "style", @@ -56454,6 +56455,11 @@ "editType": "style", "valType": "number" }, + "legendsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `legend`.", + "editType": "none", + "valType": "string" + }, "legendwidth": { "description": "Sets the width (in px or fraction) of the legend for this trace.", "editType": "style", From 449598d7e305abfed319864fc4e1ba8b7dc1f6a3 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 13 Oct 2025 10:18:58 +0200 Subject: [PATCH 3/9] Mocks for testing pie.legend and pie.showlegend arrays. --- test/image/mocks/zz-pie-slice-legend.json | 50 ++++++++++++++++++++++ test/image/mocks/zz-pie-slice-legend2.json | 50 ++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 test/image/mocks/zz-pie-slice-legend.json create mode 100644 test/image/mocks/zz-pie-slice-legend2.json diff --git a/test/image/mocks/zz-pie-slice-legend.json b/test/image/mocks/zz-pie-slice-legend.json new file mode 100644 index 00000000000..a52cdd8410f --- /dev/null +++ b/test/image/mocks/zz-pie-slice-legend.json @@ -0,0 +1,50 @@ +{ + "data": [ + { + "labels": [ + "with", + "pie", + "multiple", + "hidden", + "legends", + "A", + "hidden too" + ], + "values": [3, 4, 2, 7, 1, 5, 8], + "type": "pie", + "showlegend": [true, true, true, false, true, true, false], + "legend": ["legend2", "legend", "legend2", "legend4", "legend3", "legend", "legend4"] + } + ], + "layout": { + "title": { + "text": "Test array version of 'showlegend' and 'legend'" + }, + "width": 400, + "height": 400, + "legend": { + "title": { + "text": "L1" + }, + "y": 1 + }, + "legend2": { + "title": { + "text": "L2" + }, + "y": 0.7 + }, + "legend3": { + "title": { + "text": "L3" + }, + "y": 0.2 + }, + "legend4": { + "title": { + "text": "L4" + }, + "y": 0 + } + } +} diff --git a/test/image/mocks/zz-pie-slice-legend2.json b/test/image/mocks/zz-pie-slice-legend2.json new file mode 100644 index 00000000000..bd1fa3cc295 --- /dev/null +++ b/test/image/mocks/zz-pie-slice-legend2.json @@ -0,0 +1,50 @@ +{ + "data": [ + { + "labels": [ + "with", + "multiple", + "hidden", + "legends", + "A", + "hidden too", + "pie" + ], + "values": [3, 2, 7, 1, 5, 8, 4], + "type": "pie", + "showlegend": [true, true, false, true, true, false], + "legend": ["legend2", "legend2", "legend4", "legend3", "legend", "legend4"] + } + ], + "layout": { + "title": { + "text": "Test short array version of 'showlegend' and 'legend'" + }, + "width": 450, + "height": 400, + "legend": { + "title": { + "text": "L1" + }, + "y": 1 + }, + "legend2": { + "title": { + "text": "L2" + }, + "y": 0.7 + }, + "legend3": { + "title": { + "text": "L3" + }, + "y": 0.2 + }, + "legend4": { + "title": { + "text": "L4" + }, + "y": 0 + } + } +} From 178959e01714cd1a9f68945235c57271ae253fea Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 13 Oct 2025 10:30:15 +0200 Subject: [PATCH 4/9] Add draftlog for #7580 --- draftlogs/7580_add.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 draftlogs/7580_add.md diff --git a/draftlogs/7580_add.md b/draftlogs/7580_add.md new file mode 100644 index 00000000000..62f469782ad --- /dev/null +++ b/draftlogs/7580_add.md @@ -0,0 +1 @@ +- Add support for arrays for the pie properties `showlegend` and `legend`, so that these can be configured per slice. [[#7580](https://github.com/plotly/plotly.js/pull/7580)] From 3f9143d75f0995d773ce54ee8ea5da3d87be1c10 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 13 Oct 2025 10:55:47 +0200 Subject: [PATCH 5/9] Add missing plot-schema change --- test/plot-schema.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/plot-schema.json b/test/plot-schema.json index 0f06e186293..a9a9f22ed56 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -448,7 +448,8 @@ "boolean": { "description": "A boolean (true/false) value.", "otherOpts": [ - "dflt" + "dflt", + "arrayOk" ], "requiredOpts": [] }, @@ -549,7 +550,8 @@ "subplotid": { "description": "An id string of a subplot type (given by dflt), optionally followed by an integer >1. e.g. if dflt='geo', we can have 'geo', 'geo2', 'geo3', ...", "otherOpts": [ - "regex" + "regex", + "arrayOk" ], "requiredOpts": [ "dflt" From f9c65da801408c136739d34e2a58b160735866af Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 13 Oct 2025 10:58:54 +0200 Subject: [PATCH 6/9] Baselines for tests zz-pie-slice-legend and zz-pie-slice-legend2 --- test/image/baselines/zz-pie-slice-legend.png | Bin 0 -> 25573 bytes test/image/baselines/zz-pie-slice-legend2.png | Bin 0 -> 26755 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/image/baselines/zz-pie-slice-legend.png create mode 100644 test/image/baselines/zz-pie-slice-legend2.png diff --git a/test/image/baselines/zz-pie-slice-legend.png b/test/image/baselines/zz-pie-slice-legend.png new file mode 100644 index 0000000000000000000000000000000000000000..f128d1bb3a6160443fb5907c4fdd3041bb58ab3c GIT binary patch literal 25573 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 Th5)bcc%m$?Ay*;u_T&En7~eOu literal 0 HcmV?d00001 diff --git a/test/image/baselines/zz-pie-slice-legend2.png b/test/image/baselines/zz-pie-slice-legend2.png new file mode 100644 index 0000000000000000000000000000000000000000..3a3d8bdacae5f5beb41558f1274b271c9fdbc92d GIT binary patch literal 26755 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 Date: Mon, 13 Oct 2025 16:03:29 +0200 Subject: [PATCH 7/9] Fix defaults for legend when pie has no slices. --- src/components/legend/defaults.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/components/legend/defaults.js b/src/components/legend/defaults.js index b634f8dc96c..01c0a1a7735 100644 --- a/src/components/legend/defaults.js +++ b/src/components/legend/defaults.js @@ -51,13 +51,13 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { if (trace.visible) { legendTraceCount++; } - if (Array.isArray(trace.legend)) { - for (var index = 0; index < trace._length; index++) { + if(Array.isArray(trace.legend)) { + for(var index = 0; index < trace._length; index++) { var legend = trace.legend[index] || 'legend'; if(legend === legendId) { // showlegend can be undefined, boolean or a boolean array. // will fall back to default if undefined or if array index is out-of-range - if ( + if( !Array.isArray(trace.showlegend) ? trace.showlegend || trace._dfltShowLegend : trace.showlegend[index] == null @@ -69,15 +69,18 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { } } } - if (legendId === 'legend' && trace._length > trace.legend.length) { - for (var idx = trace.legend.length; idx < trace._length; idx++) { - legendReallyHasATrace = true; - legendTraceCount++; - } + if( + legendId === 'legend' && + (trace._length == null || trace._length > trace.legend.length) + ) { + for(var idx = trace.legend.length; idx < trace._length; idx++) { + legendReallyHasATrace = true; + legendTraceCount++; + } } - } else if (legendId === (trace.legend || 'legend')) { + } else if(legendId === (trace.legend || 'legend')) { legendReallyHasATrace = true; - legendTraceCount += trace._length; + legendTraceCount += trace._length || 1; } }); From dd73d5aeaaf3e7d8d1e86f6c5baebd2385d66d4b Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 13 Oct 2025 16:41:09 +0200 Subject: [PATCH 8/9] Change pie influence on default legend visibility only for non-empty pies with showlegend and/or legend as arrays --- src/components/legend/defaults.js | 61 +++++++++++++++---------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/src/components/legend/defaults.js b/src/components/legend/defaults.js index 01c0a1a7735..9d4acefc59c 100644 --- a/src/components/legend/defaults.js +++ b/src/components/legend/defaults.js @@ -45,47 +45,44 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { var shapesWithLegend = (layoutOut.shapes || []).filter(function(d) { return d.showlegend; }); + function isPieWithLegendArray(trace) { + return Registry.traceIs(trace, 'pie-like') + && trace._length != null + && (Array.isArray(trace.legend) || Array.isArray(trace.showlegend)); + }; fullData - .filter(function(trace) { return Registry.traceIs(trace, 'pie-like'); }) + .filter(isPieWithLegendArray) .map(function (trace, idx) { if (trace.visible) { legendTraceCount++; } - if(Array.isArray(trace.legend)) { - for(var index = 0; index < trace._length; index++) { - var legend = trace.legend[index] || 'legend'; - if(legend === legendId) { - // showlegend can be undefined, boolean or a boolean array. - // will fall back to default if undefined or if array index is out-of-range - if( - !Array.isArray(trace.showlegend) - ? trace.showlegend || trace._dfltShowLegend - : trace.showlegend[index] == null - ? trace._dfltShowLegend - : trace.showlegend[index] - ) { - legendReallyHasATrace = true; - legendTraceCount++; - } + for(var index = 0; index < trace._length; index++) { + var legend = (Array.isArray(trace.legend) ? trace.legend[index] : trace.legend) || 'legend'; + if(legend === legendId) { + // showlegend can be undefined, boolean or a boolean array. + // will fall back to default if undefined or if array index is out-of-range + if( + !Array.isArray(trace.showlegend) + ? trace.showlegend || trace._dfltShowLegend + : trace.showlegend[index] == null + ? trace._dfltShowLegend + : trace.showlegend[index] + ) { + legendReallyHasATrace = true; + legendTraceCount++; } } - if( - legendId === 'legend' && - (trace._length == null || trace._length > trace.legend.length) - ) { - for(var idx = trace.legend.length; idx < trace._length; idx++) { + } + if(legendId === 'legend' && trace._length > trace.legend.length) { + for(var idx = trace.legend.length; idx < trace._length; idx++) { legendReallyHasATrace = true; legendTraceCount++; - } } - } else if(legendId === (trace.legend || 'legend')) { - legendReallyHasATrace = true; - legendTraceCount += trace._length || 1; } }); var allLegendItems = fullData.concat(shapesWithLegend).filter(function(d) { - return !Registry.traceIs(trace, 'pie-like') && legendId === (d.legend || 'legend'); + return !isPieWithLegendArray(trace) && legendId === (d.legend || 'legend'); }); for(var i = 0; i < allLegendItems.length; i++) { @@ -110,9 +107,11 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { legendTraceCount++; if(trace.showlegend) { legendReallyHasATrace = true; - // Always show the legend by default if there's only one trace - // but it's explicitly shown - if(trace._input.showlegend === true) { + // Always show the legend by default if there's a pie, + // or if there's only one trace but it's explicitly shown + if(!isShape && Registry.traceIs(trace, 'pie-like') || + trace._input.showlegend === true + ) { legendTraceCount++; } } @@ -130,7 +129,7 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { 'reversed+grouped' : 'grouped'; } } - + debugger var showLegend = Lib.coerce( layoutIn, layoutOut, From 71c01fbc5f2e9172a867f7b4cd0ba15e6a4bba3e Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 13 Oct 2025 16:45:42 +0200 Subject: [PATCH 9/9] =?UTF-8?q?debugger=20statement=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/legend/defaults.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/legend/defaults.js b/src/components/legend/defaults.js index 9d4acefc59c..9e9f2134fe4 100644 --- a/src/components/legend/defaults.js +++ b/src/components/legend/defaults.js @@ -129,7 +129,7 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { 'reversed+grouped' : 'grouped'; } } - debugger + var showLegend = Lib.coerce( layoutIn, layoutOut,