Skip to content

Commit 17655c7

Browse files
eletimberg
authored andcommitted
Add label alignment option to axis label title (#6521)
Add label alignment option to axis label title
1 parent 08d1338 commit 17655c7

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

docs/axes/labelling.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ The scale label configuration is nested under the scale configuration in the `sc
99
| Name | Type | Default | Description
1010
| ---- | ---- | ------- | -----------
1111
| `display` | `boolean` | `false` | If true, display the axis title.
12+
| `align` | `string` | `'center'` | Alignment of the axis title. Possible options are `'start'`, `'center'` and `'end'`
1213
| `labelString` | `string` | `''` | The text for the title. (i.e. "# of People" or "Response Choices").
1314
| `lineHeight` | <code>number&#124;string</code> | `1.2` | Height of an individual line of text (see [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/line-height)).
1415
| `fontColor` | `Color` | `'#666'` | Font color for scale title.

src/core/core.scale.js

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,28 +1350,54 @@ var Scale = Element.extend({
13501350
var scaleLabelFont = helpers.options._parseFont(scaleLabel);
13511351
var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);
13521352
var halfLineHeight = scaleLabelFont.lineHeight / 2;
1353+
var scaleLabelAlign = scaleLabel.align;
13531354
var position = options.position;
13541355
var rotation = 0;
1355-
var scaleLabelX, scaleLabelY;
1356+
var isReverse = me.options.ticks.reverse;
1357+
var scaleLabelX, scaleLabelY, textAlign;
13561358

13571359
if (me.isHorizontal()) {
1358-
scaleLabelX = me.left + me.width / 2; // midpoint of the width
1359-
scaleLabelY = position === 'bottom'
1360-
? me.bottom - halfLineHeight - scaleLabelPadding.bottom
1361-
: me.top + halfLineHeight + scaleLabelPadding.top;
1360+
switch (scaleLabelAlign) {
1361+
case 'start':
1362+
scaleLabelX = me.left + (isReverse ? me.width : 0);
1363+
textAlign = isReverse ? 'right' : 'left';
1364+
break;
1365+
case 'end':
1366+
scaleLabelX = me.left + (isReverse ? 0 : me.width);
1367+
textAlign = isReverse ? 'left' : 'right';
1368+
break;
1369+
default:
1370+
scaleLabelX = me.left + me.width / 2;
1371+
textAlign = 'center';
1372+
}
1373+
scaleLabelY = position === 'top'
1374+
? me.top + halfLineHeight + scaleLabelPadding.top
1375+
: me.bottom - halfLineHeight - scaleLabelPadding.bottom;
13621376
} else {
13631377
var isLeft = position === 'left';
13641378
scaleLabelX = isLeft
13651379
? me.left + halfLineHeight + scaleLabelPadding.top
13661380
: me.right - halfLineHeight - scaleLabelPadding.top;
1367-
scaleLabelY = me.top + me.height / 2;
1381+
switch (scaleLabelAlign) {
1382+
case 'start':
1383+
scaleLabelY = me.top + (isReverse ? 0 : me.height);
1384+
textAlign = isReverse === isLeft ? 'right' : 'left';
1385+
break;
1386+
case 'end':
1387+
scaleLabelY = me.top + (isReverse ? me.height : 0);
1388+
textAlign = isReverse === isLeft ? 'left' : 'right';
1389+
break;
1390+
default:
1391+
scaleLabelY = me.top + me.height / 2;
1392+
textAlign = 'center';
1393+
}
13681394
rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;
13691395
}
13701396

13711397
ctx.save();
13721398
ctx.translate(scaleLabelX, scaleLabelY);
13731399
ctx.rotate(rotation);
1374-
ctx.textAlign = 'center';
1400+
ctx.textAlign = textAlign;
13751401
ctx.textBaseline = 'middle';
13761402
ctx.fillStyle = scaleLabelFontColor; // render in correct colour
13771403
ctx.font = scaleLabelFont.string;

0 commit comments

Comments
 (0)