import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, XAxisTickContentProps } from 'recharts';
import { ReactNode } from 'react';
import { RechartsDevtools } from '@recharts/devtools';
// #region Sample data
const data = [
{
date: '2000-01',
uv: 4000,
pv: 2400,
amt: 2400,
},
{
date: '2000-02',
uv: 3000,
pv: 1398,
amt: 2210,
},
{
date: '2000-03',
uv: 2000,
pv: 9800,
amt: 2290,
},
{
date: '2000-04',
uv: 2780,
pv: 3908,
amt: 2000,
},
{
date: '2000-05',
uv: 1890,
pv: 4800,
amt: 2181,
},
{
date: '2000-06',
uv: 2390,
pv: 3800,
amt: 2500,
},
{
date: '2000-07',
uv: 3490,
pv: 4300,
amt: 2100,
},
{
date: '2000-08',
uv: 4000,
pv: 2400,
amt: 2400,
},
{
date: '2000-09',
uv: 3000,
pv: 1398,
amt: 2210,
},
{
date: '2000-10',
uv: 2000,
pv: 9800,
amt: 2290,
},
{
date: '2000-11',
uv: 2780,
pv: 3908,
amt: 2000,
},
{
date: '2000-12',
uv: 1890,
pv: 4800,
amt: 2181,
},
];
// #endregion
const monthTickFormatter = (tick: string | number | Date): string => {
const date = new Date(tick);
return String(date.getMonth() + 1);
};
const renderQuarterTick = (tickProps: XAxisTickContentProps): ReactNode => {
const { x: xProp, y: yProp, payload, width: widthProp, visibleTicksCount } = tickProps;
const x = Number(xProp);
const y = Number(yProp);
const width = Number(widthProp);
const { value, offset = 0 } = payload;
const date = new Date(value);
const month = date.getMonth();
const quarterNo = Math.floor(month / 3) + 1;
if (month % 3 === 1) {
return <text x={x + width / visibleTicksCount / 2 - offset} y={y - 4} textAnchor="middle">{`Q${quarterNo}`}</text>;
}
const isLast = month === 11;
if (month % 3 === 0 || isLast) {
const pathX = Math.floor(isLast ? x - offset + width / visibleTicksCount : x - offset) + 0.5;
return <path d={`M${pathX},${y - 4}v${-35}`} stroke="red" />;
}
return null;
};
const BarChartWithMultiXAxis = () => {
return (
<BarChart
style={{ width: '100%', maxWidth: '700px', maxHeight: '70vh', aspectRatio: 1.618 }}
responsive
data={data}
margin={{
top: 25,
right: 0,
left: 0,
bottom: 5,
}}
>
<CartesianGrid />
<XAxis dataKey="date" tickFormatter={monthTickFormatter} />
<XAxis
dataKey="date"
axisLine={false}
tickLine={false}
interval={0}
tick={renderQuarterTick}
height={1}
scale="band"
xAxisId="quarter"
/>
<YAxis width="auto" />
<Tooltip />
<Legend wrapperStyle={{ paddingTop: '1em' }} />
<Bar dataKey="pv" />
<Bar dataKey="uv" />
<RechartsDevtools />
</BarChart>
);
};
export default BarChartWithMultiXAxis;