javascript - 如何在 ChartJS 中单击时获取事件标签元素?

标签 javascript chart.js

我使用 ChartJS 创建了一个饼图。

现在我想创建一个点击处理程序,我可以在其中获取我创建的图表部分的标签和值。我如何做到这一点?

let my_chart = new Chart('tot_pop_chart', {
    type: 'pie',
    data: {
      labels: ['NSW', 'VIC', 'QSD', 'SA', 'WA', 'TAS', 'NT', 'ACT'],
      datasets: [{
          data: [1, 2, 3, 4, 5, 6, 7, 8],
          backgroundColor: ['rgba(63, 75, 59, 1)', 'rgba(242, 246, 208, 1)', 'rgba(197, 123, 87, 1)', 'rgba(118, 159, 182, 1)', 'rgba(58, 110, 165, 1)', 'rgba(88, 12, 31, 1)', 'rgba(157, 172, 255, 1)', 'rgba(122, 48, 108, 1)']
        }

      ]
    },
    options: {
      animation: {},
      plugins: {
        legend: {
          display: true,
          position: 'bottom'
        }
      },
      onClick: ... //see below
    }
  }

);

我目前的尝试如下:

onClick:
  e => {
    console.log("In click", e.chart);

    // find the index of the clicked item
    let canvasPosition = Chart.helpers.getRelativePosition(e, e.chart);
    let index = e.chart.scales.x.getValueForPixel(canvasPosition.x);

    // now I want to retrieve the label/data using the index, how to?
  }

但是,错误发生为 TypeError: Cannot read property 'getValueForPixel' of undefined。另外,如何使用 onClick 函数中的索引检索标签/数据?

非常感谢您的帮助!

最佳答案

饼图/ donut chart 不使用比例,因此您不能使用 getValueForPixel。相反,您可以只收听第二个参数,该参数包含一个包含所有事件元素的数组,默认交互模式仅包含一项:

var options = {
  type: 'pie',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [{
      label: '# of Votes',
      data: [12, 19, 3, 5, 2, 3],
      backgroundColor: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"]
    }]
  },
  options: {
    onClick: (e, activeEls) => {
      let datasetIndex = activeEls[0].datasetIndex;
      let dataIndex = activeEls[0].index;
      let datasetLabel = e.chart.data.datasets[datasetIndex].label;
      let value = e.chart.data.datasets[datasetIndex].data[dataIndex];
      let label = e.chart.data.labels[dataIndex];
      console.log("In click", datasetLabel, label, value);
    }
  }
}

var ctx = document.getElementById('chartJSContainer').getContext('2d');
new Chart(ctx, options);
<body>
  <canvas id="chartJSContainer" width="600" height="400"></canvas>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.js"></script>
</body>

关于javascript - 如何在 ChartJS 中单击时获取事件标签元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69093845/

相关文章:

javascript - 防止可编辑 div 在输入某些字符时的行为

javascript - 按日期对表格进行排序——我应该使用 AJAX/PHP/MySql 还是纯 Javascript?

javascript - JSON 新手,我可以用这个 json 响应做什么

javascript - 如何在语义用户界面搜索输入中显示所有类别内容结果?

javascript - 在 Play Framework 上将参数从 View 传递到 Controller

javascript - Chart JS - 如何将 JSON 对象输出到 PIE 变体中

javascript - 如何使 chartjs 中的点可拖动?

javascript - 尝试通过 php 在数据(chart.js)中输入数据时如何修复[<br/>

javascript - 如何为 chart.js(条形图)动态推送数据集?

javascript - Chart.js 没有高度响应