javascript - chart.js 中填充折线图中的悬停/单击区域

标签 javascript charts chart.js dom-events mouseover

给定 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但是在填充区域中,唯一的参数是一个空数组。

我有一个堆积的填充图表,如图所示,带有曲线。当鼠标位于浅灰色区域的任何位置时,我想要一个事件。

example of filled line chart with chart.js (with stacking)

编辑 这是一个 fiddle :https://jsfiddle.net/markv/rvqjkrp9/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>

关于javascript - chart.js 中填充折线图中的悬停/单击区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40056511/

相关文章:

php - 在sql中存储html元素的有效方法

javascript - Google 条形图数据准备——按列分组

vba - 使用 VBA 更改 Excel 图表的方向(纵向或横向)

javascript - 在 javascript 图表上显示交易量配置文件

javascript - React-admin 自定义 noResult 设计

javascript - 重定向到 javascript 文件中的新选项卡

javascript - 如何在 chart.js 圆环图中使用两个数据集?

angular - 在 ng2-charts 中隐藏未使用的轴

javascript - 使用 Chart.js 创建热图/穿孔卡片

javascript - 我如何排除 gulp src 中的路径?