amcharts4 правильный способ обработки нулевых значений на оси логарифмического значения - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу отображать некоторые данные с большим разнообразием в amcharts4, поэтому мне нравится использовать логарифмическую шкалу на оси значений.К сожалению, данные содержат некоторые нулевые значения, которые, конечно, не могут быть отображены в логарифмическом масштабе.

Я пытался изменить нулевые значения на 1 перед рендерингом диаграммы, что сработало бы, но теперь значения не отображаютсяисправить больше.

data.forEach(item => {
  for (const key in item) {
    if (item[key] === 0) {
      item[key] = 1;
    }
  }
});

Есть ли лучший способ обработки нулевых значений с осью логарифмического значения, чтобы я мог отображать правильные данные?

Здесь являетсяКод ручка, которая показывает мое текущее решение.

1 Ответ

0 голосов
/ 22 февраля 2019

Похоже, что нет прямого эквивалента свойству v3 treatZeroAs, которое автоматически обрабатывает подобные вещи.Предварительная обработка данных - это один шаг, но вы также можете скопировать исходное значение в отдельное свойство объекта и использовать адаптер всплывающей подсказки серии для динамического отображения вашего фактического значения (в этом случае удобен глобальный адаптер ):

data.forEach(item => {
  for (const key in item) {
    if (item[key] <= 0) {
      item[key+"_actual"] = item[key]; //copy the original value into a different property
      item[key] = 1;
    }
  }
});
// ...

//display actual data that was re-mapped if it exists
am4core.globalAdapter.addAll(am4charts.LineSeries, "tooltipText", (text, target) => {
  if ((target instanceof am4charts.LineSeries) && target.dataFields) {
    let valueField = target.dataFields.valueY;
    let tooltipData = target.tooltipDataItem;
    if (tooltipData.dataContext[valueField + "_actual"] !== undefined) {
      return "{" + valueField + "_actual}";
    }
    else {
      return text;
    }
  }
  else {
    return text;
  }
})

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

//fake the zero axis label
valueAxis.renderer.labels.template.adapter.add("text", (text) => {
  if (text === "1") {
    return "0"
  }
  else {
    return text;
  }
})

Codepen

...