Google Chart와 Recharts 중 어떤 것을 사용할지 고민하다가 예전부터 한 번 사용해보고 싶었던 Recharts를 선택했다.
많은 기능을 지원했고 난이도가 높지 않아서 만족했다.
복잡한 데이터를 시각화 하는 작업이 아닌 단순한 수치를 나타내는 작업이라 코드를 복사하고 붙여넣는 일이 전부였다.
import React from 'react';
import { PieChart, Pie, Legend, Cell, Tooltip } from 'recharts';
import './TimeChart.scss';
const PieChartComponent = ({ storeData }) => {
if (storeData.length === 0) return;
const data = [
{ name: '아침', value: storeData.offer_time_data[0].pay },
{ name: '점심', value: storeData.offer_time_data[1].pay },
{ name: '저녁', value: storeData.offer_time_data[2].pay },
];
const COLORS = ['#1AA7EC', '#1E2F97', '#4bAAAD'];
const RADIAN = Math.PI / 180;
const renderCustomizedLabel = ({
cx,
cy,
midAngle,
innerRadius,
outerRadius,
percent,
}) => {
const radius = innerRadius + (outerRadius - innerRadius) * 0.5;
const x = cx + radius * Math.cos(-midAngle * RADIAN);
const y = cy + radius * Math.sin(-midAngle * RADIAN);
return (
<text
x={x}
y={y}
fill="white"
textAnchor={x > cx ? 'start' : 'end'}
dominantBaseline="central"
>
{percent ? `${(percent * 100).toFixed(0)}%` : ''}
</text>
);
};
return (
<div>
<div className="timeTitle">시간별 차트</div>
<div className="row d-flex justify-content-center text-center">
<div className="col-md-8">
<PieChart width={300} height={200}>
<Legend
layout="vertical"
verticalAlign="middle"
align="bottom"
iconSize="13"
wrapperStyle={{
fontWeight: '700',
border: '1px solid #FAFAFA',
borderRadius: '10px',
boxShadow:
'rgba(60, 64, 67, 0.3) 0px 1px 2px 0px, rgba(60, 64, 67, 0.15) 0px 2px 6px 2px',
padding: '5px',
}}
/>
<Pie
data={data}
cx="65%"
cy="70%"
labelLine={false}
label={renderCustomizedLabel}
outerRadius={80}
fill="#8884d8"
dataKey="value"
>
{data.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={COLORS[index % COLORS.length]}
style={{
filter: `drop-shadow(5px 5px 5px #666`,
}}
stroke="1"
/>
))}
</Pie>
<Tooltip isAnimationActive={false} />
</PieChart>
</div>
</div>
</div>
);
};
export default PieChartComponent;
Legend 는 범례를 나타낸다
Cell은 Pie 모양의 Chart 자체에 스타일링을 주기 위해서 적용했다.
Tooltip은 차트에 마우스를 올리면 상세 데이터를 보여준다.
return문 위의 함수와 변수는 기본적으로 제공하지만 커스터마이징 하기 위해서 값을 조금씩 바꿔나가면 원하는대로 스타일링을 할 수 있다.
import React, { PureComponent } from 'react';
import {
BarChart,
Bar,
Cell,
XAxis,
CartesianGrid,
Tooltip,
Legend,
ResponsiveContainer,
} from 'recharts';
import './DateChart.scss';
const DateChart = ({ storeData }) => {
if (storeData.length === 0) return;
const data = [
{
name: '월',
매출액: storeData.weekday_data[0].pay,
배달건수: storeData.weekday_data[0].count,
},
{
name: '화',
매출액: storeData.weekday_data[1].pay,
배달건수: storeData.weekday_data[1].count,
},
{
name: '수',
매출액: storeData.weekday_data[2].pay,
배달건수: storeData.weekday_data[2].count,
},
{
name: '목',
매출액: storeData.weekday_data[3].pay,
배달건수: storeData.weekday_data[3].count,
},
{
name: '금',
매출액: storeData.weekday_data[4].pay,
배달건수: storeData.weekday_data[4].count,
},
{
name: '토',
uv: 7000,
매출액: storeData.weekday_data[5].pay,
배달건수: storeData.weekday_data[5].count,
},
{
name: '일',
매출액: storeData.weekday_data[6].pay,
배달건수: storeData.weekday_data[6].count,
},
];
return (
<div>
<div className="dateTitle">요일별 차트</div>
<BarChart width={350} height={200} data={data} className="barChart">
<Legend
layout="horizontal"
verticalAlign="bottom"
align="center"
iconSize="5"
wrapperStyle={{
fontWeight: '700',
}}
/>
<Bar dataKey="매출액" fill="#1187CF" radius={3} />
<Bar dataKey="배달건수" fill="black" radius={3} />
<XAxis dataKey="name" style={{ fontSize: '12px' }} tickLine={false} />
<Tooltip
content={data}
contentStyle={{ border: 'none' }}
isAnimationActive={false}
cursor={false}
/>
</BarChart>
</div>
);
};
export default DateChart;
BarChart component의 width와 height와 Bar component의 radius를 활용하여 차트의 사이즈를 조절할 수 있다.
라이브러리를 사용하는데 2차 프로젝트였던 [탐나BnB] 때 datapicker 라이브러리를 처음 사용했던 기억이 났다.
그때는 제한적인 스타일링 때문에 불만이 많았지만 라이브러리 사용에 익숙해진 지금 그저 감사할 따름... 라이브러리 만들어 주시는분들 정말 감사합니다.