Highcharts — лучший способ обработки и отображения нулевых (или отрицательных) значений в серии линейных диаграмм с логарифмической осью Y.

В моих линейных графиках HighChart ряд данных динамически загружается из моего приложения Ruby on Rails. Иногда значения серии равны нулю или меньше, что является проблемой для HighCharts, и выдает следующее исключение:

Highcharts Error #10
Can't plot zero or subzero values on a logarithmic axis

Поэтому в качестве обходного пути я обрабатываю свой рубиновый массив, чтобы условно заменить ноль меньшего значения незначительным положительным числом, например. 0,00001, как показано ниже:

oil_vol_array = d_array[1].map { |e| (e < 0.0001) ? 0.0001 : e.round(3) }

Это предотвращает создание исключения, но на дисплее отображается график, начинающийся с 0,0001, если начальное значение равно нулю (это понятно, поскольку я попросил об этом). Более желательным отображением было бы начало графика с нуля, но HighChart это не нравится :(

Есть ли способ, которым это может быть достигнуто?


person Bharat    schedule 16.04.2012    source источник


Ответы (2)


Пробовали ли вы использовать форматировщик меток?

var chart = new Highcharts.Chart({ 
    yAxis: {        
        labels: {
            formatter: function() {
                if(this.value === 0.00001){
                    return 0;
                } else {
                    return this.value;
                }
            }
        }
    }
});
person Brian Hadaway    schedule 16.04.2012

При работе с огромными числами лучше использовать стандартный форматировщик меток для значений, отличных от 0, иначе ваши метки будут отображаться следующим образом: 1000000000... Чтобы изменить это, замените оператор else на вызов исходного метода форматирования меток. ниже:

var chart = new Highcharts.Chart({ 
    yAxis: {        
        labels: {
            formatter: function() {
                if(this.value === 0.00001){
                    return 0;
                } else {
                    return Highcharts.Axis.prototype.defaultLabelFormatter.call(this);
                }
            }
        }
    }
});
person Andy V    schedule 09.10.2013