[React] Chart.js 사용하기
- Chart.js는 HTML5 캔버스를 기반으로 다양한 차트를 생성할 수 있는 오픈 소스 자바스크립트 라이브러리이다
- 직관적이고 사용하기 쉬운 API를 제공하여 데이터 시각화를 빠르고 간단하게 구현할 수 있다.
- Chart.js 공식문서 ↗️
1. Chart.js 라이브러리 설치
React에서 Chart.js를 사용하려면
react-chartjs-2
패키지도 함께 설치해야 한다.
react-chartjs-2
는 Chart.js를 React 컴포넌트 형태로 사용할 수 있도록 도와주는 라이브러리이다.
yarn add react-chartjs-2 chart.js
2. Line Chart 컴포넌트 구현
원하는 차트를 Chart.js 공식 문서의 Chart Types에서 선정하면 된다.
먼저 Chart.js를 사용하여 가장 기본적인 차트인 라인 차트(Line Chart) 를 만들어 보자.
2.1 필요한 요소 불러오기
먼저 Chart.js에서 필요한 요소들을 불러와야한다.
react-chartjs-2에서 차트 컴포넌트를 사용하기 위해서는, chart.js에서 필요한 모듈들을 별도로 import한 뒤, 이를 register로 등록해야 차트를 정상적으로 렌더링할 수 있다.
// Line 차트 가져오기
import { Line } from "react-chartjs-2";
// 필요한 요소 불러오기
import {
Chart as ChartJS,
Title,
Tooltip,
Legend,
LineElement,
CategoryScale,
LinearScale,
PointElement,
} from "chart.js";
// Chart.js 설정
ChartJS.register(
Title,
Tooltip,
Legend,
LineElement,
CategoryScale,
LinearScale,
PointElement
);
2.2 차트 데이터 설정
차트를 그리기 위한 데이터와 옵션을 설정한다.
데이터는 labels
(x축에 표시될 값)과 datasets
(차트의 데이터를 담고 있는 배열)로 나누어진다.
// 예시 데이터
const labels = ["Red", "Blue", "Yellow"]; // 라벨
const dataValues = [12, 19, 3]; // 데이터 값
// 차트 데이터 객체
export const data = {
labels: labels,
datasets: [
{
data: dataValues,
borderColor: "#F1B0BC",
backgroundColor: ["#F1B0BC", "#97CDBD", "#F5D35D"],
},
],
};
2.3 차트 옵션 설정
options 객체는 차트의 설정을 담고 있다.
툴팁, 레전드, 반응형 디자인 등을 설정할 수 있다.
const options = {
responsive: true,
plugins: {
legend: {
position: "top" as const,
},
tooltip: {
enabled: true,
},
},
};
2.4 차트 컴포넌트 렌더링
리액트에서는 컴포넌트로 차트를 그릴 수 있다.
- 이제 Line 컴포넌트를 사용하여 위에서 설정한 데이터와 옵션을 기반으로 차트를 렌더링해보자.
- Line 외에 Bar, Bubble 등 차트 종류 별로 컴포넌트를 react-chartjs-2에서 import 하여 사용할 수 있다.
const LineChart = () => {
return <Line data={data} options={options} />;
};
export default LineChart;
2.5 전체 코드
// (1) 필요한 요소 불러오기
// Line 차트 가져오기
import { Line } from "react-chartjs-2";
// 필요한 요소 불러오기
import {
Chart as ChartJS,
Title,
Tooltip,
Legend,
LineElement,
CategoryScale,
LinearScale,
PointElement,
} from "chart.js";
// Chart.js 설정
ChartJS.register(
Title,
Tooltip,
Legend,
LineElement,
CategoryScale,
LinearScale,
PointElement
);
// (2) 차트 데이터 설정
// 예시 데이터
const labels = ["Red", "Blue", "Yellow"]; // 라벨
const dataValues = [12, 19, 3]; // 데이터 값
// 차트 데이터 객체
export const data = {
labels: labels,
datasets: [
{
label: "Sample Dataset", // 데이터셋 레이블
data: dataValues,
borderColor: "#F1B0BC",
backgroundColor: ["#F1B0BC", "#97CDBD", "#F5D35D"],
tension: 0.1, // 선의 곡선 정도
},
],
};
// (3) 차트 옵션 설정
const options = {
responsive: true,
plugins: {
legend: {
position: "top" as const,
},
tooltip: {
enabled: true,
},
},
};
// (4) 차트 컴포넌트 렌더링
const LineChart: React.FC = () => {
return <Line data={data} options={options} />;
};
export default LineChart;
3. Chart.js Options
차트 컴포넌트의 options 속성을 활용하면, dataset 객체에서 설정하는 것 외에도 다양한 방법으로 차트를 커스터마이징할 수 있다.
여기↗️서 다양한 옵션을 확인할 수 있다.
3.1 interaction
interaction 설정은 차트와 사용자의 상호작용 방식을 정의한다. 사용자가 마우스나 터치로 차트에 접근했을 때, 데이터를 어떻게 강조할지 제어할 수 있다.
- mode: 상호작용의 모드를 설정 (“index”, “dataset”, “point” 등)
- intersect: 데이터 포인트에 정확히 교차해야만 상호작용이 활성화되는지 여부를 설정
interaction: {
mode: "index" as const, // 마우스 위치와 관련된 모든 데이터셋을 강조
intersect: false, // 데이터 포인트를 직접 클릭하지 않아도 동작
},
3.2 scales
scales 옵션은 차트의 축을 커스터마이징하는 데 사용된다. 이를 통해 축의 범위, 스타일, 제목 등을 제어할 수 있다.
- type: 축의 유형을 설정 (“linear”, “logarithmic”, “category”, 등)
- title: 축 제목을 설정
- ticks: 축 눈금을 설정
scales: {
x: {
type: "category", // X축의 유형을 카테고리로 설정
title: {
display: true,
text: "Categories", // X축 제목
},
},
y: {
type: "linear", // Y축의 유형을 선형으로 설정
min: 0, // 최소값
max: 100, // 최대값
ticks: {
stepSize: 20, // 눈금 간격
},
},
},
3.3 animation
animation 옵션은 차트가 렌더링될 때의 애니메이션 효과를 정의한다. 이를 통해 차트가 그려질 때의 전환 효과를 제어할 수 있다.
- duration: 애니메이션의 지속 시간(밀리초)
- easing: 애니메이션의 진행 방식 (“easeOutBounce”, “linear”, 등)
animation: {
duration: 1000, // 1초 동안 애니메이션
easing: "easeOutBounce", // 느리게 시작하고 끝에서 튀는 효과
},
3.4 반응형 디자인
Chart.js는 기본적으로 반응형 디자인을 지원하며, 화면 크기에 따라 자동으로 크기를 조정한다. responsive 옵션을 통해 이를 제어할 수 있다.
- responsive: 차트를 반응형으로 설정 (기본값: true)
- maintainAspectRatio: 반응형일 때, 원래 비율을 유지할지 설정 (true/false)
responsive: true,
maintainAspectRatio: false, // 원래 비율을 무시하고 부모 컨테이너에 맞춤
4. Chart.js 예시
4.1 BarChart
// components/BarChart.tsx
import React from "react";
import {
Chart as ChartJS,
CategoryScale,
LinearScale,
BarElement,
Title,
Tooltip,
Legend,
} from "chart.js";
import { Bar } from "react-chartjs-2";
ChartJS.register(
CategoryScale,
LinearScale,
BarElement,
Title,
Tooltip,
Legend
);
export const options = {
responsive: true,
plugins: {
legend: {
position: "top" as const,
},
title: {
display: true,
text: "Sample Bar Chart",
},
},
};
const labels = ["January", "February", "March", "April", "May", "June", "July"];
export const data = {
labels,
datasets: [
{
label: "Dataset 1",
data: labels.map(() => Math.floor(Math.random() * 1000)),
backgroundColor: "rgba(75, 192, 192, 0.2)",
borderColor: "rgba(75, 192, 192, 1)",
borderWidth: 1,
},
],
};
const BarChart: React.FC = () => {
return <Bar options={options} data={data} />;
};
export default BarChart;
4.2 DoughnutChart
// components/DoughnutChart.tsx
import { Chart as ChartJS, ArcElement, Tooltip, Legend } from "chart.js";
import { Doughnut } from "react-chartjs-2";
// Chart.js 모듈 등록
ChartJS.register(ArcElement, Tooltip, Legend);
// 데이터와 설정
export const data = {
labels: ["Red", "Yellow", "Blue"],
datasets: [
{
data: [10, 20, 30],
backgroundColor: ["#FF6384", "#FFCE56", "#36A2EB"],
hoverBackgroundColor: ["#FF6384", "#FFCE56", "#36A2EB"],
},
],
};
export const options = {
responsive: true,
plugins: {
legend: {
position: "top" as const,
},
tooltip: {
enabled: true,
},
},
};
// DoughnutChart 컴포넌트
const DoughnutChart: React.FC = () => {
return <Doughnut data={data} options={options} />;
};
export default DoughnutChart;
5. Next.js 페이지에서 컴포넌트 사용
Next.js는 기본적으로 서버 사이드 렌더링(SSR)을 지원하지만, Chart.js는 DOM 요소에 의존하므로 SSR 환경에서는 오류가 발생할 수 있다.
이를 해결하려면 Next.js의 dynamic import를 사용하여 SSR을 비활성화해야한다.
import dynamic from "next/dynamic";
// Dynamic import로 SSR 비활성화
const BarChart = dynamic(() => import("../components/BarChart"), {
ssr: false,
});
const Home: React.FC = () => {
return (
<div>
<h1>Chart.js with Next.js</h1>
<BarChart />
</div>
);
};
export default Home;
6. 데이터 동적 로딩
API에서 데이터를 가져와 차트에 렌더링하려면 React의 useState와 useEffect를 사용하면 된다.
import React, { useState, useEffect } from "react";
import { Bar } from "react-chartjs-2";
import { options } from "./chartConfig";
const BarChart: React.FC = () => {
const [data, setData] = useState<any>(null);
useEffect(() => {
// API 호출 예시
fetch("/api/chart-data")
.then((response) => response.json())
.then((data) => {
setData({
labels: data.labels,
datasets: data.datasets,
});
});
}, []);
if (!data) return <p>Loading...</p>;
return <Bar options={options} data={data} />;
};
export default BarChart;
댓글남기기