Наведите курсор / щелкните область на заполненной линейной диаграмме в chart.js

#javascript #charts #chart.js #dom-events #mouseover

#javascript #Диаграммы #chart.js #dom-события #Наведение курсора мыши

Вопрос:

Учитывая линейную диаграмму в chart.js с заполненными областями под кривой. Есть ли способ получить полезное событие, когда пользователь наводит курсор мыши на заполненную область или щелкает по ней?

 var chart_canvas = document.getElementById("myChart");
var stackedLine = new Chart(chart_canvas, {
    type: 'line',
    data: {
        labels: ["0.0", "0.2", "0.4", "0.6", "0.8", "1.0"],
        fill: true,
        datasets: [{
            label: 'Usage',
            data: data[0],
        },
        {
            label: 'Popularity',
            data: data[1],
        }]
    },
    options: {
        onHover: function (elements) {
            console.log(elements);
        }
        // more stuff
    }
});
 

Я пытался onHover , но когда в заполненной области единственным аргументом является пустой массив.

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

пример заполненной линейной диаграммы с chart.js (со штабелированием)

РЕДАКТИРОВАТЬ Вот скрипка: https://jsfiddle.net/markv/rvqjkrp9/1 /

Ответ №1:

Вы можете вычислить, находится ли мышь в области, получив значение оси y, индекс оси x, а затем вычислить максимальное заполнение, а затем проверить, ниже ли значение yVal:

 var chart_canvas = document.getElementById("myChart");
var stackedLine = new Chart(chart_canvas, {
  type: 'line',
  data: {
    labels: ["0.0", "0.2", "0.4", "0.6", "0.8", "1.0"],
    fill: true,
    datasets: [{
      label: 'Usage',
      pointRadius: 3,
      data: [.5, .3, .2, .1, .4, .3],
      borderWidth: 1,
      fill: true
    }, {
      label: 'Popularity',
      pointRadius: 3,
      data: [.0, .1, .2, .4, .1, .4],
      borderWidth: 1,
      fill: true
    }]
  },
  options: {
    scales: {
      y: {
        stacked: true,
      }
    },
    onHover: (evt, activeEls, chart) => {
      let yVal = chart.scales.y.getValueForPixel(evt.y);
      let index = chart.scales.x.getValueForPixel(evt.x);

      let maxFilledArea = chart.data.datasets.reduce((acc, curr) => (acc   curr.data[index]), 0)

      if (yVal <= maxFilledArea) {
        console.log('Mouse in filled area')
      }
    }
  }
}); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.0/chart.js"></script>

<main>
  <canvas id="myChart" width="500" height="500"></canvas>
</main>