리액트 차트를 만들면서 가장 오류/버그 적게 사용한 차트 라이브러리는 react-chartjs-2
react-chartjs-2 의 단점은
공식사이트의 정보가 다소 부족하고 ( 다른 라이브러리도 동일)
화려한 애니메이션이 기본으로 제공되지 않다.
그러나 충분히(많이 찾아보고) 커스텀 가능 하다
react-chartjs-2 라이브러리에선
누적 바 차트 / 라인 차트 가 분리되어 있지만
바 차트 + 라인차트 같이 출력하는 코드를 보고
누적 바 + 라인 차트를 커스텀해 만들어보았다.
출력되는 그래프

toolTip 도 커스텀 해서 출력 하였다
😁 npm install
//기본 설치 npm i chart.js //차트제이에스 2를 사용하기 위한 설치 npm install react-chartjs-2 chart.js //플러그인을 사용하기 위한 설치 npm install chartjs-plugin-datalabels
😁 import
import { Chart as ChartJS } from 'chart.js/auto' //미사용하지만 안적어주면 오류남 import { Bar } from 'react-chartjs-2'; import ChartDataLabels from 'chartjs-plugin-datalabels';
위 라이브러리를 설치하고
임포트를 해주면 출력 준비 끝
(무엇을 설치하고 임포트 해야하는 지 정보가 워낙 부족했다 수백가지 시도를 하여 알아냄;;)
😁 HTML
<div className="chart"> <Bar data={data} options={options} plugins = {data.plugins} /> </div>
바 차트기준으로 출력해준다.
data 에 출력할 데이터 값을넣어주고
option에 그래프의 모양이나 onClick 툴팁 레전드 등 이벤트를 넣어줄수있다.
😁 Script
const data = { plugins: [ChartDataLabels], //플러그인 사용을 위해 연결 labels: labels, //그래프상 날짜 데이터 datasets: [ { label: eventTypeList[0], //라벨명 ex)쓰러짐 data: falldownData, // 날짜 데이터 순서의 value list datalabels: dataFont, //폰트 사이즈 및 색상 backgroundColor:objColor[0],//bar차트의 색상 borderColor: objColor[0], //bar의 테두리 색상 order: 1, //순서 non-important }, //.........생략... 누적 바 차트의 데이터... { label: eventTypeList[6], data: crowdData, datalabels: dataFont, backgroundColor: objColor[6], borderColor: objColor[6], order: 1, }, //누적 bar 차트의 데이터 끝 { label: "전체", //라인차트 데이터 data: total, //날짜 label데이터 순서 출력할 라인 차트의 데이터 리스트 datalabels:{ // 라인차트의 CSS // color: 'white' color: lineColor, backgroundColor : 'white', font:{size:13,weight: 'bold'}, }, lineTension: 0.1, // 각 꼭지점 근처 라인의 border-radius(뾰족하게 할지, 둥글게 할지) 0-1 사이의 숫자 backgroundColor: lineColor, borderColor: lineColor, borderDash: [5, 5], borderWidth : 1, fill: false, pointHoverRadius: 0, pointHoverBorderWidth: 0, type: "line", order: 0, pointRadius : 0, //포인트 스타일 - 포인트 모양의 반지름 0일시, 그려지지않음 }, ], };
const options = { interaction: { mode: 'index', //툴팁 전체 출력 intersect: false, }, maxBarThickness: 15, // bar 타입 막대의 최대 굵기 layout: { padding: { top : 30 } }, plugins: { legend: { position: 'bottom', //레전드 위치 }, title: { display: false, //타이틀 text: "Total", fontSize: 25, }, datalabels: { anchor: 'end', //start , end align: 'top', //top bottom middle 데이터 라벨 표시 위치 formatter: function(value, context) { //데이터 값이 0 이면 출력 안함 if(context.dataset.label !== '전체'){ if(value == 0){ return null; }else{ return value; } }else{ if(value == 0){ return null; }else{ let result = value.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",") return result; } } }, }, tooltip: { // backgroundColor: 'rgba(124, 35, 35, 0.4)', padding: 10, // bodySpacing: 5, //툴팁 내부의 항목 간격 } }, maintainAspectRatio: false, //false : 상위 div에 구속 responsive: true, //false : 정적 true: 동적 scales: { x: { stacked: true, }, y: { stacked: true, // beginAtZero: true }, }, onClick: function(evt, element) { // onClickNot working element null console.log(evt, element); //클릭시 이벤트 추가 가능 } };
차트에 해당 Data 와 Option을 설정해주면 출력가능하다.
옵션이나 데이터에 대한 정보는 주석으로 설명
728x90
반응형
'Front-end > React' 카테고리의 다른 글
[React] 암호화 AES CryptoJS 사용하여 암호화/복호화 하기 (1) | 2022.08.30 |
---|---|
[React] image 마우스 wheel 로 zoom In/Out 하기 (라이브러리 사용) (0) | 2022.08.30 |
[nivo chart] HeatMap chart 리액트 니보 차트 라이브러리 사용법 (0) | 2022.07.04 |
[React] 화폐 단위 , 표시 (0) | 2022.06.03 |
[Chart JS] 도넛 그래프 굵기 변경 _ "react-chartjs-2" (0) | 2022.04.22 |
댓글