프로그래밍/Chart JS
Chart.js 데이터 추가/ 데이터 삭제/ 데이터셋 추가/ 데이터셋 삭제 / 데이터 변경
밍구몬
2019. 7. 30. 14:15
우선 Chart를 조작 하기 위하여 차트를 그려준다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>chart.js</title>
<head>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js"></script>
</head>
<body>
<div class="chart-container" style="position: relative; height:200px; width:60vw">
<canvas id="myChart"></canvas>
</div>
<button type="button" id="reData">데이터 변경</button>
<button type="button" id="addData">데이터 추가</button>
<button type="button" id="addDataSet">데이터셋 추가</button>
<button type="button" id="delData">데이터 삭제</button>
<button type="button" id="addDataSet">데이터셋 삭제</button>
<script>
var ctx = document.getElementById('myChart');
var config = {
type: 'line',
data: {
labels: [ // Date Objects
'data1',
'data2',
'data3',
'data4',
'data5',
'data6',
'data7'
],
datasets: [{
label: 'My First dataset',
backgroundColor: 'rgba(75, 192, 192, 1)',
borderColor: 'rgba(75, 192, 192, 1)',
fill: false,
data: [
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50)
],
}, {
label: 'My Second dataset',
backgroundColor: 'rgba(255, 99, 132, 1)',
borderColor: 'rgba(255, 99, 132, 1)',
fill: false,
data: [
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50)
],
}]
},
options: {
maintainAspectRatio: false,
title: {
text: 'Chart.js Time Scale'
},
scales: {
yAxes: [{
scaleLabel: {
display: true,
labelString: '차트'
}
}]
},
}
};
//차트 그리기
var myChart = new Chart(ctx, config);
</script>
데이터 변경
//데이터 변경
document.getElementById('reData').onclick = function(){
//데이터셋 수 만큼 반복
var dataset = config.data.datasets;
for(var i=0; i<dataset.length; i++){
console.log(dataset);
//데이터 갯수 만큼 반복
var data = dataset[i].data;
for(var j=0 ; j < data.length ; j++){
data[j] = Math.floor(Math.random() * 50);
}
}
myChart.update(); //차트 업데이트
}
reData버튼에 클릭 이벤트를 작성하였다.
버튼이 클릭 되었을 때 데이터셋의 데이터 수 만큼 for문을 반복하여 값을 변경해 주었다.
값을 변경해 준 뒤에는 반영이 되도록 반드시 update를 해주어야 한다.
데이터 추가
//데이터 추가
document.getElementById('addData').onclick = function(){
//라벨추가
config.data.labels.push('data'+config.data.labels.length)
//데이터셋 수 만큼 반복
var dataset = config.data.datasets;
for(var i=0; i<dataset.length; i++){
//데이터셋의 데이터 추가
dataset[i].data.push(Math.floor(Math.random() * 50));
}
myChart.update(); //차트 업데이트
}
데이터를 추가하기 위해서는 라벨도 같이 추가해 주어야 한다.
라벨을 push하고 데이터셋마다 데이터를 한개씩 추가해 주었다.
데이터셋 추가
//데이터셋 추가
document.getElementById('addDataSet').onclick = function(){
var color1 = Math.floor(Math.random() * 256);
var color2 = Math.floor(Math.random() * 256);
var color3 = Math.floor(Math.random() * 256);
console.log(color1 + " " + color2 + " " + color3)
var newDataset = {
label: 'new Dataset'+config.data.datasets.length,
borderColor : 'rgba('+color1+', '+color2+', '+color3+', 1)',
backgroundColor : 'rgba('+color1+', '+color2+', '+color3+', 1)',
data: [],
fill: false
}
// newDataset에 데이터 삽입
for (var i=0; i< config.data.labels.length; i++){
var num = Math.floor(Math.random() * 50);
newDataset.data.push(num);
}
// chart에 newDataset 푸쉬
config.data.datasets.push(newDataset);
myChart.update(); //차트 업데이트
}
데이터셋은 config에 있는 데이터셋처럼 하나 더 만들어 chart에 넣어주고 업데이트를 해주면 된다.
데이터 삭제
//데이터 삭제
document.getElementById('delData').onclick = function(){
config.data.labels.splice(-1,1);//라벨 삭제
//데이터 삭제
config.data.datasets.forEach(function(dataset) {
dataset.data.pop();
});
myChart.update(); //차트 업데이트
}
데이터셋의 데이터를 하나씩 지우기 때문에 라벨도 같이 지워 주었다.
데이터셋 삭제
//데이터셋 삭제
document.getElementById('delDataset').onclick = function(){
config.data.datasets.splice(-1,1);
myChart.update(); //차트 업데이트
}
데이터셋은 splice를 이용하여 지웠다.
첫 번째 파라미터에 -1을 넣게 되면 마지막 데이터가 선택 된다.
전체 소스
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>chart.js</title>
<head>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js"></script>
</head>
<body>
<div class="chart-container" style="position: relative; height:200px; width:60vw">
<canvas id="myChart"></canvas>
</div>
<button type="button" id="reData">데이터 변경</button>
<button type="button" id="addData">데이터 추가</button>
<button type="button" id="addDataSet">데이터셋 추가</button>
<button type="button" id="delData">데이터 삭제</button>
<button type="button" id="delDataset">데이터셋 삭제</button>
<script>
var ctx = document.getElementById('myChart');
var config = {
type: 'line',
data: {
labels: [ // Date Objects
'data1',
'data2',
'data3',
'data4',
'data5',
'data6',
'data7'
],
datasets: [{
label: 'My First dataset',
backgroundColor: 'rgba(75, 192, 192, 1)',
borderColor: 'rgba(75, 192, 192, 1)',
fill: false,
data: [
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50)
],
}, {
label: 'My Second dataset',
backgroundColor: 'rgba(255, 99, 132, 1)',
borderColor: 'rgba(255, 99, 132, 1)',
fill: false,
data: [
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50),
Math.floor(Math.random() * 50)
],
}]
},
options: {
maintainAspectRatio: false,
title: {
text: 'Chart.js Time Scale'
},
scales: {
yAxes: [{
scaleLabel: {
display: true,
labelString: '차트'
}
}]
},
}
};
//차트 그리기
var myChart = new Chart(ctx, config);
//데이터 변경
document.getElementById('reData').onclick = function(){
//데이터셋 수 만큼 반복
var dataset = config.data.datasets;
for(var i=0; i<dataset.length; i++){
console.log(dataset);
//데이터 갯수 만큼 반복
var data = dataset[i].data;
for(var j=0 ; j < data.length ; j++){
data[j] = Math.floor(Math.random() * 50);
}
}
myChart.update(); //차트 업데이트
}
//데이터 추가
document.getElementById('addData').onclick = function(){
//라벨추가
config.data.labels.push('data'+config.data.labels.length)
//데이터셋 수 만큼 반복
var dataset = config.data.datasets;
for(var i=0; i<dataset.length; i++){
//데이터셋의 데이터 추가
dataset[i].data.push(Math.floor(Math.random() * 50));
}
myChart.update(); //차트 업데이트
}
//데이터셋 추가
document.getElementById('addDataSet').onclick = function(){
var color1 = Math.floor(Math.random() * 256);
var color2 = Math.floor(Math.random() * 256);
var color3 = Math.floor(Math.random() * 256);
console.log(color1 + " " + color2 + " " + color3)
var newDataset = {
label: 'new Dataset'+config.data.datasets.length,
borderColor : 'rgba('+color1+', '+color2+', '+color3+', 1)',
backgroundColor : 'rgba('+color1+', '+color2+', '+color3+', 1)',
data: [],
fill: false
}
// newDataset에 데이터 삽입
for (var i=0; i< config.data.labels.length; i++){
var num = Math.floor(Math.random() * 50);
newDataset.data.push(num);
}
// chart에 newDataset 푸쉬
config.data.datasets.push(newDataset);
myChart.update(); //차트 업데이트
}
//데이터 삭제
document.getElementById('delData').onclick = function(){
config.data.labels.splice(-1,1);//라벨 삭제
//데이터 삭제
config.data.datasets.forEach(function(dataset) {
dataset.data.pop();
});
myChart.update(); //차트 업데이트
}
//데이터셋 삭제
document.getElementById('delDataset').onclick = function(){
config.data.datasets.splice(-1,1);
myChart.update(); //차트 업데이트
}
</script>
</body>