Форматирование ярлыков Y-оси Highcharts
Я использую Highcharts для создания линейной диаграммы, отображающей валютные значения. По умолчанию метки оси Y используют метрические префиксы для аббревиатуры, например. Вместо 3 000 отображается 3k
Я хотел бы добавить символ валюты к этим меткам, например. отображать $3k вместо 3k. Однако, как только я добавляю символ валюты, префиксы метрики больше не используются. Я пробовал следующие
yAxis: {
labels: {
formatter: function () {
return '$' + this.value;
}
}
}
а также попытался
yAxis: {
labels: {
format: '${value}'
}
}
Но в обоих случаях вместо $3k отображается $3000. Можно ли добавить символ валюты без потери префикса метрики?
Здесь приведена демонстрация (JSFiddle здесь), которая иллюстрирует проблему
$(function() {
$('#container').highcharts({
yAxis: {
// if you include the lines below, the metric prefixes disappear
/*
labels: {
format: '${value}'
}
*/
},
series: [{
data: [15000, 20000, 30000]
}]
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<div id="container" style="height: 400px; width: 500px"></div>
Ответы
Ответ 1
Вы можете вызывать исходный форматтер из вашей функции форматирования:
$(function () {
$('#container').highcharts({
yAxis: {
labels: {
formatter: function () {
return '$' + this.axis.defaultLabelFormatter.call(this);
}
}
},
series: [{
data: [15000, 20000, 30000]
}]
});
});
http://jsfiddle.net/x6b0onkp/2/
Ответ 2
Я посмотрел исходный код HighCharts и выяснил, что если вы передадите format
или formatter
, он не будет добавлять числовой символ. Он находится внутри оператора else if
, т.е. FormatOption xor numericSymbol. Поэтому вам нужно добавить форматтер и сделать логику самостоятельно.
это слегка измененная копия папок их кода:
formatter: function() {
var ret,
numericSymbols = ['k', 'M', 'G', 'T', 'P', 'E'],
i = numericSymbols.length;
if(this.value >=1000) {
while (i-- && ret === undefined) {
multi = Math.pow(1000, i + 1);
if (this.value >= multi && numericSymbols[i] !== null) {
ret = (this.value / multi) + numericSymbols[i];
}
}
}
return '$' + (ret ? ret : this.value);
}
http://jsfiddle.net/x6b0onkp/1/