#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. Спасибо за ответ! Для ответа потребовалось немного больше кода, но вы указали мне правильный путь. Теперь он поддерживает несколько вариантов сравнения, включая «кумулятивный». Посмотрите на скрипку