From 6c818929b335c81a19236a0faf632d05bbb8489f Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 27 May 2024 16:27:56 +0200 Subject: [PATCH 01/24] Add property axis.ticklabelshiftx and axis.ticklabelshifty Also modifies mock date_axes_period2 to test the new properties --- src/plots/cartesian/axes.js | 11 ++++++---- src/plots/cartesian/layout_attributes.js | 16 +++++++++++++++ src/plots/cartesian/tick_label_defaults.js | 2 ++ test/image/mocks/date_axes_period2.json | 2 ++ test/plot-schema.json | 24 ++++++++++++++++++++++ 5 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index c6d2c478ac8..bf78c16cba9 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2968,20 +2968,23 @@ axes.makeTransTickFn = function(ax) { axes.makeTransTickLabelFn = function(ax) { var uv = getTickLabelUV(ax); + var shiftx = ax.ticklabelshiftx; + var shifty = ax.ticklabelshifty; + var u = uv[0]; var v = uv[1]; return ax._id.charAt(0) === 'x' ? function(d) { return strTranslate( - u + ax._offset + ax.l2p(getPosX(d)), - v + u + ax._offset + ax.l2p(getPosX(d)) + shiftx, + v + shifty ); } : function(d) { return strTranslate( - v, - u + ax._offset + ax.l2p(getPosX(d)) + v + shiftx, + u + ax._offset + ax.l2p(getPosX(d)) + shifty ); }; }; diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 2532e0c75cd..02aeca2e4b3 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -698,6 +698,22 @@ module.exports = { 'In other cases the default is *hide past div*.' ].join(' ') }, + ticklabelshiftx: { + valType: 'number', + dflt: 0, + editType: 'ticks', + description: [ + 'Horizontally shifts the tick labels by the specified number of pixels.' + ].join(' ') + }, + ticklabelshifty: { + valType: 'number', + dflt: 0, + editType: 'ticks', + description: [ + 'Vertically shifts the tick labels by the specified number of pixels.' + ].join(' ') + }, mirror: { valType: 'enumerated', values: [true, 'ticks', false, 'all', 'allticks'], diff --git a/src/plots/cartesian/tick_label_defaults.js b/src/plots/cartesian/tick_label_defaults.js index 887daf220b2..7e286b0499c 100644 --- a/src/plots/cartesian/tick_label_defaults.js +++ b/src/plots/cartesian/tick_label_defaults.js @@ -16,6 +16,8 @@ module.exports = function handleTickLabelDefaults(containerIn, containerOut, coe var showTickLabels = coerce('showticklabels'); if(showTickLabels) { + coerce('ticklabelshiftx'); + coerce('ticklabelshifty'); var font = options.font || {}; var contColor = containerOut.color; var position = containerOut.ticklabelposition || ''; diff --git a/test/image/mocks/date_axes_period2.json b/test/image/mocks/date_axes_period2.json index eb62505a49c..cb83fbb4773 100644 --- a/test/image/mocks/date_axes_period2.json +++ b/test/image/mocks/date_axes_period2.json @@ -131,6 +131,7 @@ }, "xaxis": { "minor": { "ticks": "inside" }, + "ticklabelshiftx": 15, "tickcolor": "black", "gridcolor": "orange", "range": [ @@ -197,6 +198,7 @@ }, "xaxis7": { "minor": { "ticks": "inside" }, + "ticklabelshifty": -10, "tickcolor": "black", "gridcolor": "orange", "range": [ diff --git a/test/plot-schema.json b/test/plot-schema.json index fd2b1659e37..18774748ef3 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -15154,6 +15154,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "ticks", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "ticks", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -16463,6 +16475,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "ticks", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "ticks", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, From ad4509b6eaf7c66890647de7afd61feccca701dc Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Tue, 28 May 2024 09:52:02 +0200 Subject: [PATCH 02/24] makeTransTickLabelFn: default vals for ax.ticklabelshiftx/y Co-authored-by: Mojtaba Samimi <33888540+archmoj@users.noreply.github.com> --- src/plots/cartesian/axes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index bf78c16cba9..b8db37c67b4 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2968,8 +2968,8 @@ axes.makeTransTickFn = function(ax) { axes.makeTransTickLabelFn = function(ax) { var uv = getTickLabelUV(ax); - var shiftx = ax.ticklabelshiftx; - var shifty = ax.ticklabelshifty; + var shiftx = ax.ticklabelshiftx || 0; + var shifty = ax.ticklabelshifty || 0; var u = uv[0]; var v = uv[1]; From fa50121fbe117b4ca2f23a8713c2e001cd0caff2 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 27 May 2024 17:05:39 +0200 Subject: [PATCH 03/24] Add draftlog for PR 7006 --- draftlogs/7006_add.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 draftlogs/7006_add.md diff --git a/draftlogs/7006_add.md b/draftlogs/7006_add.md new file mode 100644 index 00000000000..e68a5beb339 --- /dev/null +++ b/draftlogs/7006_add.md @@ -0,0 +1 @@ + - Add property axis.ticklabelshiftx axis.ticklabelshifty for shifting the tick labels by a number of pixels [[#7006](https://github.com/plotly/plotly.js/pull/7006)] From d33e47cda7472dd377d15d9382a46566c8c66c9f Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Tue, 28 May 2024 11:10:47 +0200 Subject: [PATCH 04/24] Add ticklabelshiftx/y property to colorbar, indicator, gl3d, carpet, polar, smith, ternary --- src/components/colorbar/attributes.js | 4 +- src/plots/gl3d/layout/axis_attributes.js | 2 + src/plots/polar/layout_attributes.js | 2 + src/plots/smith/layout_attributes.js | 2 + src/plots/ternary/layout_attributes.js | 2 + src/traces/carpet/axis_attributes.js | 2 + src/traces/indicator/attributes.js | 2 + test/plot-schema.json | 600 +++++++++++++++++++++++ 8 files changed, 614 insertions(+), 2 deletions(-) diff --git a/src/components/colorbar/attributes.js b/src/components/colorbar/attributes.js index e048f29ad4b..d7d5935a183 100644 --- a/src/components/colorbar/attributes.js +++ b/src/components/colorbar/attributes.js @@ -169,7 +169,6 @@ module.exports = overrideAll({ 'In other cases the default is *hide past div*.' ].join(' ') }), - // ticklabelposition: not used directly, as values depend on orientation // left/right options are for x axes, and top/bottom options are for y axes ticklabelposition: { @@ -188,7 +187,8 @@ module.exports = overrideAll({ 'top and bottom when `orientation` is *v*.' ].join(' ') }, - + ticklabelshiftx: axesAttrs.ticklabelshiftx, + ticklabelshifty: axesAttrs.ticklabelshifty, ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, diff --git a/src/plots/gl3d/layout/axis_attributes.js b/src/plots/gl3d/layout/axis_attributes.js index 06542c01801..48683d4e504 100644 --- a/src/plots/gl3d/layout/axis_attributes.js +++ b/src/plots/gl3d/layout/axis_attributes.js @@ -93,6 +93,8 @@ module.exports = overrideAll({ ticks: axesAttrs.ticks, mirror: axesAttrs.mirror, ticklen: axesAttrs.ticklen, + ticklabelshiftx: axesAttrs.ticklabelshiftx, + ticklabelshifty: axesAttrs.ticklabelshifty, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, showticklabels: axesAttrs.showticklabels, diff --git a/src/plots/polar/layout_attributes.js b/src/plots/polar/layout_attributes.js index cef166556dd..1710bf55e33 100644 --- a/src/plots/polar/layout_attributes.js +++ b/src/plots/polar/layout_attributes.js @@ -33,6 +33,8 @@ var axisTickAttrs = overrideAll({ ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, + ticklabelshiftx: axesAttrs.ticklabelshiftx, + ticklabelshifty: axesAttrs.ticklabelshifty, ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, labelalias: axesAttrs.labelalias, diff --git a/src/plots/smith/layout_attributes.js b/src/plots/smith/layout_attributes.js index 94563e7c00f..c66651d5541 100644 --- a/src/plots/smith/layout_attributes.js +++ b/src/plots/smith/layout_attributes.js @@ -18,6 +18,8 @@ var axisLineGridAttr = overrideAll({ }, 'plot', 'from-root'); var axisTickAttrs = overrideAll({ + ticklabelshiftx: axesAttrs.ticklabelshiftx, + ticklabelshifty: axesAttrs.ticklabelshifty, ticklen: axesAttrs.ticklen, tickwidth: extendFlat({}, axesAttrs.tickwidth, {dflt: 2}), tickcolor: axesAttrs.tickcolor, diff --git a/src/plots/ternary/layout_attributes.js b/src/plots/ternary/layout_attributes.js index aa75bb8c84e..a55e1b2b3aa 100644 --- a/src/plots/ternary/layout_attributes.js +++ b/src/plots/ternary/layout_attributes.js @@ -25,6 +25,8 @@ var ternaryAxesAttrs = { ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, + ticklabelshiftx: axesAttrs.ticklabelshiftx, + ticklabelshifty: axesAttrs.ticklabelshifty, ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, labelalias: axesAttrs.labelalias, diff --git a/src/traces/carpet/axis_attributes.js b/src/traces/carpet/axis_attributes.js index 733ba93f53c..c29d6c14ec5 100644 --- a/src/traces/carpet/axis_attributes.js +++ b/src/traces/carpet/axis_attributes.js @@ -157,6 +157,8 @@ module.exports = { 'Has an effect only if `tickmode` is set to *auto*.' ].join(' ') }, + ticklabelshiftx: axesAttrs.ticklabelshiftx, + ticklabelshifty: axesAttrs.ticklabelshifty, tickvals: { valType: 'data_array', editType: 'calc', diff --git a/src/traces/indicator/attributes.js b/src/traces/indicator/attributes.js index 8516878c8b7..c876a52d1ab 100644 --- a/src/traces/indicator/attributes.js +++ b/src/traces/indicator/attributes.js @@ -317,6 +317,8 @@ module.exports = { ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, + ticklabelshiftx: axesAttrs.ticklabelshiftx, + ticklabelshifty: axesAttrs.ticklabelshifty, ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, labelalias: axesAttrs.labelalias, diff --git a/test/plot-schema.json b/test/plot-schema.json index 18774748ef3..2939e073841 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -1788,6 +1788,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -5250,6 +5262,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -6065,6 +6089,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -7597,6 +7633,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -8429,6 +8477,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -9261,6 +9321,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -10878,6 +10950,18 @@ "editType": "plot", "valType": "string" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -11161,6 +11245,18 @@ "editType": "plot", "valType": "string" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -11667,6 +11763,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -12275,6 +12383,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -12889,6 +13009,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -18044,6 +18176,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -20193,6 +20337,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -23805,6 +23961,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "ticks", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "ticks", + "valType": "number" + }, "tickmode": { "dflt": "array", "editType": "calc", @@ -24577,6 +24745,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "ticks", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "ticks", + "valType": "number" + }, "tickmode": { "dflt": "array", "editType": "calc", @@ -25601,6 +25781,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -27004,6 +27196,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -28436,6 +28640,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -29887,6 +30103,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -31820,6 +32048,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -33152,6 +33392,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -35145,6 +35397,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -37884,6 +38148,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -39532,6 +39808,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -41723,6 +42011,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -43285,6 +43585,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -44899,6 +45211,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -47376,6 +47700,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -49593,6 +49929,18 @@ }, "role": "object" }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "plot", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -50856,6 +51204,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -52482,6 +52842,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -55194,6 +55566,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -56593,6 +56977,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -62148,6 +62544,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -64915,6 +65323,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -65730,6 +66150,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -67673,6 +68105,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -70076,6 +70520,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -72608,6 +73064,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -75046,6 +75514,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -76682,6 +77162,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -79058,6 +79550,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -81378,6 +81882,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -83793,6 +84309,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -86139,6 +86667,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -87776,6 +88316,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -89927,6 +90479,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -91327,6 +91891,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -94759,6 +95335,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "colorbars", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -97913,6 +98501,18 @@ "inside bottom" ] }, + "ticklabelshiftx": { + "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "ticklabelshifty": { + "description": "Vertically shifts the tick labels by the specified number of pixels.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, From 3dcb2aa7c3a93bd751fe0b067d5196b4ebe9af03 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Tue, 28 May 2024 11:27:00 +0200 Subject: [PATCH 05/24] baseline image for updated date_axes_period2 using ticklabelshiftx/y --- test/image/baselines/date_axes_period2.png | Bin 40135 -> 39988 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/image/baselines/date_axes_period2.png b/test/image/baselines/date_axes_period2.png index 1606f5d87e59ae6b5802d0a6cb57afae5797836e..5fafcd27d2b77e8694ac087b550c2e78ba30e8f3 100644 GIT binary patch literal 39988 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 N3py9I%QaEq{{!ZUZ(0BV From facdad31f1ae2ba7913034988eaef70c2418c386 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Tue, 28 May 2024 13:51:27 +0200 Subject: [PATCH 06/24] =?UTF-8?q?ticklabelshiftx/y:=20valType=20number=20?= =?UTF-8?q?=E2=86=92=20integer.=20for=20carpet:=20editType=20ticks=20?= =?UTF-8?q?=E2=86=92=20calc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit carpet is a trace and therefore doesn't support editType ticks --- src/plots/cartesian/layout_attributes.js | 4 +- src/traces/carpet/axis_attributes.js | 18 +- test/plot-schema.json | 216 +++++++++++------------ 3 files changed, 126 insertions(+), 112 deletions(-) diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 02aeca2e4b3..7236e0c8522 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -699,7 +699,7 @@ module.exports = { ].join(' ') }, ticklabelshiftx: { - valType: 'number', + valType: 'integer', dflt: 0, editType: 'ticks', description: [ @@ -707,7 +707,7 @@ module.exports = { ].join(' ') }, ticklabelshifty: { - valType: 'number', + valType: 'integer', dflt: 0, editType: 'ticks', description: [ diff --git a/src/traces/carpet/axis_attributes.js b/src/traces/carpet/axis_attributes.js index c29d6c14ec5..d2467362928 100644 --- a/src/traces/carpet/axis_attributes.js +++ b/src/traces/carpet/axis_attributes.js @@ -157,8 +157,22 @@ module.exports = { 'Has an effect only if `tickmode` is set to *auto*.' ].join(' ') }, - ticklabelshiftx: axesAttrs.ticklabelshiftx, - ticklabelshifty: axesAttrs.ticklabelshifty, + ticklabelshiftx: { + valType: 'integer', + dflt: 0, + editType: 'calc', + description: [ + 'Horizontally shifts the tick labels by the specified number of pixels.' + ].join(' ') + }, + ticklabelshifty: { + valType: 'integer', + dflt: 0, + editType: 'calc', + description: [ + 'Vertically shifts the tick labels by the specified number of pixels.' + ].join(' ') + }, tickvals: { valType: 'data_array', editType: 'calc', diff --git a/test/plot-schema.json b/test/plot-schema.json index 2939e073841..f0b74b9ed7b 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -1792,13 +1792,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -5266,13 +5266,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -6093,13 +6093,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -7637,13 +7637,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklen": { "description": "Sets the tick length (in px).", @@ -8481,13 +8481,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklen": { "description": "Sets the tick length (in px).", @@ -9325,13 +9325,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklen": { "description": "Sets the tick length (in px).", @@ -10954,13 +10954,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklen": { "description": "Sets the tick length (in px).", @@ -11249,13 +11249,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklen": { "description": "Sets the tick length (in px).", @@ -11767,13 +11767,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -12387,13 +12387,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -13013,13 +13013,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -15290,13 +15290,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "ticks", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "ticks", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -16611,13 +16611,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "ticks", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "ticks", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -18180,13 +18180,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -20341,13 +20341,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -23964,14 +23964,14 @@ "ticklabelshiftx": { "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, - "editType": "ticks", - "valType": "number" + "editType": "calc", + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, - "editType": "ticks", - "valType": "number" + "editType": "calc", + "valType": "integer" }, "tickmode": { "dflt": "array", @@ -24748,14 +24748,14 @@ "ticklabelshiftx": { "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, - "editType": "ticks", - "valType": "number" + "editType": "calc", + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, - "editType": "ticks", - "valType": "number" + "editType": "calc", + "valType": "integer" }, "tickmode": { "dflt": "array", @@ -25785,13 +25785,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -27200,13 +27200,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -28644,13 +28644,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -30107,13 +30107,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -32052,13 +32052,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -33396,13 +33396,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -35401,13 +35401,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -38152,13 +38152,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -39812,13 +39812,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -42015,13 +42015,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -43589,13 +43589,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -45215,13 +45215,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -47704,13 +47704,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -49933,13 +49933,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "plot", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -51208,13 +51208,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -52846,13 +52846,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -55570,13 +55570,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -56981,13 +56981,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -62548,13 +62548,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -65327,13 +65327,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -66154,13 +66154,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -68109,13 +68109,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -70524,13 +70524,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -73068,13 +73068,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -75518,13 +75518,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -77166,13 +77166,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -79554,13 +79554,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -81886,13 +81886,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -84313,13 +84313,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -86671,13 +86671,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -88320,13 +88320,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -90483,13 +90483,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -91895,13 +91895,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -95339,13 +95339,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "colorbars", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", @@ -98505,13 +98505,13 @@ "description": "Horizontally shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelshifty": { "description": "Vertically shifts the tick labels by the specified number of pixels.", "dflt": 0, "editType": "calc", - "valType": "number" + "valType": "integer" }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", From ecf47872276e0a64f35ff461c79f28a7bc13fd83 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 3 Jun 2024 17:05:57 +0200 Subject: [PATCH 07/24] Revert ticklabelshiftx/y change to mock date_axes_period2 Separate test mock will follow --- test/image/baselines/date_axes_period2.png | Bin 39988 -> 40135 bytes test/image/mocks/date_axes_period2.json | 2 -- 2 files changed, 2 deletions(-) diff --git a/test/image/baselines/date_axes_period2.png b/test/image/baselines/date_axes_period2.png index 5fafcd27d2b77e8694ac087b550c2e78ba30e8f3..1606f5d87e59ae6b5802d0a6cb57afae5797836e 100644 GIT binary patch literal 40135 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 N3py9I%QaEq{{!ZUZ(0BV literal 39988 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 Date: Mon, 3 Jun 2024 17:13:59 +0200 Subject: [PATCH 08/24] Replace ticklabelshiftx/y with ticklabelrunoff and ticklabelstandoff And remove this feature from all non-cartesian traces. If other plots should be supported, this can be added and tested in separate PRs. --- src/components/colorbar/attributes.js | 3 +- src/components/colorbar/defaults.js | 1 + src/plots/cartesian/axes.js | 12 +- src/plots/cartesian/layout_attributes.js | 8 +- src/plots/cartesian/tick_label_defaults.js | 6 +- src/plots/gl3d/layout/axis_attributes.js | 2 - src/plots/gl3d/layout/axis_defaults.js | 1 + src/plots/polar/layout_attributes.js | 2 - src/plots/polar/layout_defaults.js | 3 +- src/plots/smith/layout_attributes.js | 2 - src/plots/smith/layout_defaults.js | 1 + src/plots/ternary/layout_attributes.js | 2 - src/plots/ternary/layout_defaults.js | 2 +- src/traces/carpet/ab_defaults.js | 1 + src/traces/carpet/axis_attributes.js | 16 - src/traces/indicator/attributes.js | 2 - src/traces/indicator/defaults.js | 3 +- test/plot-schema.json | 616 +-------------------- 18 files changed, 32 insertions(+), 651 deletions(-) diff --git a/src/components/colorbar/attributes.js b/src/components/colorbar/attributes.js index d7d5935a183..87a55dca488 100644 --- a/src/components/colorbar/attributes.js +++ b/src/components/colorbar/attributes.js @@ -169,6 +169,7 @@ module.exports = overrideAll({ 'In other cases the default is *hide past div*.' ].join(' ') }), + // ticklabelposition: not used directly, as values depend on orientation // left/right options are for x axes, and top/bottom options are for y axes ticklabelposition: { @@ -187,8 +188,6 @@ module.exports = overrideAll({ 'top and bottom when `orientation` is *v*.' ].join(' ') }, - ticklabelshiftx: axesAttrs.ticklabelshiftx, - ticklabelshifty: axesAttrs.ticklabelshifty, ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, diff --git a/src/components/colorbar/defaults.js b/src/components/colorbar/defaults.js index 6e8113421b6..17a929f95be 100644 --- a/src/components/colorbar/defaults.js +++ b/src/components/colorbar/defaults.js @@ -111,6 +111,7 @@ module.exports = function colorbarDefaults(containerIn, containerOut, layout) { var font = layout.font; var opts = { noAutotickangles: true, + noTicklabelrunoffstandoff: true, outerTicks: false, font: font }; diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index b8db37c67b4..4f7a9fbb6f0 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2968,8 +2968,8 @@ axes.makeTransTickFn = function(ax) { axes.makeTransTickLabelFn = function(ax) { var uv = getTickLabelUV(ax); - var shiftx = ax.ticklabelshiftx || 0; - var shifty = ax.ticklabelshifty || 0; + var runoff = ax.ticklabelrunoff || 0; + var standoff = ax.ticklabelstandoff || 0; var u = uv[0]; var v = uv[1]; @@ -2977,14 +2977,14 @@ axes.makeTransTickLabelFn = function(ax) { return ax._id.charAt(0) === 'x' ? function(d) { return strTranslate( - u + ax._offset + ax.l2p(getPosX(d)) + shiftx, - v + shifty + u + ax._offset + ax.l2p(getPosX(d)) + standoff, + v + runoff ); } : function(d) { return strTranslate( - v + shiftx, - u + ax._offset + ax.l2p(getPosX(d)) + shifty + v + runoff, + u + ax._offset + ax.l2p(getPosX(d)) + standoff ); }; }; diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 7236e0c8522..935a834d959 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -698,20 +698,20 @@ module.exports = { 'In other cases the default is *hide past div*.' ].join(' ') }, - ticklabelshiftx: { + ticklabelrunoff: { valType: 'integer', dflt: 0, editType: 'ticks', description: [ - 'Horizontally shifts the tick labels by the specified number of pixels.' + 'Shifts the tick labels by the specified number of pixels in parallel to the axis.' ].join(' ') }, - ticklabelshifty: { + ticklabelstandoff: { valType: 'integer', dflt: 0, editType: 'ticks', description: [ - 'Vertically shifts the tick labels by the specified number of pixels.' + 'Shifts the tick labels by the specified number of pixels orthogonally to the axis.' ].join(' ') }, mirror: { diff --git a/src/plots/cartesian/tick_label_defaults.js b/src/plots/cartesian/tick_label_defaults.js index 7e286b0499c..139c1febb9b 100644 --- a/src/plots/cartesian/tick_label_defaults.js +++ b/src/plots/cartesian/tick_label_defaults.js @@ -16,8 +16,10 @@ module.exports = function handleTickLabelDefaults(containerIn, containerOut, coe var showTickLabels = coerce('showticklabels'); if(showTickLabels) { - coerce('ticklabelshiftx'); - coerce('ticklabelshifty'); + if(!options.noTicklabelrunoffstandoff) { + coerce('ticklabelrunoff'); + coerce('ticklabelstandoff'); + } var font = options.font || {}; var contColor = containerOut.color; var position = containerOut.ticklabelposition || ''; diff --git a/src/plots/gl3d/layout/axis_attributes.js b/src/plots/gl3d/layout/axis_attributes.js index 48683d4e504..06542c01801 100644 --- a/src/plots/gl3d/layout/axis_attributes.js +++ b/src/plots/gl3d/layout/axis_attributes.js @@ -93,8 +93,6 @@ module.exports = overrideAll({ ticks: axesAttrs.ticks, mirror: axesAttrs.mirror, ticklen: axesAttrs.ticklen, - ticklabelshiftx: axesAttrs.ticklabelshiftx, - ticklabelshifty: axesAttrs.ticklabelshifty, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, showticklabels: axesAttrs.showticklabels, diff --git a/src/plots/gl3d/layout/axis_defaults.js b/src/plots/gl3d/layout/axis_defaults.js index 7bbc87249d7..9fa0a92620f 100644 --- a/src/plots/gl3d/layout/axis_defaults.js +++ b/src/plots/gl3d/layout/axis_defaults.js @@ -44,6 +44,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, options) { noAutotickangles: true, noTickson: true, noTicklabelmode: true, + noTicklabelrunoffstandoff: true, noTicklabelstep: true, noTicklabelposition: true, noTicklabeloverflow: true, diff --git a/src/plots/polar/layout_attributes.js b/src/plots/polar/layout_attributes.js index 1710bf55e33..cef166556dd 100644 --- a/src/plots/polar/layout_attributes.js +++ b/src/plots/polar/layout_attributes.js @@ -33,8 +33,6 @@ var axisTickAttrs = overrideAll({ ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, - ticklabelshiftx: axesAttrs.ticklabelshiftx, - ticklabelshifty: axesAttrs.ticklabelshifty, ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, labelalias: axesAttrs.labelalias, diff --git a/src/plots/polar/layout_defaults.js b/src/plots/polar/layout_defaults.js index 4585f355889..78ee87dbab9 100644 --- a/src/plots/polar/layout_defaults.js +++ b/src/plots/polar/layout_defaults.js @@ -186,7 +186,8 @@ function handleDefaults(contIn, contOut, coerce, opts) { size: dfltFontSize, family: dfltFontFamily }, - noAutotickangles: axName === 'angularaxis' + noAutotickangles: axName === 'angularaxis', + noTicklabelrunoffstandoff: true }); handleTickMarkDefaults(axIn, axOut, coerceAxis, {outerTicks: true}); diff --git a/src/plots/smith/layout_attributes.js b/src/plots/smith/layout_attributes.js index c66651d5541..94563e7c00f 100644 --- a/src/plots/smith/layout_attributes.js +++ b/src/plots/smith/layout_attributes.js @@ -18,8 +18,6 @@ var axisLineGridAttr = overrideAll({ }, 'plot', 'from-root'); var axisTickAttrs = overrideAll({ - ticklabelshiftx: axesAttrs.ticklabelshiftx, - ticklabelshifty: axesAttrs.ticklabelshifty, ticklen: axesAttrs.ticklen, tickwidth: extendFlat({}, axesAttrs.tickwidth, {dflt: 2}), tickcolor: axesAttrs.tickcolor, diff --git a/src/plots/smith/layout_defaults.js b/src/plots/smith/layout_defaults.js index b536c6f85ea..fe8c05412fe 100644 --- a/src/plots/smith/layout_defaults.js +++ b/src/plots/smith/layout_defaults.js @@ -90,6 +90,7 @@ function handleDefaults(contIn, contOut, coerce, opts) { handleTickLabelDefaults(axIn, axOut, coerceAxis, axOut.type, { noAutotickangles: true, + noTicklabelrunoffstandoff: true, noTicklabelstep: true, noAng: !isRealAxis, noExp: true, diff --git a/src/plots/ternary/layout_attributes.js b/src/plots/ternary/layout_attributes.js index a55e1b2b3aa..aa75bb8c84e 100644 --- a/src/plots/ternary/layout_attributes.js +++ b/src/plots/ternary/layout_attributes.js @@ -25,8 +25,6 @@ var ternaryAxesAttrs = { ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, - ticklabelshiftx: axesAttrs.ticklabelshiftx, - ticklabelshifty: axesAttrs.ticklabelshifty, ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, labelalias: axesAttrs.labelalias, diff --git a/src/plots/ternary/layout_defaults.js b/src/plots/ternary/layout_defaults.js index 4a59fc0d43b..3a44e888b53 100644 --- a/src/plots/ternary/layout_defaults.js +++ b/src/plots/ternary/layout_defaults.js @@ -91,7 +91,7 @@ function handleAxisDefaults(containerIn, containerOut, options, ternaryLayoutOut handleTickValueDefaults(containerIn, containerOut, coerce, 'linear'); handlePrefixSuffixDefaults(containerIn, containerOut, coerce, 'linear'); - handleTickLabelDefaults(containerIn, containerOut, coerce, 'linear', { noAutotickangles: true }); + handleTickLabelDefaults(containerIn, containerOut, coerce, 'linear', { noAutotickangles: true, noTicklabelrunoffstandoff: true }); handleTickMarkDefaults(containerIn, containerOut, coerce, { outerTicks: true }); diff --git a/src/traces/carpet/ab_defaults.js b/src/traces/carpet/ab_defaults.js index 58fe6e2baf6..e5cefefffe0 100644 --- a/src/traces/carpet/ab_defaults.js +++ b/src/traces/carpet/ab_defaults.js @@ -31,6 +31,7 @@ function mimickAxisDefaults(traceIn, traceOut, fullLayout, dfltColor) { var defaultOptions = { noAutotickangles: true, + noTicklabelrunoffstandoff: true, noTicklabelstep: true, tickfont: 'x', id: axLetter + 'axis', diff --git a/src/traces/carpet/axis_attributes.js b/src/traces/carpet/axis_attributes.js index d2467362928..733ba93f53c 100644 --- a/src/traces/carpet/axis_attributes.js +++ b/src/traces/carpet/axis_attributes.js @@ -157,22 +157,6 @@ module.exports = { 'Has an effect only if `tickmode` is set to *auto*.' ].join(' ') }, - ticklabelshiftx: { - valType: 'integer', - dflt: 0, - editType: 'calc', - description: [ - 'Horizontally shifts the tick labels by the specified number of pixels.' - ].join(' ') - }, - ticklabelshifty: { - valType: 'integer', - dflt: 0, - editType: 'calc', - description: [ - 'Vertically shifts the tick labels by the specified number of pixels.' - ].join(' ') - }, tickvals: { valType: 'data_array', editType: 'calc', diff --git a/src/traces/indicator/attributes.js b/src/traces/indicator/attributes.js index c876a52d1ab..8516878c8b7 100644 --- a/src/traces/indicator/attributes.js +++ b/src/traces/indicator/attributes.js @@ -317,8 +317,6 @@ module.exports = { ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, - ticklabelshiftx: axesAttrs.ticklabelshiftx, - ticklabelshifty: axesAttrs.ticklabelshifty, ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, labelalias: axesAttrs.labelalias, diff --git a/src/traces/indicator/defaults.js b/src/traces/indicator/defaults.js index ff8db452640..28af75b9d4d 100644 --- a/src/traces/indicator/defaults.js +++ b/src/traces/indicator/defaults.js @@ -132,7 +132,8 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) { var opts = { font: layout.font, noAutotickangles: true, - outerTicks: true + outerTicks: true, + noTicklabelrunoffstandoff: true }; handleTickValueDefaults(axisIn, axisOut, coerceGaugeAxis, 'linear'); handlePrefixSuffixDefaults(axisIn, axisOut, coerceGaugeAxis, 'linear', opts); diff --git a/test/plot-schema.json b/test/plot-schema.json index f0b74b9ed7b..49ed7858780 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -1788,18 +1788,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -5262,18 +5250,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -6089,18 +6065,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -7633,18 +7597,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -8477,18 +8429,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -9321,18 +9261,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -10950,18 +10878,6 @@ "editType": "plot", "valType": "string" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -11245,18 +11161,6 @@ "editType": "plot", "valType": "string" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, @@ -11763,18 +11667,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -12383,18 +12275,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -13009,18 +12889,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -15286,14 +15154,14 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "ticklabelrunoff": { + "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis.", "dflt": 0, "editType": "ticks", "valType": "integer" }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", + "ticklabelstandoff": { + "description": "Shifts the tick labels by the specified number of pixels orthogonally to the axis.", "dflt": 0, "editType": "ticks", "valType": "integer" @@ -16607,14 +16475,14 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", + "ticklabelrunoff": { + "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis.", "dflt": 0, "editType": "ticks", "valType": "integer" }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", + "ticklabelstandoff": { + "description": "Shifts the tick labels by the specified number of pixels orthogonally to the axis.", "dflt": 0, "editType": "ticks", "valType": "integer" @@ -18176,18 +18044,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -20337,18 +20193,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -23961,18 +23805,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "tickmode": { "dflt": "array", "editType": "calc", @@ -24745,18 +24577,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "tickmode": { "dflt": "array", "editType": "calc", @@ -25781,18 +25601,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -27196,18 +27004,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -28640,18 +28436,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -30103,18 +29887,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -32048,18 +31820,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -33392,18 +33152,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -35397,18 +35145,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -38148,18 +37884,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -39808,18 +39532,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -42011,18 +41723,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -43585,18 +43285,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -45211,18 +44899,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -47700,18 +47376,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -49929,18 +49593,6 @@ }, "role": "object" }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "plot", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -51204,18 +50856,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -52842,18 +52482,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -55566,18 +55194,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -56977,18 +56593,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -62544,18 +62148,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -65323,18 +64915,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -66150,18 +65730,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -68105,18 +67673,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -70520,18 +70076,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -73064,18 +72608,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -75514,18 +75046,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -77162,18 +76682,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -79550,18 +79058,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -81882,18 +81378,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -84309,18 +83793,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -86667,18 +86139,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -88316,18 +87776,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -90479,18 +89927,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -91891,18 +91327,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -95335,18 +94759,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "colorbars", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, @@ -98501,18 +97913,6 @@ "inside bottom" ] }, - "ticklabelshiftx": { - "description": "Horizontally shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, - "ticklabelshifty": { - "description": "Vertically shifts the tick labels by the specified number of pixels.", - "dflt": 0, - "editType": "calc", - "valType": "integer" - }, "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, From f06a81e8fba78fbaca9f51e8f74051151e783c5f Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 7 Jun 2024 16:57:09 +0200 Subject: [PATCH 09/24] Adjust ticklabelrunoff/ticklabelstandoff behavior depending on axis, axis.side and ticklabelposition. Standoff moves labels farther outside for outside labels and farther inside for inside labels. Runoff moves labels further along the axis range. --- src/plots/cartesian/axes.js | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 4f7a9fbb6f0..baad5dfe741 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2974,17 +2974,35 @@ axes.makeTransTickLabelFn = function(ax) { var u = uv[0]; var v = uv[1]; - return ax._id.charAt(0) === 'x' ? + var isXaxis = ax._id.charAt(0) === 'x'; + var isYaxis = !isXaxis; + var isReversed = ax.range[0] > ax.range[1]; + var ticksInside = ax.ticklabelposition && ax.ticklabelposition.indexOf('inside') !== -1; + var ticksOutside = !ticksInside; + + if(runoff) { + var runoffSign = isReversed ? -1 : 1; + runoff = runoff * runoffSign; + } + if(standoff) { + var standoffSign = + isXaxis && ax.side === 'bottom' && ticksOutside || + isXaxis && ax.side === 'top' && ticksInside || + isYaxis && ax.side === 'right' && ticksOutside || + isYaxis && ax.side === 'left' && ticksInside ? 1 : -1; + standoff = standoff * standoffSign; + } + return isXaxis ? function(d) { return strTranslate( - u + ax._offset + ax.l2p(getPosX(d)) + standoff, - v + runoff + u + ax._offset + ax.l2p(getPosX(d)) + runoff, + v + standoff ); } : function(d) { return strTranslate( - v + runoff, - u + ax._offset + ax.l2p(getPosX(d)) + standoff + v + standoff, + u + ax._offset + ax.l2p(getPosX(d)) + runoff ); }; }; From 57c82ee12e05d7e85dbce60a8d7da8bf58877772 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 7 Jun 2024 16:58:09 +0200 Subject: [PATCH 10/24] baseline test mock for ticklabelrunoff/ticklabelstandoff --- ...zzz_ticklabelrunoff_ticklabelstandoff.json | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 test/image/mocks/zzz_ticklabelrunoff_ticklabelstandoff.json diff --git a/test/image/mocks/zzz_ticklabelrunoff_ticklabelstandoff.json b/test/image/mocks/zzz_ticklabelrunoff_ticklabelstandoff.json new file mode 100644 index 00000000000..5a4bf068f88 --- /dev/null +++ b/test/image/mocks/zzz_ticklabelrunoff_ticklabelstandoff.json @@ -0,0 +1,158 @@ +{ + "data": [{ + "xaxis": "x", + "yaxis": "y", + "x": ["20-12-20", "21-01-20"], + "y": [1e-1, 1e+6] + }, { + "xaxis": "x2", + "yaxis": "y2", + "x": ["20-10", "21-05-15"], + "y": [1e-1, 1e+6] + }, { + "xaxis": "x3", + "yaxis": "y3", + "x": ["20", "23"], + "y": [1e-1, 1e+6] + }, { + "xaxis": "x4", + "yaxis": "y4", + "x": ["20-12-20", "21-01-20"], + "y": [1e-1, 1e+6] + }], + "layout": { + "xaxis": { + "minor": { "showgrid": true }, + "anchor": "y", + "domain": [0, 0.475], + "type": "date", + "ticklabelmode": "period", + "ticklabelstandoff": 20, + "ticklabelrunoff": 20, + "side": "bottom", + "ticks": "inside", + "tickfont": { "size": 16 }, + "ticklen": 16, + "tickwidth": 8, + "linewidth": 1, + "gridcolor": "white" + }, + "yaxis": { + "minor": { "showgrid": true }, + "anchor": "x", + "domain": [0, 0.475], + "autorange": "reversed", + "type": "log", + "side": "left", + "ticks": "inside", + "ticklabelposition": "outside top", + "ticklabelstandoff": 20, + "tickfont": { "size": 20 }, + "ticklen": 8, + "tickwidth": 4, + "linewidth": 4, + "gridcolor": "white" + }, + "xaxis2": { + "minor": { "showgrid": true }, + "anchor": "y2", + "domain": [0.525, 1], + "autorange": "reversed", + "type": "date", + "side": "bottom", + "ticks": "inside", + "ticklabelposition": "inside left", + "ticklabelstandoff": 20, + "tickfont": { "size": 20 }, + "ticklen": 8, + "tickwidth": 4, + "linewidth": 4, + "gridcolor": "white" + }, + "yaxis2": { + "minor": { "showgrid": true }, + "anchor": "x2", + "domain": [0, 0.475], + "type": "log", + "side": "right", + "ticks": "inside", + "ticklabelposition": "inside", + "ticklabelstandoff": 20, + "ticklen": 16, + "tickwidth": 8, + "linewidth": 1, + "gridcolor": "white" + }, + "xaxis3": { + "minor": { "showgrid": true }, + "anchor": "y3", + "domain": [0.525, 1], + "type": "date", + "side": "top", + "ticks": "inside", + "ticklabelposition": "inside right", + "ticklabelstandoff": 20, + "ticklabelrunoff": 40, + "tickfont": { "size": 20 }, + "ticklen": 16, + "tickwidth": 8, + "linewidth": 1, + "gridcolor": "white" + }, + "yaxis3": { + "minor": { "showgrid": true }, + "anchor": "x3", + "domain": [0.525, 1], + "autorange": "reversed", + "type": "log", + "side": "right", + "ticks": "inside", + "ticklabelposition": "inside bottom", + "ticklabelstandoff": 10, + "ticklabelrunoff": -10, + "tickfont": { "size": 16 }, + "ticklen": 8, + "tickwidth": 4, + "linewidth": 4, + "gridcolor": "white" + }, + "xaxis4": { + "minor": { "showgrid": true }, + "anchor": "y4", + "domain": [0, 0.475], + "autorange": "reversed", + "type": "date", + "ticklabelmode": "period", + "side": "top", + "ticks": "outside", + "ticklabelposition": "outside", + "ticklabelstandoff": -10, + "ticklabelrunoff": 15, + "tickfont": { "size": 16 }, + "ticklen": 8, + "tickwidth": 4, + "linewidth": 4, + "gridcolor": "white" + }, + "yaxis4": { + "minor": { "showgrid": true }, + "anchor": "x4", + "domain": [0.525, 1], + "type": "log", + "side": "left", + "ticks": "outside", + "ticklabelposition": "outside bottom", + "tickangle": 30, + "tickfont": { "size": 16 }, + "ticklen": 16, + "tickwidth": 8, + "linewidth": 1, + "gridcolor": "white" + }, + "font": { + "family": "Raleway" + }, + "plot_bgcolor": "lightblue", + "showlegend": false + } +} From 4b62652cecf90882a20fb10ff1119f1386d9d2d1 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Sat, 8 Jun 2024 14:35:01 +0200 Subject: [PATCH 11/24] baseline image for mock zzz_ticklabelrunoff_standoff --- .../zzz_ticklabelrunoff_ticklabelstandoff.png | Bin 0 -> 55797 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/image/baselines/zzz_ticklabelrunoff_ticklabelstandoff.png diff --git a/test/image/baselines/zzz_ticklabelrunoff_ticklabelstandoff.png b/test/image/baselines/zzz_ticklabelrunoff_ticklabelstandoff.png new file mode 100644 index 0000000000000000000000000000000000000000..67316c0fed7329e74556d4d7faa660ec2bb57fb1 GIT binary patch literal 55797 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 Date: Thu, 13 Jun 2024 14:01:59 +0200 Subject: [PATCH 12/24] =?UTF-8?q?Split=20option=20noTicklabelrunoffstandof?= =?UTF-8?q?f=20=E2=86=92=20noTicklabelrunoff,=20noTicklabelstandoff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/colorbar/defaults.js | 3 ++- src/plots/cartesian/tick_label_defaults.js | 4 +++- src/plots/gl3d/layout/axis_defaults.js | 3 ++- src/plots/polar/layout_defaults.js | 3 ++- src/plots/smith/layout_defaults.js | 3 ++- src/plots/ternary/layout_defaults.js | 6 +++++- src/traces/carpet/ab_defaults.js | 3 ++- src/traces/indicator/defaults.js | 3 ++- 8 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/components/colorbar/defaults.js b/src/components/colorbar/defaults.js index 17a929f95be..5165ccb119c 100644 --- a/src/components/colorbar/defaults.js +++ b/src/components/colorbar/defaults.js @@ -111,7 +111,8 @@ module.exports = function colorbarDefaults(containerIn, containerOut, layout) { var font = layout.font; var opts = { noAutotickangles: true, - noTicklabelrunoffstandoff: true, + noTicklabelrunoff: true, + noTicklabelstandoff: true, outerTicks: false, font: font }; diff --git a/src/plots/cartesian/tick_label_defaults.js b/src/plots/cartesian/tick_label_defaults.js index 139c1febb9b..60481a7ec18 100644 --- a/src/plots/cartesian/tick_label_defaults.js +++ b/src/plots/cartesian/tick_label_defaults.js @@ -16,8 +16,10 @@ module.exports = function handleTickLabelDefaults(containerIn, containerOut, coe var showTickLabels = coerce('showticklabels'); if(showTickLabels) { - if(!options.noTicklabelrunoffstandoff) { + if(!options.noTicklabelrunoff) { coerce('ticklabelrunoff'); + } + if(!options.noTicklabelstandoff) { coerce('ticklabelstandoff'); } var font = options.font || {}; diff --git a/src/plots/gl3d/layout/axis_defaults.js b/src/plots/gl3d/layout/axis_defaults.js index 9fa0a92620f..b2999c6dc0f 100644 --- a/src/plots/gl3d/layout/axis_defaults.js +++ b/src/plots/gl3d/layout/axis_defaults.js @@ -44,7 +44,8 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, options) { noAutotickangles: true, noTickson: true, noTicklabelmode: true, - noTicklabelrunoffstandoff: true, + noTicklabelrunoff: true, + noTicklabelstandoff: true, noTicklabelstep: true, noTicklabelposition: true, noTicklabeloverflow: true, diff --git a/src/plots/polar/layout_defaults.js b/src/plots/polar/layout_defaults.js index 78ee87dbab9..1e48099b0a6 100644 --- a/src/plots/polar/layout_defaults.js +++ b/src/plots/polar/layout_defaults.js @@ -187,7 +187,8 @@ function handleDefaults(contIn, contOut, coerce, opts) { family: dfltFontFamily }, noAutotickangles: axName === 'angularaxis', - noTicklabelrunoffstandoff: true + noTicklabelrunoff: true, + noTicklabelstandoff: true }); handleTickMarkDefaults(axIn, axOut, coerceAxis, {outerTicks: true}); diff --git a/src/plots/smith/layout_defaults.js b/src/plots/smith/layout_defaults.js index fe8c05412fe..0260fde2d6a 100644 --- a/src/plots/smith/layout_defaults.js +++ b/src/plots/smith/layout_defaults.js @@ -90,7 +90,8 @@ function handleDefaults(contIn, contOut, coerce, opts) { handleTickLabelDefaults(axIn, axOut, coerceAxis, axOut.type, { noAutotickangles: true, - noTicklabelrunoffstandoff: true, + noTicklabelrunoff: true, + noTicklabelstandoff: true, noTicklabelstep: true, noAng: !isRealAxis, noExp: true, diff --git a/src/plots/ternary/layout_defaults.js b/src/plots/ternary/layout_defaults.js index 3a44e888b53..166cd6aef27 100644 --- a/src/plots/ternary/layout_defaults.js +++ b/src/plots/ternary/layout_defaults.js @@ -91,7 +91,11 @@ function handleAxisDefaults(containerIn, containerOut, options, ternaryLayoutOut handleTickValueDefaults(containerIn, containerOut, coerce, 'linear'); handlePrefixSuffixDefaults(containerIn, containerOut, coerce, 'linear'); - handleTickLabelDefaults(containerIn, containerOut, coerce, 'linear', { noAutotickangles: true, noTicklabelrunoffstandoff: true }); + handleTickLabelDefaults(containerIn, containerOut, coerce, 'linear', { + noAutotickangles: true, + noTicklabelrunoff: true, + noTicklabelstandoff: true + }); handleTickMarkDefaults(containerIn, containerOut, coerce, { outerTicks: true }); diff --git a/src/traces/carpet/ab_defaults.js b/src/traces/carpet/ab_defaults.js index e5cefefffe0..293c30144eb 100644 --- a/src/traces/carpet/ab_defaults.js +++ b/src/traces/carpet/ab_defaults.js @@ -31,7 +31,8 @@ function mimickAxisDefaults(traceIn, traceOut, fullLayout, dfltColor) { var defaultOptions = { noAutotickangles: true, - noTicklabelrunoffstandoff: true, + noTicklabelrunoff: true, + noTicklabelstandoff: true, noTicklabelstep: true, tickfont: 'x', id: axLetter + 'axis', diff --git a/src/traces/indicator/defaults.js b/src/traces/indicator/defaults.js index 28af75b9d4d..8ff67b3d291 100644 --- a/src/traces/indicator/defaults.js +++ b/src/traces/indicator/defaults.js @@ -133,7 +133,8 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) { font: layout.font, noAutotickangles: true, outerTicks: true, - noTicklabelrunoffstandoff: true + noTicklabelrunoff: true, + noTicklabelstandoff: true }; handleTickValueDefaults(axisIn, axisOut, coerceGaugeAxis, 'linear'); handlePrefixSuffixDefaults(axisIn, axisOut, coerceGaugeAxis, 'linear', opts); From 9ca95a251deaf3c886611d0f7263e485ca6f1985 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Thu, 13 Jun 2024 14:01:59 +0200 Subject: [PATCH 13/24] Update property names in draftlog for PR 7006 --- draftlogs/7006_add.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draftlogs/7006_add.md b/draftlogs/7006_add.md index e68a5beb339..b59b1a281d0 100644 --- a/draftlogs/7006_add.md +++ b/draftlogs/7006_add.md @@ -1 +1 @@ - - Add property axis.ticklabelshiftx axis.ticklabelshifty for shifting the tick labels by a number of pixels [[#7006](https://github.com/plotly/plotly.js/pull/7006)] + - Add property axis.ticklabelrunoff axis.ticklabelstandoff for shifting the tick labels by a number of pixels [[#7006](https://github.com/plotly/plotly.js/pull/7006)] From 6ea832f426a1b6b32645803588ae7c020b78524b Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Tue, 18 Jun 2024 09:22:25 +0200 Subject: [PATCH 14/24] Mark flaky: "should be able to restyle radial axis title" --- test/jasmine/tests/polar_test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jasmine/tests/polar_test.js b/test/jasmine/tests/polar_test.js index 743e6497987..4ad95d77571 100644 --- a/test/jasmine/tests/polar_test.js +++ b/test/jasmine/tests/polar_test.js @@ -447,7 +447,7 @@ describe('Test relayout on polar subplots:', function() { .then(done, done.fail); }); - it('should be able to restyle radial axis title', function(done) { + it('@flaky should be able to restyle radial axis title', function(done) { var gd = createGraphDiv(); var lastBBox; From b7a63270ff176b8619466085612271b1bdb30aef Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 19 Jun 2024 15:43:51 +0200 Subject: [PATCH 15/24] Revert "Mark flaky: "should be able to restyle radial axis title"" This reverts commit 6ea832f426a1b6b32645803588ae7c020b78524b. --- test/jasmine/tests/polar_test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jasmine/tests/polar_test.js b/test/jasmine/tests/polar_test.js index 4ad95d77571..743e6497987 100644 --- a/test/jasmine/tests/polar_test.js +++ b/test/jasmine/tests/polar_test.js @@ -447,7 +447,7 @@ describe('Test relayout on polar subplots:', function() { .then(done, done.fail); }); - it('@flaky should be able to restyle radial axis title', function(done) { + it('should be able to restyle radial axis title', function(done) { var gd = createGraphDiv(); var lastBBox; From e7a980afa2345d072d61b36f9a22eb01c40c84b6 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 26 Jun 2024 14:12:46 +0200 Subject: [PATCH 16/24] Revert accidentally removed line in colorbar attributes --- src/components/colorbar/attributes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/colorbar/attributes.js b/src/components/colorbar/attributes.js index 87a55dca488..e048f29ad4b 100644 --- a/src/components/colorbar/attributes.js +++ b/src/components/colorbar/attributes.js @@ -188,6 +188,7 @@ module.exports = overrideAll({ 'top and bottom when `orientation` is *v*.' ].join(' ') }, + ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, From e8f88bacd32cbd710138455203b29f70a5a4080d Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 26 Jun 2024 17:14:50 +0200 Subject: [PATCH 17/24] correct var name. it's not ticks inside/outside, but labels inside/outside --- src/plots/cartesian/axes.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index baad5dfe741..ef80165cb92 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2977,8 +2977,8 @@ axes.makeTransTickLabelFn = function(ax) { var isXaxis = ax._id.charAt(0) === 'x'; var isYaxis = !isXaxis; var isReversed = ax.range[0] > ax.range[1]; - var ticksInside = ax.ticklabelposition && ax.ticklabelposition.indexOf('inside') !== -1; - var ticksOutside = !ticksInside; + var labelsInside = ax.ticklabelposition && ax.ticklabelposition.indexOf('inside') !== -1; + var labelsOutside = !labelsInside; if(runoff) { var runoffSign = isReversed ? -1 : 1; @@ -2986,10 +2986,10 @@ axes.makeTransTickLabelFn = function(ax) { } if(standoff) { var standoffSign = - isXaxis && ax.side === 'bottom' && ticksOutside || - isXaxis && ax.side === 'top' && ticksInside || - isYaxis && ax.side === 'right' && ticksOutside || - isYaxis && ax.side === 'left' && ticksInside ? 1 : -1; + isXaxis && ax.side === 'bottom' && labelsOutside || + isXaxis && ax.side === 'top' && labelsInside || + isYaxis && ax.side === 'right' && labelsOutside || + isYaxis && ax.side === 'left' && labelsInside ? 1 : -1; standoff = standoff * standoffSign; } return isXaxis ? From d9210da16541d9efd105f55a517f1fef66480884 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 26 Jun 2024 17:24:58 +0200 Subject: [PATCH 18/24] Clarify the direction of movement for ticklabelstandoff and ticklabelrunoff --- src/plots/cartesian/layout_attributes.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 935a834d959..c8ec3c31823 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -703,7 +703,8 @@ module.exports = { dflt: 0, editType: 'ticks', description: [ - 'Shifts the tick labels by the specified number of pixels in parallel to the axis.' + 'Shifts the tick labels by the specified number of pixels in parallel to the axis.', + 'Positive values move the labels in the positive direction of the axis.' ].join(' ') }, ticklabelstandoff: { @@ -711,7 +712,10 @@ module.exports = { dflt: 0, editType: 'ticks', description: [ - 'Shifts the tick labels by the specified number of pixels orthogonally to the axis.' + 'Shifts the tick labels by the specified number of pixels orthogonally to the axis.', + 'A positive `ticklabelstandoff` will move the labels farther away from the plot area', + 'if `ticklabelposition` is "outside", and deeper into the plotarea if', + '`ticklabelposition` is "inside".' ].join(' ') }, mirror: { From e33270b52643cf8283526388776ba178d9a5df39 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 26 Jun 2024 17:27:28 +0200 Subject: [PATCH 19/24] update plot-schema as well --- test/plot-schema.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/plot-schema.json b/test/plot-schema.json index 49ed7858780..bc1185a5665 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -15155,13 +15155,13 @@ ] }, "ticklabelrunoff": { - "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis.", + "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis. Positive values move the labels in the positive direction of the axis.", "dflt": 0, "editType": "ticks", "valType": "integer" }, "ticklabelstandoff": { - "description": "Shifts the tick labels by the specified number of pixels orthogonally to the axis.", + "description": "Shifts the tick labels by the specified number of pixels orthogonally to the axis. A positive `ticklabelstandoff` will move the labels farther away from the plot area if `ticklabelposition` is \"outside\", and deeper into the plotarea if `ticklabelposition` is \"inside\".", "dflt": 0, "editType": "ticks", "valType": "integer" @@ -16476,13 +16476,13 @@ ] }, "ticklabelrunoff": { - "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis.", + "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis. Positive values move the labels in the positive direction of the axis.", "dflt": 0, "editType": "ticks", "valType": "integer" }, "ticklabelstandoff": { - "description": "Shifts the tick labels by the specified number of pixels orthogonally to the axis.", + "description": "Shifts the tick labels by the specified number of pixels orthogonally to the axis. A positive `ticklabelstandoff` will move the labels farther away from the plot area if `ticklabelposition` is \"outside\", and deeper into the plotarea if `ticklabelposition` is \"inside\".", "dflt": 0, "editType": "ticks", "valType": "integer" From ec5df56d82a4743b3a0d0ad39119685e9d451c8c Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 3 Jul 2024 16:40:48 +0200 Subject: [PATCH 20/24] =?UTF-8?q?Rename=20ticklabelrunoff=20=E2=86=92=20ti?= =?UTF-8?q?cklabelshift?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/colorbar/defaults.js | 2 +- src/plots/cartesian/axes.js | 12 ++++++------ src/plots/cartesian/layout_attributes.js | 2 +- src/plots/cartesian/tick_label_defaults.js | 4 ++-- src/plots/gl3d/layout/axis_defaults.js | 2 +- src/plots/polar/layout_defaults.js | 2 +- src/plots/smith/layout_defaults.js | 2 +- src/plots/ternary/layout_defaults.js | 2 +- src/traces/carpet/ab_defaults.js | 2 +- src/traces/indicator/defaults.js | 2 +- ...png => zzz_ticklabelshift_ticklabelstandoff.png} | Bin ...on => zzz_ticklabelshift_ticklabelstandoff.json} | 8 ++++---- test/plot-schema.json | 4 ++-- 13 files changed, 22 insertions(+), 22 deletions(-) rename test/image/baselines/{zzz_ticklabelrunoff_ticklabelstandoff.png => zzz_ticklabelshift_ticklabelstandoff.png} (100%) rename test/image/mocks/{zzz_ticklabelrunoff_ticklabelstandoff.json => zzz_ticklabelshift_ticklabelstandoff.json} (96%) diff --git a/src/components/colorbar/defaults.js b/src/components/colorbar/defaults.js index 5165ccb119c..2fab3cd5209 100644 --- a/src/components/colorbar/defaults.js +++ b/src/components/colorbar/defaults.js @@ -111,7 +111,7 @@ module.exports = function colorbarDefaults(containerIn, containerOut, layout) { var font = layout.font; var opts = { noAutotickangles: true, - noTicklabelrunoff: true, + noTicklabelshift: true, noTicklabelstandoff: true, outerTicks: false, font: font diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index ef80165cb92..4c75baf28c1 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2968,7 +2968,7 @@ axes.makeTransTickFn = function(ax) { axes.makeTransTickLabelFn = function(ax) { var uv = getTickLabelUV(ax); - var runoff = ax.ticklabelrunoff || 0; + var shift = ax.ticklabelshift || 0; var standoff = ax.ticklabelstandoff || 0; var u = uv[0]; @@ -2980,9 +2980,9 @@ axes.makeTransTickLabelFn = function(ax) { var labelsInside = ax.ticklabelposition && ax.ticklabelposition.indexOf('inside') !== -1; var labelsOutside = !labelsInside; - if(runoff) { - var runoffSign = isReversed ? -1 : 1; - runoff = runoff * runoffSign; + if(shift) { + var shiftSign = isReversed ? -1 : 1; + shift = shift * shiftSign; } if(standoff) { var standoffSign = @@ -2995,14 +2995,14 @@ axes.makeTransTickLabelFn = function(ax) { return isXaxis ? function(d) { return strTranslate( - u + ax._offset + ax.l2p(getPosX(d)) + runoff, + u + ax._offset + ax.l2p(getPosX(d)) + shift, v + standoff ); } : function(d) { return strTranslate( v + standoff, - u + ax._offset + ax.l2p(getPosX(d)) + runoff + u + ax._offset + ax.l2p(getPosX(d)) + shift ); }; }; diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index c8ec3c31823..02c179d3758 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -698,7 +698,7 @@ module.exports = { 'In other cases the default is *hide past div*.' ].join(' ') }, - ticklabelrunoff: { + ticklabelshift: { valType: 'integer', dflt: 0, editType: 'ticks', diff --git a/src/plots/cartesian/tick_label_defaults.js b/src/plots/cartesian/tick_label_defaults.js index 60481a7ec18..7391dd12323 100644 --- a/src/plots/cartesian/tick_label_defaults.js +++ b/src/plots/cartesian/tick_label_defaults.js @@ -16,8 +16,8 @@ module.exports = function handleTickLabelDefaults(containerIn, containerOut, coe var showTickLabels = coerce('showticklabels'); if(showTickLabels) { - if(!options.noTicklabelrunoff) { - coerce('ticklabelrunoff'); + if(!options.noTicklabelshift) { + coerce('ticklabelshift'); } if(!options.noTicklabelstandoff) { coerce('ticklabelstandoff'); diff --git a/src/plots/gl3d/layout/axis_defaults.js b/src/plots/gl3d/layout/axis_defaults.js index b2999c6dc0f..ae04bb5fe19 100644 --- a/src/plots/gl3d/layout/axis_defaults.js +++ b/src/plots/gl3d/layout/axis_defaults.js @@ -44,7 +44,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, options) { noAutotickangles: true, noTickson: true, noTicklabelmode: true, - noTicklabelrunoff: true, + noTicklabelshift: true, noTicklabelstandoff: true, noTicklabelstep: true, noTicklabelposition: true, diff --git a/src/plots/polar/layout_defaults.js b/src/plots/polar/layout_defaults.js index 1e48099b0a6..7b4b9507ca6 100644 --- a/src/plots/polar/layout_defaults.js +++ b/src/plots/polar/layout_defaults.js @@ -187,7 +187,7 @@ function handleDefaults(contIn, contOut, coerce, opts) { family: dfltFontFamily }, noAutotickangles: axName === 'angularaxis', - noTicklabelrunoff: true, + noTicklabelshift: true, noTicklabelstandoff: true }); diff --git a/src/plots/smith/layout_defaults.js b/src/plots/smith/layout_defaults.js index 0260fde2d6a..17c8ac71b3e 100644 --- a/src/plots/smith/layout_defaults.js +++ b/src/plots/smith/layout_defaults.js @@ -90,7 +90,7 @@ function handleDefaults(contIn, contOut, coerce, opts) { handleTickLabelDefaults(axIn, axOut, coerceAxis, axOut.type, { noAutotickangles: true, - noTicklabelrunoff: true, + noTicklabelshift: true, noTicklabelstandoff: true, noTicklabelstep: true, noAng: !isRealAxis, diff --git a/src/plots/ternary/layout_defaults.js b/src/plots/ternary/layout_defaults.js index 166cd6aef27..4afece35e7c 100644 --- a/src/plots/ternary/layout_defaults.js +++ b/src/plots/ternary/layout_defaults.js @@ -93,7 +93,7 @@ function handleAxisDefaults(containerIn, containerOut, options, ternaryLayoutOut handlePrefixSuffixDefaults(containerIn, containerOut, coerce, 'linear'); handleTickLabelDefaults(containerIn, containerOut, coerce, 'linear', { noAutotickangles: true, - noTicklabelrunoff: true, + noTicklabelshift: true, noTicklabelstandoff: true }); handleTickMarkDefaults(containerIn, containerOut, coerce, diff --git a/src/traces/carpet/ab_defaults.js b/src/traces/carpet/ab_defaults.js index 293c30144eb..48895a4c242 100644 --- a/src/traces/carpet/ab_defaults.js +++ b/src/traces/carpet/ab_defaults.js @@ -31,7 +31,7 @@ function mimickAxisDefaults(traceIn, traceOut, fullLayout, dfltColor) { var defaultOptions = { noAutotickangles: true, - noTicklabelrunoff: true, + noTicklabelshift: true, noTicklabelstandoff: true, noTicklabelstep: true, tickfont: 'x', diff --git a/src/traces/indicator/defaults.js b/src/traces/indicator/defaults.js index 8ff67b3d291..3da64f53514 100644 --- a/src/traces/indicator/defaults.js +++ b/src/traces/indicator/defaults.js @@ -133,7 +133,7 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) { font: layout.font, noAutotickangles: true, outerTicks: true, - noTicklabelrunoff: true, + noTicklabelshift: true, noTicklabelstandoff: true }; handleTickValueDefaults(axisIn, axisOut, coerceGaugeAxis, 'linear'); diff --git a/test/image/baselines/zzz_ticklabelrunoff_ticklabelstandoff.png b/test/image/baselines/zzz_ticklabelshift_ticklabelstandoff.png similarity index 100% rename from test/image/baselines/zzz_ticklabelrunoff_ticklabelstandoff.png rename to test/image/baselines/zzz_ticklabelshift_ticklabelstandoff.png diff --git a/test/image/mocks/zzz_ticklabelrunoff_ticklabelstandoff.json b/test/image/mocks/zzz_ticklabelshift_ticklabelstandoff.json similarity index 96% rename from test/image/mocks/zzz_ticklabelrunoff_ticklabelstandoff.json rename to test/image/mocks/zzz_ticklabelshift_ticklabelstandoff.json index 5a4bf068f88..a6fab3d9041 100644 --- a/test/image/mocks/zzz_ticklabelrunoff_ticklabelstandoff.json +++ b/test/image/mocks/zzz_ticklabelshift_ticklabelstandoff.json @@ -28,7 +28,7 @@ "type": "date", "ticklabelmode": "period", "ticklabelstandoff": 20, - "ticklabelrunoff": 20, + "ticklabelshift": 20, "side": "bottom", "ticks": "inside", "tickfont": { "size": 16 }, @@ -92,7 +92,7 @@ "ticks": "inside", "ticklabelposition": "inside right", "ticklabelstandoff": 20, - "ticklabelrunoff": 40, + "ticklabelshift": 40, "tickfont": { "size": 20 }, "ticklen": 16, "tickwidth": 8, @@ -109,7 +109,7 @@ "ticks": "inside", "ticklabelposition": "inside bottom", "ticklabelstandoff": 10, - "ticklabelrunoff": -10, + "ticklabelshift": -10, "tickfont": { "size": 16 }, "ticklen": 8, "tickwidth": 4, @@ -127,7 +127,7 @@ "ticks": "outside", "ticklabelposition": "outside", "ticklabelstandoff": -10, - "ticklabelrunoff": 15, + "ticklabelshift": 15, "tickfont": { "size": 16 }, "ticklen": 8, "tickwidth": 4, diff --git a/test/plot-schema.json b/test/plot-schema.json index bc1185a5665..63778069b3b 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -15154,7 +15154,7 @@ "inside bottom" ] }, - "ticklabelrunoff": { + "ticklabelshift": { "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis. Positive values move the labels in the positive direction of the axis.", "dflt": 0, "editType": "ticks", @@ -16475,7 +16475,7 @@ "inside bottom" ] }, - "ticklabelrunoff": { + "ticklabelshift": { "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis. Positive values move the labels in the positive direction of the axis.", "dflt": 0, "editType": "ticks", From e3b0baa18f6406172b3eaa787428e2f424bbf4dc Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 5 Jul 2024 07:01:20 +0200 Subject: [PATCH 21/24] Update draftlogs/7006_add.md Update draftlog for renaming of `ticklabelrunoff` to `ticklabelshift` Co-authored-by: Mojtaba Samimi <33888540+archmoj@users.noreply.github.com> --- draftlogs/7006_add.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draftlogs/7006_add.md b/draftlogs/7006_add.md index b59b1a281d0..e2fa4ace77e 100644 --- a/draftlogs/7006_add.md +++ b/draftlogs/7006_add.md @@ -1 +1 @@ - - Add property axis.ticklabelrunoff axis.ticklabelstandoff for shifting the tick labels by a number of pixels [[#7006](https://github.com/plotly/plotly.js/pull/7006)] + - Add property axis.ticklabelstandoff axis.ticklabelshift for shifting the tick labels by a number of pixels [[#7006](https://github.com/plotly/plotly.js/pull/7006)] From 23a21c1fdead98f267ae47110428fd65d4b603aa Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 5 Jul 2024 07:20:22 +0200 Subject: [PATCH 22/24] Simplify code for standoff sign (no need to test if ax.side matches axis, because this check is done before) --- src/plots/cartesian/axes.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 4c75baf28c1..2b2dffe6840 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2974,8 +2974,6 @@ axes.makeTransTickLabelFn = function(ax) { var u = uv[0]; var v = uv[1]; - var isXaxis = ax._id.charAt(0) === 'x'; - var isYaxis = !isXaxis; var isReversed = ax.range[0] > ax.range[1]; var labelsInside = ax.ticklabelposition && ax.ticklabelposition.indexOf('inside') !== -1; var labelsOutside = !labelsInside; @@ -2985,14 +2983,14 @@ axes.makeTransTickLabelFn = function(ax) { shift = shift * shiftSign; } if(standoff) { - var standoffSign = - isXaxis && ax.side === 'bottom' && labelsOutside || - isXaxis && ax.side === 'top' && labelsInside || - isYaxis && ax.side === 'right' && labelsOutside || - isYaxis && ax.side === 'left' && labelsInside ? 1 : -1; + var side = ax.side; + var standoffSign = ( + (labelsInside && (side === 'top' || side === 'left')) || + (labelsOutside && (side === 'bottom' || side === 'right')) + ) ? 1 : -1; standoff = standoff * standoffSign; } - return isXaxis ? + return ax._id.charAt(0) === 'x' ? function(d) { return strTranslate( u + ax._offset + ax.l2p(getPosX(d)) + shift, From 67155648f3e2f0a165d6ad9d387d183e23f1e190 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 5 Jul 2024 15:02:30 +0200 Subject: [PATCH 23/24] Update draftlogs/7006_add.md Improve draftlog text for ticklabelstandoff and ticklabelshift Co-authored-by: Mojtaba Samimi <33888540+archmoj@users.noreply.github.com> --- draftlogs/7006_add.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draftlogs/7006_add.md b/draftlogs/7006_add.md index e2fa4ace77e..c3faa0ca5c4 100644 --- a/draftlogs/7006_add.md +++ b/draftlogs/7006_add.md @@ -1 +1 @@ - - Add property axis.ticklabelstandoff axis.ticklabelshift for shifting the tick labels by a number of pixels [[#7006](https://github.com/plotly/plotly.js/pull/7006)] + - Add property `ticklabelstandoff` and `ticklabelshift` to cartesian axes to adjust positioning of tick labels [[#7006](https://github.com/plotly/plotly.js/pull/7006)] From 26315dc797ada527bcf7b9669b23768266fd1c46 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 5 Jul 2024 15:08:25 +0200 Subject: [PATCH 24/24] improve ticklabelstandoff description and note that inside ticks could move outside and outside ticks could move inside --- src/plots/cartesian/layout_attributes.js | 11 +++++++---- test/plot-schema.json | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 02c179d3758..33eb6ee1b33 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -712,10 +712,13 @@ module.exports = { dflt: 0, editType: 'ticks', description: [ - 'Shifts the tick labels by the specified number of pixels orthogonally to the axis.', - 'A positive `ticklabelstandoff` will move the labels farther away from the plot area', - 'if `ticklabelposition` is "outside", and deeper into the plotarea if', - '`ticklabelposition` is "inside".' + 'Sets the standoff distance (in px) between the axis tick labels and their default position.', + 'A positive `ticklabelstandoff` moves the labels farther away from the plot area', + 'if `ticklabelposition` is *outside*, and deeper into the plot area if', + '`ticklabelposition` is *inside*. A negative `ticklabelstandoff` works in the opposite', + 'direction, moving outside ticks towards the plot area and inside ticks towards', + 'the outside. If the negative value is large enough, inside ticks can even end up', + 'outside and vice versa.' ].join(' ') }, mirror: { diff --git a/test/plot-schema.json b/test/plot-schema.json index 63778069b3b..e2beeacfc70 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -15161,7 +15161,7 @@ "valType": "integer" }, "ticklabelstandoff": { - "description": "Shifts the tick labels by the specified number of pixels orthogonally to the axis. A positive `ticklabelstandoff` will move the labels farther away from the plot area if `ticklabelposition` is \"outside\", and deeper into the plotarea if `ticklabelposition` is \"inside\".", + "description": "Sets the standoff distance (in px) between the axis tick labels and their default position. A positive `ticklabelstandoff` moves the labels farther away from the plot area if `ticklabelposition` is *outside*, and deeper into the plot area if `ticklabelposition` is *inside*. A negative `ticklabelstandoff` works in the opposite direction, moving outside ticks towards the plot area and inside ticks towards the outside. If the negative value is large enough, inside ticks can even end up outside and vice versa.", "dflt": 0, "editType": "ticks", "valType": "integer" @@ -16482,7 +16482,7 @@ "valType": "integer" }, "ticklabelstandoff": { - "description": "Shifts the tick labels by the specified number of pixels orthogonally to the axis. A positive `ticklabelstandoff` will move the labels farther away from the plot area if `ticklabelposition` is \"outside\", and deeper into the plotarea if `ticklabelposition` is \"inside\".", + "description": "Sets the standoff distance (in px) between the axis tick labels and their default position. A positive `ticklabelstandoff` moves the labels farther away from the plot area if `ticklabelposition` is *outside*, and deeper into the plot area if `ticklabelposition` is *inside*. A negative `ticklabelstandoff` works in the opposite direction, moving outside ticks towards the plot area and inside ticks towards the outside. If the negative value is large enough, inside ticks can even end up outside and vice versa.", "dflt": 0, "editType": "ticks", "valType": "integer"