Skip to content

Commit 9fbac88

Browse files
etimbergsimonbrunel
authored andcommitted
Add ticks.precision option to linear scale. (#4841)
If defined and `stepSize` is not specified, the step size will be rounded to this many decimal places.
1 parent a191921 commit 9fbac88

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

docs/axes/cartesian/linear.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ The following options are provided by the linear scale. They are all located in
1212
| `min` | `Number` | | User defined minimum number for the scale, overrides minimum value from data. [more...](#axis-range-settings)
1313
| `max` | `Number` | | User defined maximum number for the scale, overrides maximum value from data. [more...](#axis-range-settings)
1414
| `maxTicksLimit` | `Number` | `11` | Maximum number of ticks and gridlines to show.
15+
| `precision` | `Number` | | if defined and `stepSize` is not specified, the step size will be rounded to this many decimal places.
1516
| `stepSize` | `Number` | | User defined fixed step size for the scale. [more...](#step-size)
1617
| `suggestedMax` | `Number` | | Adjustment used when calculating the maximum data value. [more...](#axis-range-settings)
1718
| `suggestedMin` | `Number` | | Adjustment used when calculating the minimum data value. [more...](#axis-range-settings)

docs/axes/radial/linear.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ The following options are provided by the linear scale. They are all located in
2727
| `min` | `Number` | | User defined minimum number for the scale, overrides minimum value from data. [more...](#axis-range-settings)
2828
| `max` | `Number` | | User defined maximum number for the scale, overrides maximum value from data. [more...](#axis-range-settings)
2929
| `maxTicksLimit` | `Number` | `11` | Maximum number of ticks and gridlines to show.
30+
| `precision` | `Number` | | if defined and `stepSize` is not specified, the step size will be rounded to this many decimal places.
3031
| `stepSize` | `Number` | | User defined fixed step size for the scale. [more...](#step-size)
3132
| `suggestedMax` | `Number` | | Adjustment used when calculating the maximum data value. [more...](#axis-range-settings)
3233
| `suggestedMin` | `Number` | | Adjustment used when calculating the minimum data value. [more...](#axis-range-settings)

src/scales/scale.linearbase.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,22 @@ function generateTicks(generationOptions, dataRange) {
1414
// "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks
1515
// for details.
1616

17+
var factor;
18+
var precision;
1719
var spacing;
20+
1821
if (generationOptions.stepSize && generationOptions.stepSize > 0) {
1922
spacing = generationOptions.stepSize;
2023
} else {
2124
var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);
2225
spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);
26+
27+
precision = generationOptions.precision;
28+
if (precision !== undefined) {
29+
// If the user specified a precision, round to that number of decimal places
30+
factor = Math.pow(10, precision);
31+
spacing = Math.ceil(spacing * factor) / factor;
32+
}
2333
}
2434
var niceMin = Math.floor(dataRange.min / spacing) * spacing;
2535
var niceMax = Math.ceil(dataRange.max / spacing) * spacing;
@@ -41,7 +51,7 @@ function generateTicks(generationOptions, dataRange) {
4151
numSpaces = Math.ceil(numSpaces);
4252
}
4353

44-
var precision = 1;
54+
precision = 1;
4555
if (spacing < 1) {
4656
precision = Math.pow(10, spacing.toString().length - 2);
4757
niceMin = Math.round(niceMin * precision) / precision;
@@ -154,6 +164,7 @@ module.exports = function(Chart) {
154164
maxTicks: maxTicks,
155165
min: tickOpts.min,
156166
max: tickOpts.max,
167+
precision: tickOpts.precision,
157168
stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)
158169
};
159170
var ticks = me.ticks = generateTicks(numericGeneratorOptions, me);

test/specs/scale.linear.tests.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,66 @@ describe('Linear Scale', function() {
548548
expect(chart.scales.yScale0.ticks).toEqual(['11', '9', '7', '5', '3', '1']);
549549
});
550550

551+
describe('precision', function() {
552+
it('Should create integer steps if precision is 0', function() {
553+
var chart = window.acquireChart({
554+
type: 'bar',
555+
data: {
556+
datasets: [{
557+
yAxisID: 'yScale0',
558+
data: [0, 1, 2, 1, 0, 1]
559+
}],
560+
labels: ['a', 'b', 'c', 'd', 'e', 'f']
561+
},
562+
options: {
563+
scales: {
564+
yAxes: [{
565+
id: 'yScale0',
566+
type: 'linear',
567+
ticks: {
568+
precision: 0
569+
}
570+
}]
571+
}
572+
}
573+
});
574+
575+
expect(chart.scales.yScale0).not.toEqual(undefined); // must construct
576+
expect(chart.scales.yScale0.min).toBe(0);
577+
expect(chart.scales.yScale0.max).toBe(2);
578+
expect(chart.scales.yScale0.ticks).toEqual(['2', '1', '0']);
579+
});
580+
581+
it('Should round the step size to the given number of decimal places', function() {
582+
var chart = window.acquireChart({
583+
type: 'bar',
584+
data: {
585+
datasets: [{
586+
yAxisID: 'yScale0',
587+
data: [0, 0.001, 0.002, 0.003, 0, 0.001]
588+
}],
589+
labels: ['a', 'b', 'c', 'd', 'e', 'f']
590+
},
591+
options: {
592+
scales: {
593+
yAxes: [{
594+
id: 'yScale0',
595+
type: 'linear',
596+
ticks: {
597+
precision: 2
598+
}
599+
}]
600+
}
601+
}
602+
});
603+
604+
expect(chart.scales.yScale0).not.toEqual(undefined); // must construct
605+
expect(chart.scales.yScale0.min).toBe(0);
606+
expect(chart.scales.yScale0.max).toBe(0.01);
607+
expect(chart.scales.yScale0.ticks).toEqual(['0.01', '0']);
608+
});
609+
});
610+
551611

552612
it('should forcibly include 0 in the range if the beginAtZero option is used', function() {
553613
var chart = window.acquireChart({

0 commit comments

Comments
 (0)