JavaScript Chart.js - форматирование пользовательских данных для отображения на всплывающей подсказке

Я рассмотрел различные документы и подобные вопросы здесь, но не могу найти конкретного решения. Извиняюсь, если я пропустил что-то очевидное или повторил этот вопрос!

Как немного информации о предыстории, я реализовал 4 графика, используя плагин Chart.js, и передал необходимые данные с помощью PHP из базы данных. Все это работает правильно и отлично.

Моя проблема заключается в том, что мне нужно отображать данные во всплывающих подсказках в виде отформатированных данных. как числовое число с%. Например, один из моих данных из базы данных - -0.17222. Я отформатировал его как процент для отображения в моей таблице, и все хорошо. Однако при настройке данных для диаграммы chart.js данные, очевидно, не имеют этого форматирования и отображаются как -0.17222, которые я не хочу.

Извините, я хочу опубликовать фотографию, но моя репутация слишком мутная!

Я беру данные из базы данных, а затем устанавливаю в свою таблицу:

var kpiRex = new Handsontable(example1, {
    data: getRexData(),

Затем я передаю эти данные так в разделе диаграммы:

data: kpiRex.getDataAtRow(3)

Любая помощь будет замечательной! Я застрял на этом часами, и это, вероятно, что-то действительно простое, я пропускаю.

Ответ 1

Вы хотите указать пользовательский шаблон всплывающей подсказки в настройках диаграммы, например:

 // String - Template string for single tooltips
 tooltipTemplate: "<%if (label){%><%=label %>: <%}%><%= value + ' %' %>",
 // String - Template string for multiple tooltips
 multiTooltipTemplate: "<%= value + ' %' %>",

Таким образом, вы можете добавить знак "%" после ваших значений, если вы этого хотите.

Вот jsfiddle, чтобы проиллюстрировать это.

Обратите внимание, что tooltipTemplate применяется, если у вас есть только один набор данных, multiTooltipTemplate применяется, если у вас есть несколько наборов данных.

Эти параметры упоминаются в разделе о конфигурации глобальной диаграммы документации. Посмотрите, стоит проверить все остальные параметры, которые можно настроить там.

Обратите внимание, что ваши наборы данных должны содержать только числовые значения. (Никаких признаков% или других вещей там).

Ответ 2

Для chart.js 2.0+ это изменилось (больше нет tooltipTemplate/multiTooltipTemplate). Для тех, кто просто хочет получить доступ к текущему, неформатированному значению и начать его настройку, всплывающая подсказка по умолчанию такая же, как:

options: {
    tooltips: {
        callbacks: {
            label: function(tooltipItem, data) {
                return tooltipItem.yLabel;
            }
        }
    }
}

I.e., вы можете вернуть изменения в tooltipItem.yLabel, где значение y-оси. В моем случае я хотел добавить знак доллара, округление и тысячи запятых для финансовой диаграммы, поэтому я использовал:

options: {
    tooltips: {
        callbacks: {
            label: function(tooltipItem, data) {
                return "$" + Number(tooltipItem.yLabel).toFixed(0).replace(/./g, function(c, i, a) {
                    return i > 0 && c !== "." && (a.length - i) % 3 === 0 ? "," + c : c;
                });
            }
        }
    }
}

Ответ 3

В chart.js 2.1.6 я сделал что-то вроде этого (в typescript):

  let that = this;
  options = {
    legend: {
      display: false,
      responsive: false
    },
    tooltips: {
      callbacks: {
        label: function(tooltipItem, data) {
          let account: Account = that.accounts[tooltipItem.index];
          return account.accountNumber+":"+account.balance+"€";
        }
      }
    }
  }

Ответ 4

Вы можете дать tooltipTemplate функцию и отформатировать всплывающую подсказку по своему усмотрению:

tooltipTemplate: function(v) {return someFunction(v.value);}
multiTooltipTemplate: function(v) {return someOtherFunction(v.value);}

Те, у которых аргументы "v" содержат много информации, кроме свойства value. Вы можете поместить "отладчик" внутри этой функции и проверить их самостоятельно.

Ответ 5

tooltips: {
          callbacks: {
            label: (tooltipItem, data) => {
              // data for manipulation
              return data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
            },
          },
        },

Ответ 6

В Chart.Js 2.8.0 конфигурацию для настраиваемых всплывающих подсказок можно найти здесь: https://www.chartjs.org/docs/latest/configuration/tooltip.html#label-callback (благодаря @prokaktus)

Если вы хотите, например, показать некоторые значения с префиксом или постфиксом (в этом примере скрипт добавляет единицу kWh к значениям на графике), вы можете сделать это следующим образом:

options: {
  rotation: 1 * Math.PI,
  circumference: 1 * Math.PI,
  tooltips: {
    callbacks: {
      label: function(tooltipItem, data) {
        console.log(data);
        console.log(tooltipItem);

        var label = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index] || '';

        if (label) {
          label += ' kWh';
        }

        return label;
      }
    }
  }
}

Пример скрипки тоже здесь: https://jsfiddle.net/y3petw58/1/

Ответ 7

tooltips: {
            enabled: true,
                  mode: 'single',
                  callbacks: {
                    label: function(tooltipItems, data) { 
                      return data.datasets[tooltipItems.datasetIndex].label+": "+tooltipItems.yLabel;
                    }
                  }
                }

Ответ 8

Вам нужно использовать Label Callback. Общий пример округления значений данных, следующий пример округляет данные до двух десятичных разрядов.

var chart = new Chart(ctx, {
    type: 'line',
    data: data,
    options: {
        tooltips: {
            callbacks: {
                label: function(tooltipItem, data) {
                    var label = data.datasets[tooltipItem.datasetIndex].label || '';

                    if (label) {
                        label += ': ';
                    }
                    label += Math.round(tooltipItem.yLabel * 100) / 100;
                    return label;
                }
            }
        }
    }
});

Если вы утешаете аргументы функции Label Callback, вы будете иметь структуру, подобную этой, наборы данных, массив состоит из разных линий, которые вы хотите построить на диаграмме.

enter image description here

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

Чтобы различать разные строки и манипулировать данными всплывающей подсказки на основе данных других строк, мне пришлось написать эту логику.

  callbacks: {
    label: function (tooltipItem, data) {
      console.log('data', data);
      console.log('tooltipItem', tooltipItem);
      let updatedToolTip: number;
      if (tooltipItem.datasetIndex == 0) {
        updatedToolTip = tooltipItem.yLabel;
      }
      if (tooltipItem.datasetIndex == 1) {
        updatedToolTip = tooltipItem.yLabel - data.datasets[0].data[tooltipItem.index];
      }
      if (tooltipItem.datasetIndex == 2) {
        updatedToolTip = tooltipItem.yLabel - data.datasets[1].data[tooltipItem.index];
      }
      if (tooltipItem.datasetIndex == 3) {
        updatedToolTip = tooltipItem.yLabel - data.datasets[2].data[tooltipItem.index]
      }
      return updatedToolTip;
    }
  } 

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