Пользовательское «сравнение» и диапазон осей в Highcharts

#highcharts

#highcharts

Вопрос:

Я добавил пользовательскую процедуру «сравнения», чтобы вычислить разницу некоторого значения точки относительно предыдущей точки (вместо относительно первой точки в ряду, как это реализовано в compare: ‘value’):

 Highcharts.wrap(Highcharts.Series.prototype, "setCompare", function(proceed, compare) {
  // Set or unset the modifyValue method
  this.modifyValue = (compare === 'value' || compare === 'percent' || compare === 'value_previous' || compare === 'percent_previous') ?
    function(value, point) {
    
      // MODIFIED ---------------------
      var compareValue;
      if (point amp;amp; compare.includes("_previous")) {
        compareValue = point.series.processedYData[point.index - 1];
      } else {
        compareValue = this.compareValue;
      }
      // -------------------------------

      if (typeof value !== 'undefined' amp;amp; typeof compareValue !== 'undefined') { // #2601, #5814
        // Get the modified value
        if (compare.includes('value')) { // MODIFIED!!!!!!!
          value -= compareValue;
          // Compare percent
        } else {
          value = 100 * (value / compareValue) - (this.options.compareBase === 100 ? 0 : 100);
        }
        // record for tooltip etc.
        if (point) {
          point.change = value;
        }
        return value;
      }
      return 0;
    } :
    null;
  // Survive to export, #5485
  this.userOptions.compare = compare; // ---WHAT TO DO???---
  // Mark dirty
  if (this.chart.hasRendered) {
    this.isDirty = true;
  }
});
 

Диаграмма рисуется так, как ожидалось (см. Скрипку), но диапазон yaxis не охватывает новые вычисленные значения. Есть идеи, как решить проблему?
Скрипка

Ответ №1:

Вам также необходимо включить эту часть кода, которая будет запускать и получать this.modifyValue из вашего пользовательского переноса.

 ///
/// MISSED FUNCTIONS
///

var arrayMin = Highcharts.arrayMin = function arrayMin(data) {
    var i = data.length, min = data[0];
    while (i--) {
        if (data[i] < min) {
            min = data[i];
        }
    }
    return min;
};

var arrayMax = Highcharts.arrayMax = function arrayMax(data) {
    var i = data.length, max = data[0];
    while (i--) {
        if (data[i] > max) {
            max = data[i];
        }
    }
    return max;
};

// Modify series extremes
Highcharts.addEvent(Highcharts.Series.prototype, 'afterGetExtremes', function (e) {
    var dataExtremes = e.dataExtremes;
    if (this.modifyValue amp;amp; dataExtremes) {
        var extremes = [
            this.modifyValue(dataExtremes.dataMin),
            this.modifyValue(dataExtremes.dataMax)
        ];
        dataExtremes.dataMin = arrayMin(extremes);
        dataExtremes.dataMax = arrayMax(extremes);
    }
});


///
///
///
 

Демонстрация: https://jsfiddle.net/BlackLabel/ucvae7xy /

Комментарии:

1. Спасибо за ответ! Для ответа потребовалось немного больше кода, но вы указали мне правильный путь. Теперь он поддерживает несколько вариантов сравнения, включая «кумулятивный». Посмотрите на скрипку