From dc58b26996663a24111953d5aab4df2b7ffd84c5 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 13 Nov 2024 15:59:23 +0100 Subject: [PATCH 1/5] New axis prop `zerolinelayer` with values "below traces" (default) and "above traces" --- src/plots/cartesian/axes.js | 11 +++- src/plots/cartesian/index.js | 7 +++ src/plots/cartesian/layout_attributes.js | 12 ++++ src/plots/cartesian/line_grid_defaults.js | 2 + test/image/mocks/zzz_zerolinelayer_above.json | 58 +++++++++++++++++++ test/image/mocks/zzz_zerolinelayer_below.json | 58 +++++++++++++++++++ test/plot-schema.json | 20 +++++++ 7 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 test/image/mocks/zzz_zerolinelayer_above.json create mode 100644 test/image/mocks/zzz_zerolinelayer_below.json diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 84ebe5b3bb1..c293d99b564 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2365,6 +2365,7 @@ axes.draw = function(gd, arg, opts) { if(plotinfo.minorGridlayer) plotinfo.minorGridlayer.selectAll('path').remove(); if(plotinfo.gridlayer) plotinfo.gridlayer.selectAll('path').remove(); if(plotinfo.zerolinelayer) plotinfo.zerolinelayer.selectAll('path').remove(); + if(plotinfo.zerolinelayerAbove) plotinfo.zerolinelayerAbove.selectAll('path').remove(); fullLayout._infolayer.select('.g-' + xa._id + 'title').remove(); fullLayout._infolayer.select('.g-' + ya._id + 'title').remove(); @@ -2462,6 +2463,7 @@ axes.drawOne = function(gd, ax, opts) { var axLetter = axId.charAt(0); var counterLetter = axes.counterLetter(axId); var mainPlotinfo = fullLayout._plots[ax._mainSubplot]; + var zerolineIsAbove = ax.zerolinelayer === 'above traces'; // this happens when updating matched group with 'missing' axes if(!mainPlotinfo) return; @@ -2576,7 +2578,7 @@ axes.drawOne = function(gd, ax, opts) { }); axes.drawZeroLine(gd, ax, { counterAxis: counterAxis, - layer: plotinfo.zerolinelayer, + layer: zerolineIsAbove ? plotinfo.zerolinelayerAbove : plotinfo.zerolinelayer, path: gridPath, transFn: transTickFn }); @@ -3555,6 +3557,7 @@ axes.drawLabels = function(gd, ax, opts) { var fullLayout = gd._fullLayout; var axId = ax._id; + var zerolineIsAbove = ax.zerolinelayer === 'above traces'; var cls = opts.cls || axId + 'tick'; var vals = opts.vals.filter(function(d) { return d.text; }); @@ -3763,8 +3766,10 @@ axes.drawLabels = function(gd, ax, opts) { var mainPlotinfo = fullLayout._plots[ax._mainSubplot]; var sel; - if(e.K === ZERO_PATH.K) sel = mainPlotinfo.zerolinelayer.selectAll('.' + ax._id + 'zl'); - else if(e.K === MINORGRID_PATH.K) sel = mainPlotinfo.minorGridlayer.selectAll('.' + ax._id); + if(e.K === ZERO_PATH.K) { + var zerolineLayer = zerolineIsAbove ? mainPlotinfo.zerolinelayerAbove : mainPlotinfo.zerolinelayer; + sel = zerolineLayer.selectAll('.' + ax._id + 'zl'); + } else if(e.K === MINORGRID_PATH.K) sel = mainPlotinfo.minorGridlayer.selectAll('.' + ax._id); else if(e.K === GRID_PATH.K) sel = mainPlotinfo.gridlayer.selectAll('.' + ax._id); else sel = mainPlotinfo[ax._id.charAt(0) + 'axislayer']; diff --git a/src/plots/cartesian/index.js b/src/plots/cartesian/index.js index 07863ebbdf1..71eeb5b1a9e 100644 --- a/src/plots/cartesian/index.js +++ b/src/plots/cartesian/index.js @@ -614,6 +614,12 @@ function makeSubplotLayer(gd, plotinfo) { plotinfo.overplot = ensureSingle(plotgroup, 'g', 'overplot'); plotinfo.plot = ensureSingle(plotinfo.overplot, 'g', id); + if(mainplotinfo && hasMultipleZ) { + plotinfo.zerolinelayerAbove = mainplotinfo.zerolinelayerAbove; + } else { + plotinfo.zerolinelayerAbove = ensureSingle(plotgroup, 'g', 'zerolinelayer-above'); + } + if(!hasZ) { plotinfo.xlines = ensureSingle(plotgroup, 'path', 'xlines-above'); plotinfo.ylines = ensureSingle(plotgroup, 'path', 'ylines-above'); @@ -643,6 +649,7 @@ function makeSubplotLayer(gd, plotinfo) { plotinfo.minorGridlayer = mainplotinfo.minorGridlayer; plotinfo.gridlayer = mainplotinfo.gridlayer; plotinfo.zerolinelayer = mainplotinfo.zerolinelayer; + plotinfo.zerolinelayerAbove = mainplotinfo.zerolinelayerAbove; ensureSingle(mainplotinfo.overlinesBelow, 'path', xId); ensureSingle(mainplotinfo.overlinesBelow, 'path', yId); diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 32afc99457a..2ca1e910c82 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -1016,6 +1016,18 @@ module.exports = { editType: 'ticks', description: 'Sets the line color of the zero line.' }, + zerolinelayer: { + valType: 'enumerated', + values: ['above traces', 'below traces'], + dflt: 'below traces', + editType: 'plot', + description: [ + 'Sets the layer on which this zeroline is displayed.', + 'If *above traces*, this zeroline is displayed above all the subplot\'s traces', + 'If *below traces*, this zeroline is displayed below all the subplot\'s traces,', + 'but above the grid lines.' + ].join(' ') + }, zerolinewidth: { valType: 'number', dflt: 1, diff --git a/src/plots/cartesian/line_grid_defaults.js b/src/plots/cartesian/line_grid_defaults.js index 062c5f2493c..db8ed544855 100644 --- a/src/plots/cartesian/line_grid_defaults.js +++ b/src/plots/cartesian/line_grid_defaults.js @@ -67,11 +67,13 @@ module.exports = function handleLineGridDefaults(containerIn, containerOut, coer } if(!opts.noZeroLine) { + var zeroLineLayer = coerce2('zerolinelayer'); var zeroLineColor = coerce2('zerolinecolor', dfltColor); var zeroLineWidth = coerce2('zerolinewidth'); var showZeroLine = coerce('zeroline', opts.showGrid || !!zeroLineColor || !!zeroLineWidth); if(!showZeroLine) { + delete containerOut.zerolineLayer; delete containerOut.zerolinecolor; delete containerOut.zerolinewidth; } diff --git a/test/image/mocks/zzz_zerolinelayer_above.json b/test/image/mocks/zzz_zerolinelayer_above.json new file mode 100644 index 00000000000..ac9adfd45bc --- /dev/null +++ b/test/image/mocks/zzz_zerolinelayer_above.json @@ -0,0 +1,58 @@ +{ + "data": [ + { + "type": "bar", + "x": [-1, 0, 2, 3], + "y": [-1, 2, -3, 4], + "name": "xy" + }, + { + "line": { + "width": 10 + }, + "mode": "lines", + "x": [-1, 0, 2, 3], + "y": [-3, 1, -1, 2], + "xaxis": "x2", + "yaxis": "y2", + "name": "x2y2" + } + ], + "layout": { + "title": { + "text": "All zerolines above traces (x/x2: pink, y/y2: black)" + }, + "width": 600, + "height": 400, + "xaxis": { + "zeroline": true, + "zerolinewidth": 5, + "zerolinecolor": "pink", + "zerolinelayer": "above traces" + }, + "xaxis2": { + "overlaying": "x", + "zeroline": true, + "zerolinewidth": 5, + "zerolinecolor": "pink", + "zerolinelayer": "above traces", + "side": "top" + }, + "yaxis": { + "zeroline": true, + "zerolinewidth": 5, + "zerolinecolor": "black", + "zerolinelayer": "above traces", + "range": [-1, 4] + }, + "yaxis2": { + "zeroline": true, + "zerolinewidth": 5, + "zerolinecolor": "black", + "zerolinelayer": "above traces", + "range": [-3, 2], + "overlaying": "y", + "side": "right" + } + } +} diff --git a/test/image/mocks/zzz_zerolinelayer_below.json b/test/image/mocks/zzz_zerolinelayer_below.json new file mode 100644 index 00000000000..0f555541057 --- /dev/null +++ b/test/image/mocks/zzz_zerolinelayer_below.json @@ -0,0 +1,58 @@ +{ + "data": [ + { + "type": "bar", + "x": [-1, 0, 2, 3], + "y": [-1, 2, -3, 4], + "name": "xy" + }, + { + "line": { + "width": 10 + }, + "mode": "lines", + "x": [-1, 0, 2, 3], + "y": [-3, 1, -1, 2], + "xaxis": "x2", + "yaxis": "y2", + "name": "x2y2" + } + ], + "layout": { + "title": { + "text": "All zerolines below traces (x/x2: pink, y/y2: black)" + }, + "width": 600, + "height": 400, + "xaxis": { + "zeroline": true, + "zerolinewidth": 5, + "zerolinecolor": "pink", + "zerolinelayer": "below traces" + }, + "xaxis2": { + "overlaying": "x", + "zeroline": true, + "zerolinewidth": 5, + "zerolinecolor": "pink", + "zerolinelayer": "below traces", + "side": "top" + }, + "yaxis": { + "zeroline": true, + "zerolinewidth": 5, + "zerolinecolor": "black", + "zerolinelayer": "below traces", + "range": [-1, 4] + }, + "yaxis2": { + "zeroline": true, + "zerolinewidth": 5, + "zerolinecolor": "black", + "zerolinelayer": "below traces", + "range": [-3, 2], + "overlaying": "y", + "side": "right" + } + } +} diff --git a/test/plot-schema.json b/test/plot-schema.json index 6aa77cf3338..5e27297bf3a 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -14959,6 +14959,16 @@ "editType": "ticks", "valType": "color" }, + "zerolinelayer": { + "description": "Sets the layer on which this zeroline is displayed. If *above traces*, this zeroline is displayed above all the subplot's traces If *below traces*, this zeroline is displayed below all the subplot's traces, but above the grid lines.", + "dflt": "below traces", + "editType": "plot", + "valType": "enumerated", + "values": [ + "above traces", + "below traces" + ] + }, "zerolinewidth": { "description": "Sets the width (in px) of the zero line.", "dflt": 1, @@ -16193,6 +16203,16 @@ "editType": "ticks", "valType": "color" }, + "zerolinelayer": { + "description": "Sets the layer on which this zeroline is displayed. If *above traces*, this zeroline is displayed above all the subplot's traces If *below traces*, this zeroline is displayed below all the subplot's traces, but above the grid lines.", + "dflt": "below traces", + "editType": "plot", + "valType": "enumerated", + "values": [ + "above traces", + "below traces" + ] + }, "zerolinewidth": { "description": "Sets the width (in px) of the zero line.", "dflt": 1, From 24d1082d2a938db545f069dd0660a075e31e9c81 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 13 Nov 2024 16:25:36 +0100 Subject: [PATCH 2/5] baseline images for zerolinelayer mocks, draftlog --- draftlogs/7269_add.md | 1 + .../image/baselines/zzz_zerolinelayer_above.png | Bin 0 -> 27743 bytes .../image/baselines/zzz_zerolinelayer_below.png | Bin 0 -> 28391 bytes 3 files changed, 1 insertion(+) create mode 100644 draftlogs/7269_add.md create mode 100644 test/image/baselines/zzz_zerolinelayer_above.png create mode 100644 test/image/baselines/zzz_zerolinelayer_below.png diff --git a/draftlogs/7269_add.md b/draftlogs/7269_add.md new file mode 100644 index 00000000000..8e772141a9a --- /dev/null +++ b/draftlogs/7269_add.md @@ -0,0 +1 @@ + - Add property `zerolinelayer` to cartesian axes to allow drawing zeroline above traces [[#7269](https://github.com/plotly/plotly.js/pull/7269)] diff --git a/test/image/baselines/zzz_zerolinelayer_above.png b/test/image/baselines/zzz_zerolinelayer_above.png new file mode 100644 index 0000000000000000000000000000000000000000..485700eec3142ef0f32d56acd3020fb2a9e7c242 GIT binary patch literal 27743 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 literal 0 HcmV?d00001 diff --git a/test/image/baselines/zzz_zerolinelayer_below.png b/test/image/baselines/zzz_zerolinelayer_below.png new file mode 100644 index 0000000000000000000000000000000000000000..a287931572d09aeb3ad4d554478cb9399c1714cd GIT binary patch literal 28391 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 Lp`3ja{rtZG`0Q$m literal 0 HcmV?d00001 From 2d94bef77c25ca0da14659db14d57c5c1c662bbf Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 13 Nov 2024 16:40:20 +0100 Subject: [PATCH 3/5] Adjust splom test after addition of zerolinelayerAbove --- test/jasmine/tests/splom_test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/jasmine/tests/splom_test.js b/test/jasmine/tests/splom_test.js index 44cede6e3fe..69560d7d5bd 100644 --- a/test/jasmine/tests/splom_test.js +++ b/test/jasmine/tests/splom_test.js @@ -799,7 +799,7 @@ describe('Test splom interactions:', function() { .then(function() { _assert({ subplotCnt: 25, - innerSubplotNodeCnt: 18, + innerSubplotNodeCnt: 19, hasSplomGrid: false, bgCnt: 0 }); @@ -819,7 +819,7 @@ describe('Test splom interactions:', function() { // grid layer would be above xaxis layer, // if we didn't clear subplot children. expect(gridIndex).toBe(2, ' index'); - expect(xaxisIndex).toBe(15, ' index'); + expect(xaxisIndex).toBe(16, ' index'); return Plotly.restyle(gd, 'dimensions', [dimsLarge]); }) @@ -831,7 +831,7 @@ describe('Test splom interactions:', function() { // new subplots though have reduced number of children. innerSubplotNodeCnt: function(d) { var p = d.match(SUBPLOT_PATTERN); - return (p[1] > 5 || p[2] > 5) ? 4 : 18; + return (p[1] > 5 || p[2] > 5) ? 4 : 19; }, hasSplomGrid: true, bgCnt: 0 From 1a41bb70b0c4d492151d73ea327a27536378bf12 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 12 Feb 2025 11:18:50 +0100 Subject: [PATCH 4/5] =?UTF-8?q?Fix=20typo=20in=20line=5Fgrid=5Fdefaults=20?= =?UTF-8?q?zerolineLayer=20=E2=86=92=20zerolinelayer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plots/cartesian/line_grid_defaults.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plots/cartesian/line_grid_defaults.js b/src/plots/cartesian/line_grid_defaults.js index db8ed544855..8808c31f7dd 100644 --- a/src/plots/cartesian/line_grid_defaults.js +++ b/src/plots/cartesian/line_grid_defaults.js @@ -73,7 +73,7 @@ module.exports = function handleLineGridDefaults(containerIn, containerOut, coer var showZeroLine = coerce('zeroline', opts.showGrid || !!zeroLineColor || !!zeroLineWidth); if(!showZeroLine) { - delete containerOut.zerolineLayer; + delete containerOut.zerolinelayer; delete containerOut.zerolinecolor; delete containerOut.zerolinewidth; } From eb2ead5bf742bf700728c1fca1c644468bc5c820 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 12 Feb 2025 12:04:45 +0100 Subject: [PATCH 5/5] zerolinelayer description: Add note that it doesn't work in combination with zorder. --- src/plots/cartesian/layout_attributes.js | 3 ++- test/plot-schema.json | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 2ca1e910c82..978f545e53e 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -1025,7 +1025,8 @@ module.exports = { 'Sets the layer on which this zeroline is displayed.', 'If *above traces*, this zeroline is displayed above all the subplot\'s traces', 'If *below traces*, this zeroline is displayed below all the subplot\'s traces,', - 'but above the grid lines.' + 'but above the grid lines. Limitation: *zerolinelayer* currently has no effect', + 'if the *zorder* property is set on any trace.' ].join(' ') }, zerolinewidth: { diff --git a/test/plot-schema.json b/test/plot-schema.json index 5e27297bf3a..96c230c26ca 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -14960,7 +14960,7 @@ "valType": "color" }, "zerolinelayer": { - "description": "Sets the layer on which this zeroline is displayed. If *above traces*, this zeroline is displayed above all the subplot's traces If *below traces*, this zeroline is displayed below all the subplot's traces, but above the grid lines.", + "description": "Sets the layer on which this zeroline is displayed. If *above traces*, this zeroline is displayed above all the subplot's traces If *below traces*, this zeroline is displayed below all the subplot's traces, but above the grid lines. Limitation: *zerolinelayer* currently has no effect if the *zorder* property is set on any trace.", "dflt": "below traces", "editType": "plot", "valType": "enumerated", @@ -16204,7 +16204,7 @@ "valType": "color" }, "zerolinelayer": { - "description": "Sets the layer on which this zeroline is displayed. If *above traces*, this zeroline is displayed above all the subplot's traces If *below traces*, this zeroline is displayed below all the subplot's traces, but above the grid lines.", + "description": "Sets the layer on which this zeroline is displayed. If *above traces*, this zeroline is displayed above all the subplot's traces If *below traces*, this zeroline is displayed below all the subplot's traces, but above the grid lines. Limitation: *zerolinelayer* currently has no effect if the *zorder* property is set on any trace.", "dflt": "below traces", "editType": "plot", "valType": "enumerated",