ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스터디기록05/티코드(React)] Chart.js 라이브러리의 리액트 ver. - react-chartjs-2 라이브러리
    조각조각/티코드 스터디(React) 2024. 4. 10. 19:50
    💬 오늘은 언젠가 한 번쯤은 사용할 차트 라이브러리에 대해 실습했다. 사용법만 제대로 익혀두면 사용하기 좋은 라이브러리라는 생각이 들었다. 실습하면서 차트의 항목 이름을 보여주고 싶어 삽질을 좀 했는데, 이 과정에 대한 기록을 남겨본다.

     

    📑 Chart.js 라이브러리란?

    데이터를 시각화할 때 차트를 사용할 일이 많은데, 차트 라이브러리를 사용하여 이를 쉽게 구현할 수 있다. 오늘 우리는 많은 차트 라이브러리 중에서도 유명한 Chart.js의 리액트 버전인 react-chartjs-2 라이브러리를 사용해보고자 하였다.

     

    https://react-chartjs-2.js.org/

     

    react-chartjs-2 | react-chartjs-2

    React components for Chart.js

    react-chartjs-2.js.org

     

    📑 라이브러리 사용 방법

    1) 라이브러리 설치

    npm install --save chart.js react-chartjs-2

     

    2) 기본 사용 방법

    import { Chart as ChartJS, ArcElement, Tooltip, Legend } from "chart.js";
    import { Doughnut } from "react-chartjs-2";
    
    ChartJS.register(ArcElement, Tooltip, Legend);
    
    <Doughnut data={...} />
    • Chart.js 라이브러리에서 기본 Chart 객체를 가져온다. (ChartJS라고 이름을 바꿔주었다.)
      • 그 외에도 활용하고자 하는 모듈을 함께 가져올 수 있다.
    • 차트의 종류도 여러 가지가 있는데, 원하는 차트 종류의 컴포넌트를 react-chartjs-2 라이브러리에서 가져와 사용할 수 있다. 사용에 대한 예제는 공식문서에 코드 샌드 박스를 통해 친절히 예제까지 내장되어 있으니 확인하면 쉽게 적용이 가능하다. (링크)

    📑 적용 예제

    사용법은 생각보다 간단하다.

    옵션으로 사용할 모듈과 원하는 형태의 컴포넌트를 받아와서 각 속성에 데이터를 할당해 주면 된다.

    차트에 사용될 각 항목의 라벨명을 배열로 만들어 labels 변수에 할당해 주고, Doughnut 컴포넌트에 prop으로 전달해 줄 data 객체를 지정해 주자. (해당 예제에서는 chart 라이브러리를 적용한 컴포넌트 부분 코드만 첨부합니다.)

    import { Chart as ChartJS, ArcElement, Tooltip } from "chart.js";
    import { Doughnut } from "react-chartjs-2";
    
    ChartJS.register(ArcElement, Tooltip);
    
    // 차트에 사용될 각 항목 라벨명
    const labels = ["짜장면", "치킨", "곱창", "피자", "족발", "한강라면"];
    
    export const data = {
      labels,
      datasets: [
        {
          // 툴팁에 표시 될 라벨
          label: "지금 가장 먹고 싶은 음식",
          // 각 항목에 대한 데이터
          data: [10, 80, 30, 20, 70, 60],
          // 각 항목별 컬러
          backgroundColor: [
            "rgba(255, 99, 132, 0.2)",
            "rgba(54, 162, 235, 0.2)",
            "rgba(255, 206, 86, 0.2)",
            "rgba(75, 192, 192, 0.2)",
            "rgba(153, 102, 255, 0.2)",
            "rgba(255, 159, 64, 0.2)",
          ],
          // 테두리 컬러
          borderColor: ["gray", "darkgray"],
          borderWidth: 0.5,
        },
      ],
    };
    
    // 컴포넌트를 정의하고, react-chartjs-2 차트에서 가져온 Doughnut 컴포넌트에 data 전달
    export const DoughnutChart = () => {
      return <Doughnut data={data} />;
    };

     

    이렇게 지정을 해주면 아래와 같은 형태의 차트가 그려진다.

     

    👀 각 데이터 항목의 라벨 보여주기

    여기서 나는 원형 차트의 각 항목에 대한 이름을 보여주고 싶었다. 열심히 공식 문서와 구글링, 챗 gpt를 사용하여 찾아본 결과 react-chartjs-2 자체에서는 해당 기능을 제공하지 않고, 플러그인으로 따로 라벨 기능을 제공해 준다는 사실을 확인했다. chartjs-plugin-datalabels라는 플러그인인데 공식문서가 잘 되어 있어서 필요한 경우 예제를 참고해 보며 적용해 보는 것을 추천한다.

    https://chartjs-plugin-datalabels.netlify.app/

     

    chartjs-plugin-datalabels

     

    chartjs-plugin-datalabels.netlify.app

     

    1) chartjs-plugin-datalabels 라이브러리 설치

    npm install chartjs-plugin-datalabels --save

     

    2) 초기 세팅 및 options 추가해주기

    import ChartDataLabels from "chartjs-plugin-datalabels";
    
    ChartJS.register(ArcElement, Tooltip, ChartDataLabels);
    
    export const options = {
      plugins: [ChartDataLabels],
    };
    
    // ...
    export const DoughnutChart = () => {
      return <Doughnut options={options} data={data} />;
    };
    • 패키지를 설정하면 차트를 사용하고 있는 모든 페이지에 기본값으로 value값을 보여주는 것 같았다. 설정하지 않은 다른 차트에도 모두 라벨이 적용되었기 때문인데, 이 설정은 추후 display의 값을 false로 설정해 주면 원하는 대로 조정이 가능하다.

    3) 항목명 + 비율 표시하기

    2번을 완료했다면, 이제 기존 data 객체에 datalabels 속성을 추가해 준다. 각 항목에 대한 데이터는 formatter 함수를 통해 현재 data에 할당된 value값과 해당 data와 연결된 labels의 값을 받아올 수 있는 context 정보를 매개변수로 받아올 수 있다. 차트에 표시해주고자 하는 항목명은 labels에 담겨 있으므로 context의 dataIndex로 data의 배열 인덱스를 받아와서 해당 인덱스를 labels 배열의 인덱스로 넣어주면 원하는 데이터를 텍스트로 받아올 수 있다.

    • e.g. index 0 : "짜장면", index 1 : "치킨"...
    // 상단 코드 생략
    export const data = {
      labels,
      datasets: [
        {
          // ...
          // 각 항목에 대한 데이터
          data: [10, 80, 30, 20, 70, 60],
          datalabels: {
            display: true, // datalabels 표시 유무
            align: "center", // labels 위치
            font: { size: 14 },
            // value는 default(%값)
            formatter: function (value, context) {
              let idx = context.dataIndex;
              return `${context.chart.data.labels[idx]}\n ${value}%`;
            },
          },
        },
      ],
    };

    🙌 최종 완성 화면

     

     

    📚 배운 점

    새로운 걸 처음 접할 때는 뭐든 익숙하지 않아서 힘든 것 같다. 그래도 계속 보다 보면 조금은 눈에 익는 게 신기하다.

    오늘은 얻고자 하는 결과가 있다 보니 공식문서와 구글링을 계속하면서 실습 코드 외의 코드들을 확인하면서 사용해 봤다는 점에 즐거움을 느낀 하루였다. 그리고 공식문서에 진짜 답이 있다. 영어를 두려워하지 말자.


    참고

    [공식문서] chartjs-plugin-datalabels - Custom Labels(링크)

     

    💬 본 포스팅은 공부 기록용으로 정확하지 않은 정보가 존재할 수 있습니다. 발견하신다면 알려주세요!

Designed by Tistory.