charts - x 轴的最小值不适用于水平条形图 |图表JS

标签 charts bar-chart chart.js stacked-chart

我正在使用 Chart.js (www.chartjs.org) 来显示工作期间花在事件上的时间。我有“工作”(绿色)、“吸烟”(红色)、“午餐”(橙色)、“在洗手间”(蓝色)和“在家”(灰色),我需要在一天中显示所有这些对于每一位 worker 。为此,我使用水平条形堆积图,它看起来像这样:

Before setting the minimum value - x 轴代表小时 (0-24)

令我困扰的是,“在家”占用了很多空间,但我只想查看从 7 点到 18 点的时间。我尝试将刻度分钟设置为 7,但它不起作用,之后就这样了它看起来像这样:

After setting the minimum value to 7

你可以看到图表很困惑,但我不知道为什么。如何才能实现 x 轴从 7 开始,并且数据仍能正确表示?

这是我的代码:

var updateMainChart = function(data) {

    $.ajax({
        type: "GET",
        url: "api/get_activitytracks.php?q=commands",
        success: function(response) {
            response = JSON.parse(response);
            if (response.statusCode == 200) {

                //get activity names
                var activities = $.map(response.data, function(n, i) {
                    return n.title;
                });

                //get max number of activities
                var names = [];
                var max = 0;
                Object.keys(data).forEach(function(key, index) {
                    names.push(key);
                });
                $.each(data, function(key, value) {
                    if (value.length > max) {
                        max = value.length;
                    }
                });

                //build datasets
                var myDataSets = [];
                var colors = [
                    'rgba(0, 255, 0, 0.6)',
                    'rgba(255, 0, 0, 0.6)',
                    'rgba(0, 0, 255, 0.6)',
                    'rgba(255, 127, 80, 0.6)',
                    'rgba(128, 128, 128, 0.8)'
                ];
                for (var i = 0; i < max; i++) {

                    for (var j = 0; j < activities.length; j++) {
                        var obj = {};
                        obj["backgroundColor"] = Array.apply(null, Array(names.length))
                            .map(String.prototype.valueOf, colors[j]);
                        //obj[borderColor] = 'rgba(255,255,255,1)';
                        obj["borderWidth"] = 1;
                        obj["data"] = [];
                        obj["stack"] = "dummy";

                        $.each(data, function(key, value) {
                            if (undefined !== value[i]) {
                                if (value[i]["title"] === activities[j]) {
                                    obj["data"].push(value[i]["duration"]);
                                } else {
                                    obj["data"].push(0);
                                }
                            } else {
                                obj["data"].push(0);
                            }
                        });
                        myDataSets.push(obj);
                    }
                }

                $("#statsChart").show();

                $("#mainChart").html("");
                $("#mainChart").append('<canvas id="statsChart" height="70%"></canvas>');

                var myBarChart = new Chart($("#statsChart"), {
                    type: 'horizontalBar',
                    data: {
                        labels: names,
                        datasets: myDataSets
                    },
                    options: {
                        scales: {
                            xAxes: [{
                                stacked: true,
                                ticks: {
                                    min: 7
                                }
                            }],

                            yAxes: [{
                                stacked: true
                            }]
                        },
                        legend: {
                            display: false
                        },
                        tooltips: {
                            callbacks: {
                                label: function(tooltipItem) {
                                    return tooltipItem.yLabel;
                                }
                            }
                        }
                    }
                });
            }
        }
    });
};

谢谢。

最佳答案

我认为这是当前 Chart.js 版本的一个错误。

作为解决方法,您可以在 xAxes 的刻度处使用回调,如下所示:

options: {
    scales: {
        xAxes: [{
            stacked: true,
            ticks: {
                min: 0,
                callback: function(value, index, values) {
                    return value + 7;
                }
            }
        }],
    ...

有关回调的更多详细信息,请参阅 documentation .

关于charts - x 轴的最小值不适用于水平条形图 |图表JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43427195/

相关文章:

javascript - 需要通过鼠标拖动选择google散点图中点的范围

R绘图条形图正/负值不同颜色第二轴

r - 如何修改 R 中条形图的图例?

java - 如何向 JavaFX 图表添加辅助图例?

javascript - Chart JS Annotations Plugin - 你能创建一个工具提示来伴随注释吗?

chart.js - Chartjs - 具有多级 x 轴的条形图的数据格式

html - 如何对齐 chart.js 饼图?

javascript - Chartjs,创建图表后如何编辑数据选项?

javascript - Chart.js 移除堆叠

javascript - 如何在 Chart.js 中更改标签和值,例如 500,000 到 500k?