javascript - 如何在 ChartJS 中单击时获取活动标签元素?
问题描述
我使用 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 函数中的索引检索标签/数据?
非常感谢你的帮助!
解决方案
饼图/甜甜圈图不使用比例,因此您不能使用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>
推荐阅读
- python - json解码错误期望值:第1行第1列(char 0)
- javascript - VS-Code 设置 json 的 json 架构是什么?
- java - 我应该在对象创建后立即初始化我的实体字段吗?
- python - 将 Django 中上传文件夹的编码更改为“uft-8”
- c++ - 调用C++对象析构函数的各种方式
- python - sqlite3 错误唯一约束失败:tablename.id
- javascript - 发送电子邮件的通知消息
- azure - Azure 数据工厂与 Azure 逻辑应用
- python - 在推理时启用 dropout 并禁用 BatchNormalization
- r - R Shiny 以交互方式选择变量来执行计算