123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- 'use strict';
- module.exports = function(Chart) {
- var helpers = Chart.helpers;
- var defaultConfig = {
- position: 'left',
- ticks: {
- callback: Chart.Ticks.formatters.linear
- }
- };
- var LinearScale = Chart.LinearScaleBase.extend({
- determineDataLimits: function() {
- var me = this;
- var opts = me.options;
- var chart = me.chart;
- var data = chart.data;
- var datasets = data.datasets;
- var isHorizontal = me.isHorizontal();
- function IDMatches(meta) {
- return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;
- }
- // First Calculate the range
- me.min = null;
- me.max = null;
- if (opts.stacked) {
- var valuesPerType = {};
- helpers.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
- if (valuesPerType[meta.type] === undefined) {
- valuesPerType[meta.type] = {
- positiveValues: [],
- negativeValues: []
- };
- }
- // Store these per type
- var positiveValues = valuesPerType[meta.type].positiveValues;
- var negativeValues = valuesPerType[meta.type].negativeValues;
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- helpers.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
- if (isNaN(value) || meta.data[index].hidden) {
- return;
- }
- positiveValues[index] = positiveValues[index] || 0;
- negativeValues[index] = negativeValues[index] || 0;
- if (opts.relativePoints) {
- positiveValues[index] = 100;
- } else if (value < 0) {
- negativeValues[index] += value;
- } else {
- positiveValues[index] += value;
- }
- });
- }
- });
- helpers.each(valuesPerType, function(valuesForType) {
- var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);
- var minVal = helpers.min(values);
- var maxVal = helpers.max(values);
- me.min = me.min === null ? minVal : Math.min(me.min, minVal);
- me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);
- });
- } else {
- helpers.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- helpers.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
- if (isNaN(value) || meta.data[index].hidden) {
- return;
- }
- if (me.min === null) {
- me.min = value;
- } else if (value < me.min) {
- me.min = value;
- }
- if (me.max === null) {
- me.max = value;
- } else if (value > me.max) {
- me.max = value;
- }
- });
- }
- });
- }
- // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero
- this.handleTickRangeOptions();
- },
- getTickLimit: function() {
- var maxTicks;
- var me = this;
- var tickOpts = me.options.ticks;
- if (me.isHorizontal()) {
- maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));
- } else {
- // The factor of 2 used to scale the font size has been experimentally determined.
- var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);
- maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));
- }
- return maxTicks;
- },
- // Called after the ticks are built. We need
- handleDirectionalChanges: function() {
- if (!this.isHorizontal()) {
- // We are in a vertical orientation. The top value is the highest. So reverse the array
- this.ticks.reverse();
- }
- },
- getLabelForIndex: function(index, datasetIndex) {
- return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
- },
- // Utils
- getPixelForValue: function(value) {
- // This must be called after fit has been run so that
- // this.left, this.top, this.right, and this.bottom have been defined
- var me = this;
- var start = me.start;
- var rightValue = +me.getRightValue(value);
- var pixel;
- var range = me.end - start;
- if (me.isHorizontal()) {
- pixel = me.left + (me.width / range * (rightValue - start));
- return Math.round(pixel);
- }
- pixel = me.bottom - (me.height / range * (rightValue - start));
- return Math.round(pixel);
- },
- getValueForPixel: function(pixel) {
- var me = this;
- var isHorizontal = me.isHorizontal();
- var innerDimension = isHorizontal ? me.width : me.height;
- var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;
- return me.start + ((me.end - me.start) * offset);
- },
- getPixelForTick: function(index) {
- return this.getPixelForValue(this.ticksAsNumbers[index]);
- }
- });
- Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);
- };
|