본문 바로가기
JavaScript

[ JavaScript ] Chart.js 라이브러리 사용해서 막대 그래프 그리기

by teamnova 2022. 12. 17.
728x90

안녕하세요 오늘은 Chart.js 라이브러리를 사용해서 막대 그래프를 그려보겠습니다.

 

Chart.js 는 자바스크립트 차트 라이브러리 중 하나로, d3.js, highcharts 등과 함께 인기있는 라이브러리 중 하나입니다.

 

설치 방법:

- CDN 사용

<script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>

- npm

npm i chart.js

 

 

먼저 차트에 표시할 데이터를 준비하겠습니다.

공공데이터포털의 '부산광역시_하수처리시설 월별 평균 수질현황 서비스' 오픈API 데이터를 활용하겠습니다.

 

Fetch API 를 사용해서 http 요청을 보내겠습니다.

const serviceKey = "발급받은_본인의_인증키"
const url = `http://apis.data.go.kr/6260000/BusanTblSwgqtyStusService/getTblSwgqtyStusInfo?ServiceKey=${serviceKey}&pageNo=1&numOfRows=1&resultType=json`;

function getData(){
    const response = fetch(url); // 데이터 받아오기
    return response.then(res => res.json());
}

async function exec(){
    try {
        const json = await getData();
        console.log(json);
    }
    catch(error){
        console.log(error);
    }
}

exec();

 

응답 결과는 다음과 같습니다.

{
    "getTblSwgqtyStusInfo": {
        "header": {
            "resultCode": "00",
            "resultMsg": "NORMAL_CODE"
        },
        "body": {
            "items": {
                "item": [
                    {
                        "gubun": "위생처리장",
                        "category": "COD유입",
                        "swYear": "2020",
                        "swAverage": "1490.8",
                        "jan": "1771.6",
                        "feb": "1606.3",
                        "mar": "1643.9",
                        "apr": "1772.8",
                        "may": "1674.3",
                        "jun": "1620.9",
                        "jul": "1113.6",
                        "aug": "1300",
                        "sept": "1343.1",
                        "oct": "1356.9",
                        "nov": "1388.7",
                        "decem": "1367.6",
                        "swSum": ""
                    }
                ]
            },
            "numOfRows": 1,
            "pageNo": 1,
            "totalCount": 1699
        }
    }
}

 

 

위의 결과에서 필요한 데이터만 뽑아내서 data 라는 변수에 저장합니다. 그 데이터를 사용해서 Chart.js 라이브러리로 차트를 그립니다.

 

전체 코드는 다음과 같습니다.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Chart.js 막대 그래프</title>
        <script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
        <style>
            * {
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }
            div {
                width: 800px;
                height: 500px;
            }
        </style>
    </head>
    <body>
        <div>
            <canvas id="myChart" width="800" height="500"></canvas>
        </div>

        <script>
            const serviceKey = "발급받은_본인의_인증키"
            const url = `http://apis.data.go.kr/6260000/BusanTblSwgqtyStusService/getTblSwgqtyStusInfo?ServiceKey=${serviceKey}&pageNo=1&numOfRows=1&resultType=json`;

            function getData(){
                const response = fetch(url); // 데이터 받아오기
                return response.then(res => res.json());
            }

            async function exec(){
                try {
                    const json = await getData();
                    const data = json.getTblSwgqtyStusInfo.body.items.item[0];
                    console.log(data);

                    const ctx = document.getElementById('myChart').getContext('2d'); // 차트
                    // 차트 설정 옵션
                    const config = {
                        type: 'bar', // 바 그래프
                        data: {
                            labels: ['01월', '02월', '03월', '04월', '05월', '06월', '07월', '08월', '09월', '10월', '11월', '12월'],
                            datasets: [{
                                label: data.gubun + " " + data.category + " " + data.swYear + "년 데이터", // 차트 상단의 차트제목
                                data: [data.jan, data.feb, data.mar, data.apr, data.may, data.jun, data.jul, data.aug, data.sept, data.oct, data.nov, data.decem], // 각각의 바 그래프 수치
                                backgroundColor: 'rgba(54, 162, 235, 0.2)', // 바 배경색
                                borderColor: 'rgba(54, 162, 235, 1)', // 바 테두리 색
                                borderWidth: 1, // 바 테두리 두께
                            }]
                        },
                        options: {
                            scales: {
                                // x축
                                x: {
                                    ticks: {
                                        font: {
                                            size: 18,
                                        },
                                        color: "blue"
                                    }
                                },
                                // y축
                                y: {
                                    beginAtZero: false, // y축 시작을 0부터 할 것인지
                                    ticks: {
                                        font: {
                                            size: 18,
                                        },
                                        color: "red"
                                    }
                                },
                            },
                            plugins: {
                            	// 툴팁 (바 그래프에 마우스를 올리면 나타나는 것)
                                tooltip: {
                                    callbacks: {
                                        label: function(context) {
                                            let label = context.dataset.label || '';
                    
                                            if (label) {
                                                label = 'COD유입:'; // 이렇게 따로 설정하지 않았을 경우 "위생처리장 COD유입 2020년 데이터" 라고 길게 나와서 커스텀함
                                            }
                                            if (context.parsed.y !== null) {
                                                label += context.parsed.y.toString();
                                            }
                                            return label;
                                        }
                                    }
                                },
                                // 범례
                                legend: {
                                    labels: {
                                        font: {
                                            size: 20
                                        },
                                        color: "green"
                                    }
                                }
                            }
                        }
                    }
                    const myChart = new Chart(ctx, config);
                }
                catch(error){
                    console.log(error);
                }
            }
              
            exec();


        </script>

    </body>
</html>

 

구현된 차트는 다음과 같습니다.