Skip to content

Commit

Permalink
Add stroke lines option around ticks to improve readability (#6787)
Browse files Browse the repository at this point in the history
Enable stroking of text on of axis labels
  • Loading branch information
joseraul authored and etimberg committed Jan 12, 2020
1 parent f1677b6 commit b1421c6
Show file tree
Hide file tree
Showing 8 changed files with 30 additions and 1 deletion.
2 changes: 2 additions & 0 deletions docs/axes/styling.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,11 @@ The tick configuration is nested under the scale configuration in the `ticks` ke
| `fontStyle` | `string` | `'normal'` | Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit).
| `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)).
| `reverse` | `boolean` | `false` | Reverses order of tick labels.
| `lineWidth` | `number` | `0` | Stroke width around the text.
| `minor` | `object` | `{}` | Minor ticks configuration. Omitted options are inherited from options above.
| `major` | `object` | `{}` | Major ticks configuration. Omitted options are inherited from options above.
| `padding` | `number` | `0` | Sets the offset of the tick labels from the axis
| `strokeStyle` | `string` | `` | The color of the stroke around the text.
| `z` | `number` | `0` | z-index of tick layer. Useful when ticks are drawn on chart area. Values &lt;= 0 are drawn under datasets, &gt; 0 on top.

## Minor Tick Configuration
Expand Down
18 changes: 17 additions & 1 deletion src/core/core.scale.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ defaults._set('scale', {
minRotation: 0,
maxRotation: 50,
mirror: false,
lineWidth: 0,
strokeStyle: '',
padding: 0,
display: true,
autoSkip: true,
Expand Down Expand Up @@ -140,7 +142,9 @@ function parseFontOptions(options, nestedOpts) {
fontStyle: valueOrDefault(nestedOpts.fontStyle, options.fontStyle),
lineHeight: valueOrDefault(nestedOpts.lineHeight, options.lineHeight)
}), {
color: resolve([nestedOpts.fontColor, options.fontColor, defaults.fontColor])
color: resolve([nestedOpts.fontColor, options.fontColor, defaults.fontColor]),
lineWidth: valueOrDefault(nestedOpts.lineWidth, options.lineWidth),
strokeStyle: valueOrDefault(nestedOpts.strokeStyle, options.strokeStyle)
});
}

Expand Down Expand Up @@ -1272,6 +1276,7 @@ class Scale extends Element {
for (i = 0, ilen = items.length; i < ilen; ++i) {
const item = items[i];
const tickFont = item.font;
const useStroke = tickFont.lineWidth > 0 && tickFont.strokeStyle !== '';

// Make sure we draw text in the correct color and font
ctx.save();
Expand All @@ -1282,15 +1287,26 @@ class Scale extends Element {
ctx.textBaseline = 'middle';
ctx.textAlign = item.textAlign;

if (useStroke) {
ctx.strokeStyle = tickFont.strokeStyle;
ctx.lineWidth = tickFont.lineWidth;
}

const label = item.label;
let y = item.textOffset;
if (isArray(label)) {
for (j = 0, jlen = label.length; j < jlen; ++j) {
// We just make sure the multiline element is a string here..
if (useStroke) {
ctx.strokeText('' + label[j], 0, y);
}
ctx.fillText('' + label[j], 0, y);
y += tickFont.lineHeight;
}
} else {
if (useStroke) {
ctx.strokeText(label, 0, y);
}
ctx.fillText(label, 0, y);
}
ctx.restore();
Expand Down
1 change: 1 addition & 0 deletions test/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ Context.prototype._initMethods = function() {
fill: function() {},
fillRect: function() {},
fillText: function() {},
strokeText: function() {},
lineTo: function() {},
measureText: function(text) {
// return the number of characters * fixed size
Expand Down
2 changes: 2 additions & 0 deletions test/specs/scale.category.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ describe('Category scale tests', function() {
labelOffset: 0,
minor: {},
major: {},
lineWidth: 0,
strokeStyle: '',
}
});

Expand Down
2 changes: 2 additions & 0 deletions test/specs/scale.linear.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ describe('Linear Scale', function() {
labelOffset: 0,
minor: {},
major: {},
lineWidth: 0,
strokeStyle: '',
}
});

Expand Down
2 changes: 2 additions & 0 deletions test/specs/scale.logarithmic.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ describe('Logarithmic Scale tests', function() {
autoSkipPadding: 0,
labelOffset: 0,
minor: {},
lineWidth: 0,
strokeStyle: '',
major: {
enabled: true
},
Expand Down
2 changes: 2 additions & 0 deletions test/specs/scale.radialLinear.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ describe('Test the radial linear scale', function() {
labelOffset: 0,
minor: {},
major: {},
lineWidth: 0,
strokeStyle: '',
},
});

Expand Down
2 changes: 2 additions & 0 deletions test/specs/scale.time.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ describe('Time scale tests', function() {
major: {
enabled: false
},
lineWidth: 0,
strokeStyle: '',
},
time: {
parser: false,
Expand Down

0 comments on commit b1421c6

Please sign in to comment.