From 28de154379d1d8ad817cf132b6f870c14de48f2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Wed, 9 Oct 2019 17:21:35 -0400 Subject: [PATCH 1/5] lint in titles/index.js - use `OPPOSITE_SIDE` constants - use `shiftSign` result in `maxshift` computation --- src/components/titles/index.js | 38 ++++++++++++++++------------------ 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/components/titles/index.js b/src/components/titles/index.js index 96c5a5fc550..52fbc346621 100644 --- a/src/components/titles/index.js +++ b/src/components/titles/index.js @@ -20,10 +20,7 @@ var Color = require('../color'); var svgTextUtils = require('../../lib/svg_text_utils'); var interactConstants = require('../../constants/interactions'); -module.exports = { - draw: draw -}; - +var OPPOSITE_SIDE = require('../../constants/alignment').OPPOSITE_SIDE; var numStripRE = / [XY][0-9]* /; /** @@ -167,16 +164,10 @@ function draw(gd, titleClass, options) { // move toward avoid.side (= left, right, top, bottom) if needed // can include pad (pixels, default 2) - var shift = 0; - var backside = { - left: 'right', - right: 'left', - top: 'bottom', - bottom: 'top' - }[avoid.side]; - var shiftSign = (['left', 'top'].indexOf(avoid.side) !== -1) ? - -1 : 1; + var backside = OPPOSITE_SIDE[avoid.side]; + var shiftSign = (avoid.side === 'left' || avoid.side === 'top') ? -1 : 1; var pad = isNumeric(avoid.pad) ? avoid.pad : 2; + var titlebb = Drawing.bBox(titleGroup.node()); var paperbb = { left: 0, @@ -184,12 +175,15 @@ function draw(gd, titleClass, options) { right: fullLayout.width, bottom: fullLayout.height }; - var maxshift = avoid.maxShift || ( - (paperbb[avoid.side] - titlebb[avoid.side]) * - ((avoid.side === 'left' || avoid.side === 'top') ? -1 : 1)); + + var maxshift = avoid.maxShift || + shiftSign * (paperbb[avoid.side] - titlebb[avoid.side]); + var shift = 0; + // Prevent the title going off the paper - if(maxshift < 0) shift = maxshift; - else { + if(maxshift < 0) { + shift = maxshift; + } else { // so we don't have to offset each avoided element, // give the title the opposite offset var offsetLeft = avoid.offsetLeft || 0; @@ -211,6 +205,7 @@ function draw(gd, titleClass, options) { }); shift = Math.min(maxshift, shift); } + if(shift > 0 || maxshift < 0) { var shiftTemplate = { left: [-shift, 0], @@ -218,8 +213,7 @@ function draw(gd, titleClass, options) { top: [0, -shift], bottom: [0, shift] }[avoid.side]; - titleGroup.attr('transform', - 'translate(' + shiftTemplate + ')'); + titleGroup.attr('transform', 'translate(' + shiftTemplate + ')'); } } } @@ -265,3 +259,7 @@ function draw(gd, titleClass, options) { return group; } + +module.exports = { + draw: draw +}; From 48cb1b29da8e35d5b419542e524195eeebc5074a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Wed, 9 Oct 2019 17:23:59 -0400 Subject: [PATCH 2/5] split axesAttrs inheritence for `title.text` and `title.font` ... so that we can add other `title.*` to cartesian axes w/o breaking other subplots --- src/plots/gl3d/layout/axis_attributes.js | 5 ++++- src/plots/polar/layout_attributes.js | 16 +++++++++++----- src/plots/ternary/layout_attributes.js | 5 ++++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/plots/gl3d/layout/axis_attributes.js b/src/plots/gl3d/layout/axis_attributes.js index 6699e73575a..28babfcf585 100644 --- a/src/plots/gl3d/layout/axis_attributes.js +++ b/src/plots/gl3d/layout/axis_attributes.js @@ -71,7 +71,10 @@ module.exports = overrideAll({ color: axesAttrs.color, categoryorder: axesAttrs.categoryorder, categoryarray: axesAttrs.categoryarray, - title: axesAttrs.title, + title: { + text: axesAttrs.title.text, + font: axesAttrs.title.font + }, type: extendFlat({}, axesAttrs.type, { values: ['-', 'linear', 'log', 'date', 'category'] }), diff --git a/src/plots/polar/layout_attributes.js b/src/plots/polar/layout_attributes.js index f6905453dd9..c2230b58031 100644 --- a/src/plots/polar/layout_attributes.js +++ b/src/plots/polar/layout_attributes.js @@ -114,8 +114,17 @@ var radialAxisAttrs = { }, - title: overrideAll(axesAttrs.title, 'plot', 'from-root'), - // might need a 'titleside' and even 'titledirection' down the road + title: { + // radial title is not gui-editable at the moment, + // so it needs dflt: '', similar to carpet axes. + text: extendFlat({}, axesAttrs.title.text, {editType: 'plot', dflt: ''}), + font: extendFlat({}, axesAttrs.title.font, {editType: 'plot'}), + + // TODO + // - might need a 'titleside' and even 'titledirection' down the road + + editType: 'plot' + }, hoverformat: axesAttrs.hoverformat, @@ -138,9 +147,6 @@ var radialAxisAttrs = { } }; -// radial title is not gui-editable, so it needs dflt: '', similar to carpet axes. -radialAxisAttrs.title.text.dflt = ''; - extendFlat( radialAxisAttrs, diff --git a/src/plots/ternary/layout_attributes.js b/src/plots/ternary/layout_attributes.js index effa824be8d..2277c4d6d0e 100644 --- a/src/plots/ternary/layout_attributes.js +++ b/src/plots/ternary/layout_attributes.js @@ -16,7 +16,10 @@ var overrideAll = require('../../plot_api/edit_types').overrideAll; var extendFlat = require('../../lib/extend').extendFlat; var ternaryAxesAttrs = { - title: axesAttrs.title, + title: { + text: axesAttrs.title.text, + font: axesAttrs.title.font + }, color: axesAttrs.color, // ticks tickmode: axesAttrs.tickmode, From 304e4d3fe403c8aaf041f3dbec5f5d00d1541df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Wed, 9 Oct 2019 17:26:35 -0400 Subject: [PATCH 3/5] implement `title.standoff` for cartesian axes - must now compute `ax._depth` when `standoff` is set to get compute distance - add `approxTitleDepth` helper with backward-compatible "looser" computation when `standoff` isn't set - add two mock: one with axis `automargin:true` and one w/o --- src/plots/cartesian/axes.js | 95 +++++++++++++----- src/plots/cartesian/layout_attributes.js | 15 +++ src/plots/cartesian/layout_defaults.js | 2 + src/plots/polar/layout_attributes.js | 1 + src/plots/ternary/layout_attributes.js | 1 + src/traces/carpet/axis_attributes.js | 1 + .../baselines/automargin-title-standoff.png | Bin 0 -> 37351 bytes test/image/baselines/axis-title-standoff.png | Bin 0 -> 35656 bytes .../mocks/automargin-title-standoff.json | 65 ++++++++++++ test/image/mocks/axis-title-standoff.json | 59 +++++++++++ 10 files changed, 216 insertions(+), 23 deletions(-) create mode 100644 test/image/baselines/automargin-title-standoff.png create mode 100644 test/image/baselines/axis-title-standoff.png create mode 100644 test/image/mocks/automargin-title-standoff.json create mode 100644 test/image/mocks/axis-title-standoff.json diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 2f3c4c7f59c..52f817b0e5e 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -33,6 +33,7 @@ var MINUS_SIGN = constants.MINUS_SIGN; var BADNUM = constants.BADNUM; var MID_SHIFT = require('../../constants/alignment').MID_SHIFT; +var CAP_SHIFT = require('../../constants/alignment').CAP_SHIFT; var LINE_SPACING = require('../../constants/alignment').LINE_SPACING; var OPPOSITE_SIDE = require('../../constants/alignment').OPPOSITE_SIDE; @@ -1859,6 +1860,11 @@ axes.drawOne = function(gd, ax, opts) { transFn: transFn }); }); + } else if(ax.title.hasOwnProperty('standoff')) { + seq.push(function() { + var sgn = {l: -1, t: -1, r: 1, b: 1}[ax.side.charAt(0)]; + ax._depth = sgn * (getLabelLevelBbox()[ax.side] - mainLinePosition); + }); } var hasRangeSlider = Registry.getComponentMethod('rangeslider', 'isVisible')(ax); @@ -1936,10 +1942,7 @@ axes.drawOne = function(gd, ax, opts) { ax._anchorAxis.domain[domainIndices[0]]; if(ax.title.text !== fullLayout._dfltTitle[axLetter]) { - var extraLines = (ax.title.text.match(svgTextUtils.BR_TAG_ALL) || []).length; - push[s] += extraLines ? - ax.title.font.size * (extraLines + 1) * LINE_SPACING : - ax.title.font.size; + push[s] += approxTitleDepth(ax) + (ax.title.standoff || 0); } if(ax.mirror && ax.anchor !== 'free') { @@ -2699,6 +2702,46 @@ axes.getPxPosition = function(gd, ax) { } }; +/** + * Approximate axis title depth (w/o computing its bounding box) + * + * @param {object} ax (full) axis object + * - {string} title.text + * - {number} title.font.size + * - {number} title.standoff + * @return {number} (in px) + */ +function approxTitleDepth(ax) { + var fontSize = ax.title.font.size; + var extraLines = (ax.title.text.match(svgTextUtils.BR_TAG_ALL) || []).length; + if(ax.title.hasOwnProperty('standoff')) { + return extraLines ? + fontSize * (CAP_SHIFT + (extraLines * LINE_SPACING)) : + fontSize * CAP_SHIFT; + } else { + return extraLines ? + fontSize * (extraLines + 1) * LINE_SPACING : + fontSize; + } +} + +/** + * Draw axis title, compute default standoff if necessary + * + * @param {DOM element} gd + * @param {object} ax (full) axis object + * - {string} _id + * - {string} _name + * - {string} side + * - {number} title.font.size + * - {object} _selections + * + * - {number} _depth + * - {number} title.standoff + * OR + * - {number} linewidth + * - {boolean} showticklabels + */ function drawTitle(gd, ax) { var fullLayout = gd._fullLayout; var axId = ax._id; @@ -2706,11 +2749,26 @@ function drawTitle(gd, ax) { var fontSize = ax.title.font.size; var titleStandoff; - if(ax.type === 'multicategory') { - titleStandoff = ax._depth; + + if(ax.title.hasOwnProperty('standoff')) { + titleStandoff = ax._depth + ax.title.standoff + approxTitleDepth(ax); } else { - var offsetBase = 1.5; - titleStandoff = 10 + fontSize * offsetBase + (ax.linewidth ? ax.linewidth - 1 : 0); + if(ax.type === 'multicategory') { + titleStandoff = ax._depth; + } else { + var offsetBase = 1.5; + titleStandoff = 10 + fontSize * offsetBase + (ax.linewidth ? ax.linewidth - 1 : 0); + } + + if(axLetter === 'x') { + titleStandoff += ax.side === 'top' ? + fontSize * (ax.showticklabels ? 1 : 0) : + fontSize * (ax.showticklabels ? 1.5 : 0.5); + } else { + titleStandoff += ax.side === 'right' ? + fontSize * (ax.showticklabels ? 1 : 0.5) : + fontSize * (ax.showticklabels ? 0.5 : 0); + } } var pos = axes.getPxPosition(gd, ax); @@ -2718,23 +2776,10 @@ function drawTitle(gd, ax) { if(axLetter === 'x') { x = ax._offset + ax._length / 2; - - if(ax.side === 'top') { - y = -titleStandoff - fontSize * (ax.showticklabels ? 1 : 0); - } else { - y = titleStandoff + fontSize * (ax.showticklabels ? 1.5 : 0.5); - } - y += pos; + y = (ax.side === 'top') ? pos - titleStandoff : pos + titleStandoff; } else { y = ax._offset + ax._length / 2; - - if(ax.side === 'right') { - x = titleStandoff + fontSize * (ax.showticklabels ? 1 : 0.5); - } else { - x = -titleStandoff - fontSize * (ax.showticklabels ? 0.5 : 0); - } - x += pos; - + x = (ax.side === 'right') ? pos + titleStandoff : pos - titleStandoff; transform = {rotate: '-90', offset: 0}; } @@ -2753,6 +2798,10 @@ function drawTitle(gd, ax) { avoid.offsetLeft = translation.x; avoid.offsetTop = translation.y; } + + if(ax.title.hasOwnProperty('standoff')) { + avoid.pad = 0; + } } return Titles.draw(gd, axId + 'title', { diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 41106d1686e..713d79bf815 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -62,6 +62,21 @@ module.exports = { 'by the now deprecated `titlefont` attribute.' ].join(' ') }), + standoff: { + valType: 'number', + role: 'info', + min: 0, + editType: 'ticks', + description: [ + 'Sets the standoff distance (in px) between the axis labels and the title text', + 'The default value is a function of the axis tick labels, the title `font.size`', + 'and the axis `linewidth`.', + 'Note that the axis title position is always constrained within the margins,', + 'so the actual standoff distance is always less than the set or default value.', + 'By setting `standoff` and turning on `automargin`, plotly.js will push the', + 'margins to fit the axis title at given standoff distance.' + ].join(' ') + }, editType: 'ticks' }, type: { diff --git a/src/plots/cartesian/layout_defaults.js b/src/plots/cartesian/layout_defaults.js index 3865a3751fb..58c86d5fc4b 100644 --- a/src/plots/cartesian/layout_defaults.js +++ b/src/plots/cartesian/layout_defaults.js @@ -235,6 +235,8 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { grid: layoutOut.grid }); + coerce('title.standoff'); + axLayoutOut._input = axLayoutIn; } diff --git a/src/plots/polar/layout_attributes.js b/src/plots/polar/layout_attributes.js index c2230b58031..82c5d9cf699 100644 --- a/src/plots/polar/layout_attributes.js +++ b/src/plots/polar/layout_attributes.js @@ -122,6 +122,7 @@ var radialAxisAttrs = { // TODO // - might need a 'titleside' and even 'titledirection' down the road + // - what about standoff ?? editType: 'plot' }, diff --git a/src/plots/ternary/layout_attributes.js b/src/plots/ternary/layout_attributes.js index 2277c4d6d0e..b684b477a09 100644 --- a/src/plots/ternary/layout_attributes.js +++ b/src/plots/ternary/layout_attributes.js @@ -19,6 +19,7 @@ var ternaryAxesAttrs = { title: { text: axesAttrs.title.text, font: axesAttrs.title.font + // TODO does standoff here make sense? }, color: axesAttrs.color, // ticks diff --git a/src/traces/carpet/axis_attributes.js b/src/traces/carpet/axis_attributes.js index 9d3fb672039..a6671494428 100644 --- a/src/traces/carpet/axis_attributes.js +++ b/src/traces/carpet/axis_attributes.js @@ -57,6 +57,7 @@ module.exports = { 'by the now deprecated `titlefont` attribute.' ].join(' ') }), + // TODO how is this different than `title.standoff` offset: { valType: 'number', role: 'info', diff --git a/test/image/baselines/automargin-title-standoff.png b/test/image/baselines/automargin-title-standoff.png new file mode 100644 index 0000000000000000000000000000000000000000..6bcc837fa7106ede4e1857cdabec57960a51749e GIT binary patch literal 37351 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 IhPb%@1t+4Q1ONa4 literal 0 HcmV?d00001 diff --git a/test/image/mocks/automargin-title-standoff.json b/test/image/mocks/automargin-title-standoff.json new file mode 100644 index 00000000000..571a054e8a3 --- /dev/null +++ b/test/image/mocks/automargin-title-standoff.json @@ -0,0 +1,65 @@ +{ + "data": [ + {"x": ["looooooooooong label"], "y": [1]}, + {"y": ["looooooooooong label"], "x": [1], "xaxis": "x2", "yaxis": "y2"} + ], + "layout": { + "grid": {"rows": 1, "columns": 2, "pattern": "independent"}, + "width": 600, + "height": 500, + "margin": {"l": 0, "r": 0, "t": 0, "b": 0}, + "showlegend": false, + "title": { + "text": "With axis automargin:true
with margin:0", + "x": 0, + "xanchor": "left", + "xref": "paper" + }, + "xaxis": { + "title": { + "text": "X Axis (standoff: 60)", + "standoff": 60, + "font": {"size": 25} + }, + "automargin": true, + "showline": true, + "mirror": true, + "ticks": "outside", + "tickangle": 20 + }, + "yaxis": { + "title": { + "text": "Y
Axis (standoff: 100)", + "standoff": 100, + "font": {"size": 20} + }, + "automargin": true, + "showline": true, + "mirror": true + }, + "xaxis2": { + "anchor": "y2", + "side": "top", + "title": { + "text": "X
Axis 2
(standoff: 80)", + "standoff": 80 + }, + "automargin": true, + "showline": true, + "mirror": true + }, + "yaxis2": { + "anchor": "x2", + "side": "right", + "title": { + "text": "Y Axis 2 (standoff: 30)", + "standoff": 30 + }, + "automargin": true, + "showline": true, + "mirror": true, + "ticks": "outside", + "tickangle": 80 + } + } +} diff --git a/test/image/mocks/axis-title-standoff.json b/test/image/mocks/axis-title-standoff.json new file mode 100644 index 00000000000..30789e6dd3e --- /dev/null +++ b/test/image/mocks/axis-title-standoff.json @@ -0,0 +1,59 @@ +{ + "data": [ + {"x": ["looooooooooong label"], "y": [1]}, + {"y": ["looooooooooong label"], "x": [1], "xaxis": "x2", "yaxis": "y2"} + ], + "layout": { + "grid": {"rows": 1, "columns": 2, "pattern": "independent"}, + "width": 600, + "height": 500, + "showlegend": false, + "title": { + "text": "No axis automargin:true
with default margins", + "x": 0, + "xanchor": "left", + "xref": "paper" + }, + "xaxis": { + "title": { + "text": "X Axis (standoff:10)", + "standoff": 10, + "font": {"size": 25} + }, + "showline": true, + "mirror": true, + "ticks": "outside" + }, + "yaxis": { + "title": { + "text": "Y
Axis (standoff:8)", + "standoff": 0, + "font": {"size": 8} + }, + "showline": true, + "mirror": true + }, + "xaxis2": { + "anchor": "y2", + "side": "top", + "title": { + "text": "X
Axis 2
(standoff:0)", + "standoff": 0 + }, + "showline": true, + "mirror": true + }, + "yaxis2": { + "anchor": "x2", + "side": "right", + "title": { + "text": "Y Axis 2 (standoff:0)", + "standoff": 0 + }, + "showline": true, + "mirror": true, + "ticks": "outside", + "tickangle": 80 + } + } +} From bdf312ba4f12ce4ea7015f49abc09b2a88a8b5e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Wed, 16 Oct 2019 14:50:38 -0400 Subject: [PATCH 4/5] include "sign of arrow starting at axis pointing towards margin" ... into `Axes.getTickSigns` output --- src/plots/cartesian/axes.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 52f817b0e5e..1b30522c34b 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -1832,7 +1832,6 @@ axes.drawOne = function(gd, ax, opts) { if(ax.type === 'multicategory') { var pad = {x: 2, y: 10}[axLetter]; - var sgn = {l: -1, t: -1, r: 1, b: 1}[ax.side.charAt(0)]; seq.push(function() { var bboxKey = {x: 'height', y: 'width'}[axLetter]; @@ -1846,24 +1845,23 @@ axes.drawOne = function(gd, ax, opts) { repositionOnUpdate: true, secondary: true, transFn: transFn, - labelFns: axes.makeLabelFns(ax, mainLinePosition + standoff * sgn) + labelFns: axes.makeLabelFns(ax, mainLinePosition + standoff * tickSigns[4]) }); }); seq.push(function() { - ax._depth = sgn * (getLabelLevelBbox('tick2')[ax.side] - mainLinePosition); + ax._depth = tickSigns[4] * (getLabelLevelBbox('tick2')[ax.side] - mainLinePosition); return drawDividers(gd, ax, { vals: dividerVals, layer: mainAxLayer, - path: axes.makeTickPath(ax, mainLinePosition, sgn, ax._depth), + path: axes.makeTickPath(ax, mainLinePosition, tickSigns[4], ax._depth), transFn: transFn }); }); } else if(ax.title.hasOwnProperty('standoff')) { seq.push(function() { - var sgn = {l: -1, t: -1, r: 1, b: 1}[ax.side.charAt(0)]; - ax._depth = sgn * (getLabelLevelBbox()[ax.side] - mainLinePosition); + ax._depth = tickSigns[4] * (getLabelLevelBbox()[ax.side] - mainLinePosition); }); } @@ -2100,6 +2098,7 @@ function calcLabelLevelBbox(ax, cls) { * - [1]: sign for bottom/left ticks (i.e. positive SVG direction) * - [2]: sign for ticks corresponding to 'ax.side' * - [3]: sign for ticks mirroring 'ax.side' + * - [4]: sign of arrow starting at axis pointing towards margin */ axes.getTickSigns = function(ax) { var axLetter = ax._id.charAt(0); @@ -2110,6 +2109,10 @@ axes.getTickSigns = function(ax) { if((ax.ticks !== 'inside') === (axLetter === 'x')) { out = out.map(function(v) { return -v; }); } + // independent of `ticks`; do not flip this one + if(ax.side) { + out.push({l: -1, t: -1, r: 1, b: 1}[ax.side.charAt(0)]); + } return out; }; From be3de9293361e901a6ec66a76cebccf53b736989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Wed, 23 Oct 2019 17:05:01 -0400 Subject: [PATCH 5/5] rewrite constants/alignment require block --- src/plots/cartesian/axes.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 1b30522c34b..db386dd6bf8 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -32,10 +32,11 @@ var ONESEC = constants.ONESEC; var MINUS_SIGN = constants.MINUS_SIGN; var BADNUM = constants.BADNUM; -var MID_SHIFT = require('../../constants/alignment').MID_SHIFT; -var CAP_SHIFT = require('../../constants/alignment').CAP_SHIFT; -var LINE_SPACING = require('../../constants/alignment').LINE_SPACING; -var OPPOSITE_SIDE = require('../../constants/alignment').OPPOSITE_SIDE; +var alignmentConstants = require('../../constants/alignment'); +var MID_SHIFT = alignmentConstants.MID_SHIFT; +var CAP_SHIFT = alignmentConstants.CAP_SHIFT; +var LINE_SPACING = alignmentConstants.LINE_SPACING; +var OPPOSITE_SIDE = alignmentConstants.OPPOSITE_SIDE; var axes = module.exports = {};