如何在 chartjs 中排序、插入和更新完整数据集?
How can I sort, insert in between and update full dataset in chartjs?
我有一些关于 chartjs 的问题,简单的更新方法无法解决。
我想知道是否可以选择:
- 轻松地对数据集进行排序;
- 在两点之间插入一些数据;
- 重新加载整个图表而不用替换 canvas
全新图表?
没有内置选项,但使用 Chart.js 提供的 addData
、removeData
方法编写自己的选项非常容易。
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/
我带着同样的问题来到 Whosebug,所以我创建了一个插件,允许您向 ChartJS 添加排序功能
https://github.com/scotthsieh0503/chartjs-plugin-sort
它还允许你传入一个'pre-sorted'数组作为排序的参考
我有一些关于 chartjs 的问题,简单的更新方法无法解决。
我想知道是否可以选择:
- 轻松地对数据集进行排序;
- 在两点之间插入一些数据;
- 重新加载整个图表而不用替换 canvas 全新图表?
没有内置选项,但使用 Chart.js 提供的 addData
、removeData
方法编写自己的选项非常容易。
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/
我带着同样的问题来到 Whosebug,所以我创建了一个插件,允许您向 ChartJS 添加排序功能
https://github.com/scotthsieh0503/chartjs-plugin-sort
它还允许你传入一个'pre-sorted'数组作为排序的参考