글 작성자: 망고좋아
반응형

🎯 Recharts 사용하기

  • 프로젝트에서 데이터 시각화하는 부분을 마크업 하게 되었다.
  • 아래 링크에서 사람들이 많이 사용하는 차트 라이브러리 리스트를 보면서 장/단점을 검색한 후 심플하고 사용법이 간단한 Recharts를 사용하기로 결정했다.
 

10 Best React Chart Libraries in 2022 | Openbase

A comparison of the 10 Best React Chart Libraries in 2022: react-flexmonster, react-horizontal-bar-chart, frappe-gantt-react, zingchart-react, react-bpmn and more

openbase.com

 

📝 Recharts 설치

npm install recharts

 

📝 Recharts 사용 방법

📕 원하는 차트를 Examples에서 고른다.

 

📕 Examples 코드 복사

  • 원하는 차트를 클릭하고 Try the demo in codesandbox >>] 클릭해서 코드를 복붙 해온다.

 

📕 각자 알맞게 커스텀하기

 

📝 SimpleLineChart 커스텀하기

🛠 index.js

import React from "react";
import * as LineGraphs from "./style";
import {
LineChart,
Line,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
} from "recharts";
LineGraph.defaultProps = {
commitData: [
{
name: "2020",
commit: 200,
},
{
name: "2021",
commit: 15,
},
{
name: "2022",
commit: 704,
},
],
};
export function LineGraph({ graphTitle, commitData }) {
return (
<LineGraphs.Container>
<LineGraphs.Title>{graphTitle} 커밋 추이</LineGraphs.Title>
<LineGraphs.Wrapper>
{commitData && (
<LineChart width={350} height={280} data={commitData}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="name" />
<YAxis />
<Tooltip />
<Line
type="monotone"
dataKey="commit"
stroke="#6ABD8C"
activeDot={{ r: 2 }}
isAnimationActive={false}
/>
</LineChart>
)}
</LineGraphs.Wrapper>
</LineGraphs.Container>
);
}
  • https://recharts.org/en-US/api/LineChart 들어가서 알맞게 커스텀을 진행했다.
  • <LineChart width={350} height={280} data={commitData}> 이 부분에서 data={commitData}로 수정해주었고
  • 애니메이션 기능을 없애기 위해 isAnimationActive={false}을 추가해줬다.
  • LineGraph의 해당 Child Components의 api를 클릭하면 Properties기능들을 볼 수 있다. 영어로 나와있어서 천천히 읽어보거나 구글 번역기 돌려서 빠르게 캐치한 뒤 커스텀하는 것을 추천한다.

 

🛠 style.js

import styled from "styled-components";
export const Container = styled.div`
position: relative;
width: 350px;
height: 350px;
background-color: white;
border-radius: 10px;
margin-top: 20px;
margin-bottom: 23px;
box-shadow: 0 14px 28px rgb(0 0 0 / 0%), 0 10px 10px rgb(0 0 0 / 3%);
`;
export const Wrapper = styled.div`
position: absolute;
top: 48px;
right: 20px;
`;
export const Title = styled.h5`
font-size: 13.55px;
margin-left: 18px;
margin-top: 15px;
`;

 

📝 PieChartWithPaddingAngle 커스텀하기

🛠 index.js

import React from "react";
import { PieChart, Pie, Sector, Cell } from "recharts";
import githubLangColors from "./github-lang-colors.json";
import * as PieCharts from "./style";
PieChartComponent.defaultProps = {
codeRatioArray: [
{ name: "JavaScript", value: 44.53 },
{ name: "HTML", value: 35.57 },
{ name: "CSS", value: 13.27 },
{ name: "TypeScript", value: 6.64 },
],
};
export function PieChartComponent({ codeRatioArray }) {
const langColor = githubLangColors;
const COLORS = codeRatioArray.map((it) => {
const langName = it.name;
return langColor[langName];
});
return (
<PieCharts.Container>
<PieCharts.Wrapper>
<PieCharts.Heading>
<PieCharts.Title>사용 언어 비율</PieCharts.Title>
<PieCharts.Description>전체 레포 기준</PieCharts.Description>
</PieCharts.Heading>
<PieCharts.RatioWrapper>
{codeRatioArray &&
codeRatioArray.map((it, idx) => (
<PieCharts.LangColorBoxWrapper key={`${it.name}-${it.value}`}>
<PieCharts.LangColorBox idx={COLORS[idx]} />
<div>
<PieCharts.LangText>{it.value}%</PieCharts.LangText>
<PieCharts.LangText>{it.name}</PieCharts.LangText>
</div>
</PieCharts.LangColorBoxWrapper>
))}
</PieCharts.RatioWrapper>
</PieCharts.Wrapper>
<PieCharts.PieWrapper>
<PieChart width={200} height={200}>
<Pie
data={codeRatioArray}
cx="50%"
cy="50%"
innerRadius={40}
outerRadius={70}
fill="#8884d8"
dataKey="value"
isAnimationActive={false}
>
{codeRatioArray.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={COLORS[index % COLORS.length]}
/>
))}
</Pie>
</PieChart>
</PieCharts.PieWrapper>
</PieCharts.Container>
);
}

 

🛠 style.js

import styled from "styled-components";
export const Container = styled.div`
background: white;
width: 350px;
height: 200px;
position: relative;
display: flex;
justify-content: space-between;
border-radius: 10px;
`;
export const Wrapper = styled.div`
margin-left: 20px;
margin-top: 14px;
`;
export const Heading = styled.div`
margin-bottom: 30px;
`;
export const Title = styled.h5`
font-size: 14px;
color: ${(props) => props.theme.darkGray};
margin-bottom: 10px;
`;
export const Description = styled.span`
font-size: 9px;
color: ${(props) => props.theme.lightGray};
`;
export const RatioWrapper = styled.div``;
export const LangColorBox = styled.div`
background-color: ${({ idx }) => idx};
width: 12.5px;
height: 12.5px;
border-radius: 50%;
margin-right: 7px;
`;
export const LangColorBoxWrapper = styled.div`
display: flex;
align-items: center;
margin-bottom: 14px;
`;
export const PieWrapper = styled.div``;
export const LangText = styled.span`
font-size: 9px;
color: ${(props) => props.theme.lightGray};
margin-right: 7px;
`;
  • 사용 방법은 SimpleLineChart와 동일하다. api 문서를 잘 읽어보자!

📌 참고

반응형