【问题标题】:Click event on stacked bar chart - ChartJs堆积条形图上的单击事件 - ChartJs
【发布时间】:2017-06-16 09:36:08
【问题描述】:

我正在尝试在堆积条形图上实现点击事件。

数据如下:

var chartData = {
    type: 'horizontalBar',
    data: {
        labels: ['A0224', 'A3681', 'A3984', 'A4101', 'A4150', 'B0682', 'Others'],
        datasets: [
            {
                label: "P1",
                backgroundColor: '#cc3399',
                data: [6, 7, 6, 8, 6, 10, 3]
            },
            {
                label: "P2",
                backgroundColor: '#0099ff',
                data: [8, 9, 5, 8, 6, 10, 3]
            },
            {
                label: "P3",
                backgroundColor: '#0022ff',
                data: [6, 7, 6, 8, 6, 10, 3]
            }
        ]
    },
    options: {
        legend: { display: false },
        scales: {
            yAxes: [{
                stacked: true
            }],
            xAxes: [{
                stacked: true
            }]
        },

    }
}

点击事件和图表创建方法如下:

var myChart = new
    Chart(document.getElementById("createCurrYearHccGapChart"),
    chartData);
var canvas = document.getElementById('createCurrYearHccGapChart');
canvas.onclick = function (evt) {
    var activePoints = myChart.getElementsAtEvent(evt);
    var cdata = activePoints[0]['_chart'].config.data;
    var idx = activePoints[0]['_index'];
    var label = cdata.datasets[idx].label;
    var value = cdata.datasets[0].data[idx];
};

图表如下所示:

以下是我在单击单个栏时获得的值:
栏 1 - 标签 = P1,值 = 6
栏 2 - 标签 = P2,值 = 7
栏 3 - 标签 = P3,值 = 6 等等...

问题:
因此,无论我点击第一个柱,标签都是 P1,因为我将整个柱的索引值设为 0,柱 2 的索引值为 1,依此类推。

问题:
有什么方法可以识别x坐标值吗?这样我就可以确定点击来自哪个堆栈。

【问题讨论】:

    标签: javascript jquery charts chart.js stacked-chart


    【解决方案1】:

    您可以使用以下图表的 on-click 事件处理程序来完成此操作...

    canvas.onclick = function(evt) {
       var activePoint = myChart.getElementAtEvent(evt)[0];
       var data = activePoint._chart.data;
       var datasetIndex = activePoint._datasetIndex;
       var label = data.datasets[datasetIndex].label;
       var value = data.datasets[datasetIndex].data[activePoint._index];
    };
    

    ᴡᴏʀᴋɪɴɢ ᴇxᴀᴍᴘʟᴇ ⧩

    var chartData = {
       type: 'horizontalBar',
       data: {
          labels: ['A0224', 'A3681', 'A3984', 'A4101', 'A4150', 'B0682', 'Others'],
          datasets: [{
             label: "P1",
             backgroundColor: '#cc3399',
             data: [6, 7, 6, 8, 6, 10, 3]
          }, {
             label: "P2",
             backgroundColor: '#0099ff',
             data: [8, 9, 5, 8, 6, 10, 3]
          }, {
             label: "P3",
             backgroundColor: '#0022ff',
             data: [6, 7, 6, 8, 6, 10, 3]
          }]
       },
       options: {
          responsive: false,
          legend: {
             display: false
          },
          scales: {
             yAxes: [{
                stacked: true
             }],
             xAxes: [{
                stacked: true
             }]
          },
    
       }
    }
    
    var canvas = document.getElementById('createCurrYearHccGapChart');
    var myChart = new Chart(canvas, chartData);
    
    canvas.onclick = function(evt) {
       var activePoint = myChart.getElementAtEvent(evt)[0];
       var data = activePoint._chart.data;
       var datasetIndex = activePoint._datasetIndex;
       var label = data.datasets[datasetIndex].label;
       var value = data.datasets[datasetIndex].data[activePoint._index];
       console.log(label, value);
    };
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
    <canvas id="createCurrYearHccGapChart" height="170"></canvas>

    【讨论】:

    • 非常感谢它像魅力一样工作:) 此外,它需要最新版本的 chartjs 用于 getElementAtEvent 方法。
    • 嗨@ɢʀᴜɴᴛ,我按原样使用了这个解决方案,但无论我点击哪个栏,我的 activePoint._datasetIndex 都为零。你有什么想法吗?谢谢。
    • 完全有效,确保“myChart”和其他变量在代码中保持一致。它允许单击图形的特定块,并返回它的标签和值属性。
    • 您可以使用this 代替命名图表。它会更通用。这对我有用:var activePoint = this.getElementAtEvent(event)[0];
    • 我能用 react native svg 图表做同样的事情吗
    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2019-04-02
    • 2014-02-09
    相关资源
    最近更新 更多