reverse: false,
beginAtZero: false,
+ /**
+ * Scale boundary strategy (bypassed by min/max time options)
+ * - `data`: make sure data are fully visible, ticks outside are removed
+ * - `ticks`: make sure ticks are fully visible, data outside are truncated
+ * @see https://github.com/chartjs/Chart.js/pull/4556
+ * @since 3.0.0
+ */
+ bounds: 'ticks',
+
// grid line settings
gridLines: {
display: true,
determineDataLimits() {
const me = this;
- const max = me.getLabels().length - 1;
+ const {minDefined, maxDefined} = me.getUserBounds();
+ let {min, max} = me.getMinMax(true);
+
+ if (me.options.bounds === 'ticks') {
+ if (!minDefined) {
+ min = 0;
+ }
+ if (!maxDefined) {
+ max = me.getLabels().length - 1;
+ }
+ }
- me.min = Math.max(me._userMin || 0, 0);
- me.max = Math.min(me._userMax || max, max);
+ me.min = min;
+ me.max = max;
}
buildTicks() {
};
const ticks = generateTicks(numericGeneratorOptions, me);
- // At this point, we need to update our max and min given the tick values since we have expanded the
- // range of the scale
- _setMinAndMaxByKey(ticks, me, 'value');
+ // At this point, we need to update our max and min given the tick values,
+ // since we probably have expanded the range of the scale
+ if (opts.bounds === 'ticks') {
+ _setMinAndMaxByKey(ticks, me, 'value');
+ }
if (opts.reverse) {
ticks.reverse();
};
const ticks = generateTicks(generationOptions, me);
- // At this point, we need to update our max and min given the tick values since we have expanded the
- // range of the scale
- _setMinAndMaxByKey(ticks, me, 'value');
+ // At this point, we need to update our max and min given the tick values,
+ // since we probably have expanded the range of the scale
+ if (opts.bounds === 'ticks') {
+ _setMinAndMaxByKey(ticks, me, 'value');
+ }
if (opts.reverse) {
ticks.reverse();
expect(yScale.getPixelForValue(3)).toBeCloseToPixel(426);
expect(yScale.getPixelForValue(4)).toBeCloseToPixel(538);
});
+
+ it('Should bound to ticks/data', function() {
+ var chart = window.acquireChart({
+ type: 'line',
+ data: {
+ labels: ['a', 'b', 'c', 'd'],
+ datasets: [{
+ data: {b: 1, c: 99}
+ }]
+ },
+ options: {
+ scales: {
+ x: {
+ type: 'category',
+ bounds: 'data'
+ }
+ }
+ }
+ });
+
+ expect(chart.scales.x.min).toEqual(1);
+ expect(chart.scales.x.max).toEqual(2);
+
+ chart.options.scales.x.bounds = 'ticks';
+ chart.update();
+
+ expect(chart.scales.x.min).toEqual(0);
+ expect(chart.scales.x.max).toEqual(3);
+ });
});
expect(getLabels(chart.scales.y)).toEqual(['0.3', '0.8', '1.3', '1.8', '2.3', '2.8']);
});
+ it('Should bound to data', function() {
+ var chart = window.acquireChart({
+ type: 'line',
+ data: {
+ labels: ['a', 'b'],
+ datasets: [{
+ data: [1, 99]
+ }]
+ },
+ options: {
+ scales: {
+ y: {
+ bounds: 'data'
+ }
+ }
+ }
+ });
+
+ expect(chart.scales.y.min).toEqual(1);
+ expect(chart.scales.y.max).toEqual(99);
+ });
+
it('Should build labels using the user supplied callback', function() {
var chart = window.acquireChart({
type: 'bar',
expect(chart.scales.y.min).toBe(10);
expect(chart.scales.y.max).toBe(100);
});
+
+ it('Should bound to data', function() {
+ var chart = window.acquireChart({
+ type: 'line',
+ data: {
+ labels: ['a', 'b'],
+ datasets: [{
+ data: [1.1, 99]
+ }]
+ },
+ options: {
+ scales: {
+ y: {
+ type: 'logarithmic',
+ bounds: 'data'
+ }
+ }
+ }
+ });
+
+ expect(chart.scales.y.min).toEqual(1.1);
+ expect(chart.scales.y.max).toEqual(99);
+ });
});