当前位置: 首页 > 知识库问答 >
问题:

Chart.js:条形图点击事件

夏宏旷
2023-03-14

我刚刚开始使用Chart.js,我很快就变得非常沮丧。我有我的堆叠条形图工作,但是我不能让点击“事件”工作。

我在图表中找到了nnnick对GitHub的评论。js声明使用函数<code>getBarsAtEvent

我在画布元素上设置了一个事件监听器(正确的方式):

canv.addEventListener('click', handleClick, false);

...然而在我的< code>handleClick函数中,< code > chart . getbarsatevent 是未定义的!

现在,在图表中。js文档中,有一个关于为条形图注册点击事件的不同方法的声明。这与两年前nnnick对GitHub的评论大不相同。

在全局图表默认值中,您可以为您的图表设置一个< code>onClick函数。我在我的图表配置中添加了一个< code>onClick函数,但它什么也没做...

那么,我该如何让点击回调为我的条形图工作呢?!

任何帮助将不胜感激。谢谢!

附言:我没有使用 GitHub 的主版本。我试过了,但它一直在尖叫,要求是未定义的,我还没有准备好包含CommonJS,以便我可以使用这个图表库。我宁愿写我自己的当当图表。相反,我下载并使用了直接从文档页面顶部的链接下载的标准内部版本。

示例:这是我正在使用的配置示例:

var chart_config = {
    type: 'bar',
    data: {
        labels: ['One', 'Two', 'Three'],
        datasets: [
            {
                label: 'Dataset 1',
                backgroundColor: '#848484',
                data: [4, 2, 6]
            },
            {
                label: 'Dataset 2',
                backgroundColor: '#848484',
                data: [1, 6, 3]
            },
            {
                label: 'Dataset 3',
                backgroundColor: '#848484',
                data: [7, 5, 2]
            }
        ]
    },
    options: {
        title: {
            display: false,
            text: 'Stacked Bars'
        },
        tooltips: {
            mode: 'label'
        },
        responsive: true,
        maintainAspectRatio: false,
        scales: {
            xAxes: [
                {
                    stacked: true
                }
            ],
            yAxes: [
                {
                    stacked: true
                }
            ]
        },
        onClick: handleClick
    }
};

共有3个答案

曹焱
2023-03-14

我在https://github.com/valor-software/ng2-charts/issues/489找到了这个解决方案

public chartClicked(e: any): void {
  if (e.active.length > 0) {
  const chart = e.active[0]._chart;
  const activePoints = chart.getElementAtEvent(e.event);
  if ( activePoints.length > 0) {
   // get the internal index of slice in pie chart
   const clickedElementIndex = activePoints[0]._index;
   const label = chart.data.labels[clickedElementIndex];
   // get value by index
   const value = chart.data.datasets[0].data[clickedElementIndex];
   console.log(clickedElementIndex, label, value)
  }
 }
}
万俟经纶
2023-03-14

Hi这是选项下的单击事件,它从x和y轴获取值

onClick: function(c,i) {
    e = i[0];
    console.log(e._index)
    var x_value = this.data.labels[e._index];
    var y_value = this.data.datasets[0].data[e._index];
    console.log(x_value);
    console.log(y_value);
}
司马建柏
2023-03-14

我通过浏览图表找到了问题的答案。js源代码。

在标准构建Chart.js的第3727行提供了方法. getElementAtEvent。此方法返回我单击的“图表元素”。这里有足够的数据来确定要在单击的数据集的向下钻取视图中显示哪些数据。

在<code>图表返回的数组的第一个索引上。getElementAtEvent是一个值_datasetIndex。此值显示单击的数据集的索引。

我认为,单击的特定栏由_index的值注意到。在我问题的例子中,_index会指向chart_config.data.标签中的一个

我的<code>handleClick<code>函数现在看起来像这样:

function handleClick(evt)
{
    var activeElement = chart.getElementAtEvent(evt);

..其中,图表是图表创建的图表的引用.js在执行以下操作时:

chart = new Chart(canv, chart_config);

因此,单击选择的特定数据集可以查找为:

chart_config.data.datasets[activeElement[0]._datasetIndex].data[activeElement[0]._index];

现在你有了它。我现在有一个数据点,我可以从中构建一个查询来显示点击的栏的数据。

2021年8月7日。更新

现在有一种方法可以满足我们的需求。看看这里

 类似资料:
  • 我使用chart.js在我的网页上有一个BarChart。 我在其中添加了两个数据点 现在我想要更新那些条A和B,而不是删除它们并再次添加它们(我已经想好了如何做到这一点)。我想让它们垂直移动以适应它们的新值,但我无法找到如何访问图表中已经存在的数据。 没有什么比得上 其中第一个值将是存储数据的索引(F.E.)。 我该怎么做呢?

  • 我使用的是Chart.js2.5.0版本,需要知道是否有任何方法可以隐藏分组堆叠条形图中每组的空条?图表数据集中的某些数据值可以为空。 这里是我想要的:组合图表类型(分组和堆叠) 小提琴:https://jsfidle.net/q_sabawoon/atlxlg7x/ 请帮帮忙。

  • 我正在使用MPAndroidChart库来实现,如何实现中每个条的点击侦听器。我想在Toast中显示点击的值。如何实现这个?

  • 在自定义图表上工作,可以根据数据提供的值确定条形图或水平条形图中的条形图的厚度,而不是使用barThickness或barPer百分比/类别百分比的预设宽度。 目标:我可以用包含值和

  • 我在超文本标记语言页面中包含了一个堆叠条形图(带有Chart.js库),可以让用户可视化一些数据。这些数据会随着用户的选择而改变,启用此onClick功能的Javascript函数是: 其中函数createData创建JSON对象(带有标签和数据集)以传递给图形(工作正常),函数makeGrafico(): 获取用于显示的参数的名称,以及上一个函数的JSON对象。 当我第一次单击一个程序时(具有o

  • 我正在使用Chart.js库绘制条形图,它工作正常,但现在我想销毁条形图,并在同一画布中绘制线条图。我尝试了以下两种方法来清除画布: 第二种方式: 我说得对吗?OnButtonClick我调用这个函数,它使用相同的画布。