首先,让变量记住图表的一个实例。
let yourChart = new Chart(ctxBar, {
type: 'bar',
data: {
labels: labels,
datasets: datasets
},
});
其次,我最苦恼的事情是在更新图表之前以正确的格式获取数据结构。所以看了图表js对象的data键结构后:
data: {
labels: ['Jan', 'Feb'],
datasets: [{
label: 'Net sales',
data: data
}, {
label: 'Cost of goods sold',
data: data
}, {
label: 'Gross margin',
data: data
}]
}
请注意,data 键值是一个由两个键组成的对象,labels 和 datasets。 labelskey'的值是一个数组,而datasetskey'的值也是一个以对象为值的数组。
因此,我使用的图表实例中的remove 标签和数据集:
yourChart.data.labels = [];
yourChart.data.datasets = [{}];
yourChart.update();
到add 标签和数据集到我使用的图表实例:
yourChart.data.labels = ['label 1', 'label 2'];
yourChart.data.datasets = [{
label: 'column lables',
data: [450, 50],
backgroundColor: ["#dc3545", "#ffb759"]
}];
yourChart.update();
准备服务器端
标签和数据集值可以在服务器端按如下方式准备(在我的情况下为 php):
$datajs = function ($data, $bg_colour) // function emulating chart js datasets key value structure
{
return [
'data' => $data,
'backgroundColor' => $bg_colour
];
};
$datasets = [];
$labels = ['label 1', 'label 2'];
$datasets[] = $datajs([42,10], ["#dc3545", "#ffb759"]);
$datasets[] = $datajs([100,5], ["#dc3545", "#ffb759"]);
仅从数据集中的数据键值替换数据(我没有测试过)
yourChart.data.datasets.forEach((dataset) => {
dataset.data = [];
});
yourChart.update();
// if you have an array of arrays
let array = [[42,20],[58,68],[78,1]];
let length = yourChart.data.datasets.length;
for (let i = 0; i < array.length; i++) {
const element = array[i];
if (i < length) {
yourChart.data.datasets[i].data = element;
} else {
yourChart.data.datasets[] = {data: element};
}
}
yourChart.update();