From dc4eac63233a7ba15c20fe03f8f3ac34584d134a Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 10 Oct 2020 11:38:55 -0400 Subject: [PATCH] Cartesian axis text alignment (#7846) * Generate textBaseline per tick label * Enable configuration of tick alignment * Add image based tests of text alignment options --- docs/docs/axes/styling.md | 1 + samples/samples.js | 3 + samples/scales/label-text-alignment.html | 163 ++++++++++++++++++ src/core/core.scale.js | 64 ++++++- .../fixtures/core.scale/label-align-center.js | 34 ++++ .../core.scale/label-align-center.png | Bin 0 -> 15003 bytes test/fixtures/core.scale/label-align-end.js | 34 ++++ test/fixtures/core.scale/label-align-end.png | Bin 0 -> 15000 bytes test/fixtures/core.scale/label-align-start.js | 34 ++++ .../fixtures/core.scale/label-align-start.png | Bin 0 -> 15554 bytes types/scales/index.d.ts | 5 + 11 files changed, 330 insertions(+), 8 deletions(-) create mode 100644 samples/scales/label-text-alignment.html create mode 100644 test/fixtures/core.scale/label-align-center.js create mode 100644 test/fixtures/core.scale/label-align-center.png create mode 100644 test/fixtures/core.scale/label-align-end.js create mode 100644 test/fixtures/core.scale/label-align-end.png create mode 100644 test/fixtures/core.scale/label-align-start.js create mode 100644 test/fixtures/core.scale/label-align-start.png diff --git a/docs/docs/axes/styling.md b/docs/docs/axes/styling.md index a9c8f1a0b..eed36ab4d 100644 --- a/docs/docs/axes/styling.md +++ b/docs/docs/axes/styling.md @@ -42,6 +42,7 @@ The tick configuration is nested under the scale configuration in the `ticks` ke | Name | Type | Scriptable | Default | Description | ---- | ---- | :-------------------------------: | ------- | ----------- +| `alignment` | `string` | | `'center'` | The tick alignment along the axis. Can be `'start'`, `'center'`, or `'end'`. | `callback` | `function` | | | Returns the string representation of the tick value as it should be displayed on the chart. See [callback](../axes/labelling.md#creating-custom-tick-formats). | `display` | `boolean` | | `true` | If true, show tick labels. | `font` | `Font` | Yes | `defaults.font` | See [Fonts](../general/fonts.md) diff --git a/samples/samples.js b/samples/samples.js index 67d1f4486..57cac6b3a 100644 --- a/samples/samples.js +++ b/samples/samples.js @@ -145,6 +145,9 @@ }, { title: 'Filtering Labels', path: 'scales/filtering-labels.html' + }, { + title: 'Label Text Alignment', + path: 'scales/label-text-alignment.html' }, { title: 'Non numeric Y Axis', path: 'scales/non-numeric-y.html' diff --git a/samples/scales/label-text-alignment.html b/samples/scales/label-text-alignment.html new file mode 100644 index 000000000..4e542692f --- /dev/null +++ b/samples/scales/label-text-alignment.html @@ -0,0 +1,163 @@ + + + + + Label Text Alignment + + + + + + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + + diff --git a/src/core/core.scale.js b/src/core/core.scale.js index 2a39bd937..69a69be76 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -61,7 +61,8 @@ defaults.set('scale', { // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. callback: Ticks.formatters.values, minor: {}, - major: {} + major: {}, + alignment: 'center', } }); @@ -761,6 +762,12 @@ export default class Scale extends Element { paddingRight = labelsBelowTicks ? sinRotation * (lastLabelSize.height - lastLabelSize.offset) : cosRotation * lastLabelSize.width + sinRotation * lastLabelSize.offset; + } else if (tickOpts.alignment === 'start') { + paddingLeft = 0; + paddingRight = lastLabelSize.width; + } else if (tickOpts.alignment === 'end') { + paddingLeft = firstLabelSize.width; + paddingRight = 0; } else { paddingLeft = firstLabelSize.width / 2; paddingRight = lastLabelSize.width / 2; @@ -780,8 +787,19 @@ export default class Scale extends Element { minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth); - me.paddingTop = lastLabelSize.height / 2; - me.paddingBottom = firstLabelSize.height / 2; + let paddingTop = lastLabelSize.height / 2; + let paddingBottom = firstLabelSize.height / 2; + + if (tickOpts.alignment === 'start') { + paddingTop = 0; + paddingBottom = firstLabelSize.height; + } else if (tickOpts.alignment === 'end') { + paddingTop = lastLabelSize.height; + paddingBottom = 0; + } + + me.paddingTop = paddingTop; + me.paddingBottom = paddingBottom; } } @@ -1240,13 +1258,14 @@ export default class Scale extends Element { const rotation = -toRadians(me.labelRotation); const items = []; let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset; + let textBaseline = 'middle'; if (position === 'top') { y = me.bottom - tl - tickPadding; - textAlign = !rotation ? 'center' : 'left'; + textAlign = me._getXAxisLabelAlignment(); } else if (position === 'bottom') { y = me.top + tl + tickPadding; - textAlign = !rotation ? 'center' : 'right'; + textAlign = me._getXAxisLabelAlignment(); } else if (position === 'left') { x = me.right - (isMirrored ? 0 : tl) - tickPadding; textAlign = isMirrored ? 'left' : 'right'; @@ -1261,7 +1280,7 @@ export default class Scale extends Element { const value = position[positionAxisID]; y = me.chart.scales[positionAxisID].getPixelForValue(value) + tl + tickPadding; } - textAlign = !rotation ? 'center' : 'right'; + textAlign = me._getXAxisLabelAlignment(); } else if (axis === 'y') { if (position === 'center') { x = ((chartArea.left + chartArea.right) / 2) - tl - tickPadding; @@ -1273,6 +1292,14 @@ export default class Scale extends Element { textAlign = 'right'; } + if (axis === 'y') { + if (optionTicks.alignment === 'start') { + textBaseline = 'top'; + } else if (optionTicks.alignment === 'end') { + textBaseline = 'bottom'; + } + } + for (i = 0, ilen = ticks.length; i < ilen; ++i) { tick = ticks[i]; label = tick.label; @@ -1303,13 +1330,34 @@ export default class Scale extends Element { label, font, textOffset, - textAlign + textAlign, + textBaseline, }); } return items; } + _getXAxisLabelAlignment() { + const me = this; + const {position, ticks} = me.options; + const rotation = -toRadians(me.labelRotation); + + if (rotation) { + return position === 'top' ? 'left' : 'right'; + } + + let align = 'center'; + + if (ticks.alignment === 'start') { + align = 'left'; + } else if (ticks.alignment === 'end') { + align = 'right'; + } + + return align; + } + /** * @protected */ @@ -1409,8 +1457,8 @@ export default class Scale extends Element { ctx.rotate(item.rotation); ctx.font = tickFont.string; ctx.fillStyle = tickFont.color; - ctx.textBaseline = 'middle'; ctx.textAlign = item.textAlign; + ctx.textBaseline = item.textBaseline; if (useStroke) { ctx.strokeStyle = tickFont.strokeStyle; diff --git a/test/fixtures/core.scale/label-align-center.js b/test/fixtures/core.scale/label-align-center.js new file mode 100644 index 000000000..1e9907bf9 --- /dev/null +++ b/test/fixtures/core.scale/label-align-center.js @@ -0,0 +1,34 @@ +module.exports = { + config: { + type: 'line', + data: { + datasets: [{ + data: [1, 2, 3], + }], + labels: ['Label1', 'Label2', 'Label3'] + }, + options: { + legend: false, + title: false, + scales: { + x: { + ticks: { + alignment: 'center', + }, + }, + y: { + ticks: { + alignment: 'center', + } + } + } + } + }, + options: { + spriteText: true, + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/core.scale/label-align-center.png b/test/fixtures/core.scale/label-align-center.png new file mode 100644 index 0000000000000000000000000000000000000000..576f0254d0a2090582529f7cb63651e5c5b8a578 GIT binary patch literal 15003 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 z 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 J!2!oB{|i@}i_8E3 literal 0 HcmV?d00001 diff --git a/test/fixtures/core.scale/label-align-end.js b/test/fixtures/core.scale/label-align-end.js new file mode 100644 index 000000000..19a0e8ad3 --- /dev/null +++ b/test/fixtures/core.scale/label-align-end.js @@ -0,0 +1,34 @@ +module.exports = { + config: { + type: 'line', + data: { + datasets: [{ + data: [1, 2, 3], + }], + labels: ['Label1', 'Label2', 'Label3'] + }, + options: { + legend: false, + title: false, + scales: { + x: { + ticks: { + alignment: 'end', + }, + }, + y: { + ticks: { + alignment: 'end', + } + } + } + } + }, + options: { + spriteText: true, + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/core.scale/label-align-end.png b/test/fixtures/core.scale/label-align-end.png new file mode 100644 index 0000000000000000000000000000000000000000..13d72d25d35fd0ff3c07c83f6194e609c121b72e GIT binary patch literal 15000 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 literal 0 HcmV?d00001 diff --git a/types/scales/index.d.ts b/types/scales/index.d.ts index 682116743..fe19273c6 100644 --- a/types/scales/index.d.ts +++ b/types/scales/index.d.ts @@ -128,6 +128,11 @@ export interface ICartesianScaleOptions extends ICoreScaleOptions { * @default ticks.length */ sampleSize: number; + /** + * The label alignment + * @default 'center' + */ + alignment: 'start' | 'center' | 'end'; /** * If true, automatically calculates how many labels can be shown and hides labels accordingly. Labels will be rotated up to maxRotation before skipping any. Turn autoSkip off to show all labels no matter what. * @default true