chart.js - 如何在 chartjs 中排序、插入和更新完整数据集?

标签 chart.js

我有几个简单的更新方法无法解决的 chartjs 问题。

我想知道是否可以选择:

  1. 轻松地对数据集进行排序;
  2. 在两点之间插入一些数据;
  3. 重新加载整个图表而不用替换 Canvas 全新的图表?

最佳答案

没有内置选项,但使用 Chart.js 提供的 addDataremoveData 方法编写您自己的选项非常容易。

var MyBarChartMethods = {
    // sort a dataset
    sort: function (chart, datasetIndex) {
        var data = []
        chart.datasets.forEach(function (dataset, i) {
            dataset.bars.forEach(function (bar, j) {
                if (i === 0) {
                    data.push({
                        label: chart.scale.xLabels[j],
                        values: [bar.value]
                    })
                } else 
                    data[j].values.push(bar.value)
            });
        })

        data.sort(function (a, b) {
            if (a.values[datasetIndex] > b.values[datasetIndex])
                return -1;
            else if (a.values[datasetIndex] < b.values[datasetIndex])
                return 1;
            else
                return 0;
        })

        chart.datasets.forEach(function (dataset, i) {
            dataset.bars.forEach(function (bar, j) {
                if (i === 0)
                    chart.scale.xLabels[j] = data[j].label;
                bar.label = data[j].label;
                bar.value = data[j].values[i];
            })
        });
        chart.update();
    },
    // reload data
    reload: function (chart, datasetIndex, labels, values) {
        var diff = chart.datasets[datasetIndex].bars.length - values.length;
        if (diff < 0) {
            for (var i = 0; i < -diff; i++)
                chart.addData([0], "");
        } else if (diff > 0) {
            for (var i = 0; i < diff; i++)
                chart.removeData();
        }

        chart.datasets[datasetIndex].bars.forEach(function (bar, i) {
            chart.scale.xLabels[i] = labels[i];
            bar.value = values[i];
        })
        chart.update();
    }
}

你这样调用它(myBarChart 是你的图表)

// sort
MyBarChartMethods.sort(myBarChart, 0)
// reload - same number of values
MyBarChartMethods.reload(myBarChart, 0, ["J", "F", "M", "A", "M", "J", "J"], [1, 2, 3, 4, 5, 6, 7])
// reload - more values
MyBarChartMethods.reload(myBarChart, 0, ["J", "F", "M", "A", "M", "J", "J", "A"], [1, 2, 3, 4, 5, 6, 7, 8])
// reload - less values
MyBarChartMethods.reload(myBarChart, 0, ["J", "F", "M", "A", "M"], [1, 2, 3, 4, 5])

插入 2 个点是 reload 的特例,所以你可以使用相同的函数(或者很容易地根据它编写你自己的函数)


fiddle - http://jsfiddle.net/Lkdxxkfa/

关于chart.js - 如何在 chartjs 中排序、插入和更新完整数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31399991/

相关文章:

asp.net - 从 VB.NET 配置 ChartJS

node.js - 从node js获取String数组到ejs

javascript - 您可以使用 Chart.js 在折线图中绘制区域吗?

javascript - 两条线之间的填充区域 - Chart.js v2

javascript - 添加值后 ChartJS 图表不缩放

javascript - 想要在同一页面上使用不同数据的多个图表

javascript - chart.js donut 逆时针动画

javascript - 仅第一个添加值显示在 ng2-chart 折线图中

angular - Chart.js v2 图表不显示在 Angular 2 内(但 Chart.js v1 完美运行)

javascript - chartjs 在折线图中显示 24 小时