【问题标题】:Highlight last clicked bar in ChartJS在 ChartJS 中突出显示最后点击的栏
【发布时间】:2018-09-10 16:17:15
【问题描述】:

我正在尝试更改 ChartJS 中最后一次单击的栏的不透明度,然后在下次单击另一个栏时将其“取消突出显示”。基本上是悬停的默认行为。请注意,这是一个堆积条形图,我希望整个条形列的不透明度发生变化,而不是每个单独的部分。

我已经能够在单击时将背景颜色(不确定如何更改不透明度)更改为黑色,但在单击下一个项目时它不会取消设置。因此,一旦点击了所有内容,整个图表就会变成黑色。

这是我目前使用的 onclick 代码:

            var myChart = new Chart(ctx, {
            type: 'bar',
            data: data,
            options: {
                onClick: function(e){
                    myChart.update();
                    var element = this.getElementAtEvent(event)[0];
                    element.custom = element.custom || {};
                    element.custom.backgroundColor = '#000';
                    },
                }
            });

堆叠数据:

            var data = {
                "labels":["2011","2012","2013","2014","2015"],
                "datasets":[
                            {
                                "label":"Total Fishermen",
                                "backgroundColor":"#518936",
                                "data":[991,1020,731,850,851]
                            },
                            {
                                "label":"Total Processing Employees",
                                "backgroundColor":"#82c6d4",
                                "data":[0,0,130,0,0]
                            },
                            {
                                "label":"Total Aquaculture Employees",
                                "backgroundColor":"#c0136b",
                                "data":[0,134,130,119,0]
                            }
                        ]
                    };

任何帮助将不胜感激!

【问题讨论】:

    标签: jquery chart.js chartjs-2.6.0


    【解决方案1】:

    ...但是当点击下一个项目时它不会取消设置。

    您可以使用 active 属性来获取活动组元素并使用当前的 backgroundColor 添加transparency 的 50%:

    this.active.forEach(function(ele, idx) {
        ele.custom = ele.custom || {};
        if (ele.custom.backgroundColor == undefined) {
            var color = ele._model.backgroundColor.replace(')', ', 0.5)');
            ele.custom.backgroundColor = color;
        } else {
            delete ele.custom.backgroundColor;
        }
    });
    

    为了重置最后点击的元素,您可以在 onClick 处理程序中循环所有元素:

    for(i=0; i<this.data.datasets.length; i++) {
        this.getDatasetMeta(i).data.forEach(function(ele, idx) {
            if (ele.custom != undefined)
                delete ele.custom.backgroundColor;
        });
    }
    

    Chart.pluginService.register({
        afterInit: function (chart, options) {
            chart.pluginInitialized = true;
        },
        afterDraw: function (chart, options) {
            if (chart.pluginInitialized) {
                var centerIndex = Math.floor(chart.data.labels.length/2);
                for(var i=0; i<chart.data.datasets.length; i++) {
                    chart.getDatasetMeta(i).data.forEach(function(ele, idx) {
                        var opacity = ' 0.3)';
                        if (idx == centerIndex) {
                            opacity = ' 1)';
                        }
                        ele.custom = ele.custom || {};
                        if (ele.custom.backgroundColor == undefined) {
                            var rgb = ele._model.backgroundColor;
                            var match = null;
                            if (match = rgb.match(/^#([a-fA-F0-9]{6})$/i)) {
                                rgb = 'rgb(';
                                match = match[1];
                                for (var j = 0; j < 3; j++) {
                                    rgb += parseInt(match.slice(j * 2, j * 2 + 2), 16) + ',';
                                }
                                rgb += opacity;
                            }
                            ele.custom.backgroundColor = rgb;
                        }
                    });
                }
                chart.pluginInitialized = false;
                chart.update(true);
            }
        }
    });
    
    var ctx = document.getElementById('ctx').getContext('2d');
    var data = {
        "labels":["2011","2012","2013","2014","2015"],
        "datasets":[
            {
                "label":"Total Fishermen",
                "backgroundColor":"#518936",
                "data":[991,1020,731,850,851]
            },
            {
                "label":"Total Processing Employees",
                "backgroundColor":"#82c6d4",
                "data":[0,0,130,0,0]
            },
            {
                "label":"Total Aquaculture Employees",
                "backgroundColor":"#c0136b",
                "data":[0,134,130,119,0]
            }
        ]
    };
    var myChart = new Chart(ctx, {
        type: 'bar',
        data: data,
        options: {
            onClick: function (e) {
                // remove old background opacity....
                for(i=0; i<this.data.datasets.length; i++) {
                    this.getDatasetMeta(i).data.forEach(function(ele, idx) {
                        var rgx = /(rgba*\(\d{1,3}), *(\d{1,3}), *(\d{1,3}), *[0-9.]+(\))/;
                        ele._model.backgroundColor = ele._model.backgroundColor.replace(rgx, "$1, $2, $3$4");
                        if (ele.custom != undefined)
                            delete ele.custom.backgroundColor;
                    });
                }
                // set backgrounf opacity....
                this.active.forEach(function(ele, idx) {
                    ele.custom = ele.custom || {};
                    if (ele.custom.backgroundColor == undefined) {
                        var color = ele._model.backgroundColor.replace(')', ', 0.5)');
                        ele.custom.backgroundColor = color;
                    } else {
                        delete ele.custom.backgroundColor;
                    }
                });
                myChart.update(true);
            }
        }
    });
    .graph {
        height: 500px;
        width: 500px;
        text-align: center;
    }
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
    
    <div class="graph">
        <canvas id="ctx"></canvas>
    </div>

    【讨论】:

    • 嘿伙计,如果你想看看,我已经设置了赏金。
    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多