AreaChart
Data Visualization
visx 기반 영역 차트.
Usage
import
API Reference
예제
Usage
시간에 따른 하나 이상의 수치 추세와 누적 규모를 영역으로 비교할 때 사용한다.
import
import
import { AreaChart } from '@mildang/design-system/Chart';예제를 복사해 쓸 때 필요한 준비
• @mildang/styled-system 은 이 저장소에서 Panda 가 생성하는 산출물이다. 저장소 안에서는 turbo run ship 이후 쓸 수 있고, 패키지 소비자는 자기 Panda 산출물이나 다른 레이아웃 수단으로 바꿔야 한다.
API Reference
AreaChart Props
Prop
Type
Default
data
필수
TDatum[]
지정 안 함
xKey
필수
string
지정 안 함
yKeys
필수
(keyof TDatum & string)[]
지정 안 함
children
ReactNode
지정 안 함
className
string
지정 안 함
colors
string[]
지정 안 함
curve
"step" | "linear" | "monotoneX"
monotoneX
fillOpacity
number
지정 안 함
labels
Partial<Record<keyof TDatum & string, string>>
지정 안 함
legendPosition
"bottom" | "left" | "right" | "top"
bottom
margin
Partial<ChartMargin>
지정 안 함
paints
ChartPaint[]
지정 안 함
showGrid
boolean
true
showLegend
boolean
false
showTooltip
boolean
false
showXAxis
boolean
true
showYAxis
boolean
true
stackMode
"none" | "stacked" | "stream"
none
예제
겹쳐 보기 vs 쌓아 보기
stackMode 로 시리즈를 겹쳐서 추세를 비교할지, 쌓아서 합계 규모까지 함께 볼지 고른다.
코드
'use client';
import { AreaChart } from '@mildang/design-system/Chart';
import { Text } from '@mildang/design-system/Text';
import { HStack, VStack } from '@mildang/styled-system/jsx';
import { css } from '@mildang/styled-system/css';
/**
* `stackMode`로 시리즈를 겹쳐서 비교할지(none) 쌓아서 합계 규모를 함께 볼지(stacked) 고른다.
* 데이터·yKeys 는 그대로 두고 이 prop 하나만 바뀐다.
*/
const data = [
{ week: '1주', web: 320, app: 180 },
{ week: '2주', web: 340, app: 260 },
{ week: '3주', web: 300, app: 310 },
{ week: '4주', web: 380, app: 340 },
];
const labels = { web: '웹', app: '앱' };
const frame = css({ width: '100%', height: '[220px]' });
export default function AreaChartStackModesExample() {
return (
<HStack gap="6" alignItems="flex-start" flexWrap="wrap">
<VStack gap="2" alignItems="stretch" flex="1" minWidth="[220px]">
<Text variant="caption-md" color="neutral.text.low">
none — 두 채널 추세를 겹쳐서 비교
</Text>
<div className={frame}>
<AreaChart
data={data}
xKey="week"
yKeys={['web', 'app']}
labels={labels}
stackMode="none"
showLegend
/>
</div>
</VStack>
<VStack gap="2" alignItems="stretch" flex="1" minWidth="[220px]">
<Text variant="caption-md" color="neutral.text.low">
stacked — 전체 방문 규모까지 함께 확인
</Text>
<div className={frame}>
<AreaChart
data={data}
xKey="week"
yKeys={['web', 'app']}
labels={labels}
stackMode="stacked"
showLegend
/>
</div>
</VStack>
</HStack>
);
}
기본 (겹쳐 그리기)
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartDefaultExample = () => (
<AreaChart
data={weeklyStudyData}
xKey="week"
yKeys={['vocab', 'grammar', 'reading']}
labels={studyLabels}
showLegend
/>
);
export default AreaChartDefaultExample;
스택 영역
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartStackedExample = () => (
<AreaChart
data={weeklyStudyData}
xKey="week"
yKeys={['vocab', 'grammar', 'reading']}
stackMode="stacked"
labels={studyLabels}
showLegend
showTooltip
/>
);
export default AreaChartStackedExample;
스트림그래프
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartStreamExample = () => (
<AreaChart
data={weeklyStudyData}
xKey="week"
yKeys={['vocab', 'grammar', 'reading']}
stackMode="stream"
labels={studyLabels}
showYAxis={false}
showGrid={false}
showLegend
/>
);
export default AreaChartStreamExample;
직선 보간 (linear)
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartLinearCurveExample = () => (
<AreaChart
data={weeklyStudyData}
xKey="week"
yKeys={['vocab', 'grammar']}
curve="linear"
labels={studyLabels}
showLegend
/>
);
export default AreaChartLinearCurveExample;
스텝 보간
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartStepCurveExample = () => (
<AreaChart
data={weeklyStudyData}
xKey="week"
yKeys={['vocab']}
curve="step"
stackMode="stacked"
labels={studyLabels}
/>
);
export default AreaChartStepCurveExample;
Hover Tooltip
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartHoverTooltipExample = () => (
<AreaChart
data={weeklyStudyData}
xKey="week"
yKeys={['vocab']}
labels={studyLabels}
showTooltip
/>
);
export default AreaChartHoverTooltipExample;
빈 데이터
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartEmptyExample = () => (
<AreaChart
data={[] as typeof weeklyStudyData}
xKey="week"
yKeys={['vocab', 'grammar']}
labels={studyLabels}
showLegend
/>
);
export default AreaChartEmptyExample;
데이터 1개
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartSingleDatumExample = () => (
<AreaChart
data={weeklyStudyData.slice(0, 1)}
xKey="week"
yKeys={['vocab', 'grammar']}
labels={studyLabels}
showLegend
/>
);
export default AreaChartSingleDatumExample;
0값 포함 (스택)
import { AreaChart } from '@mildang/design-system/Chart';
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartWithZeroValuesExample = () => (
<AreaChart
data={[
{ week: '1주차', vocab: 120, grammar: 0, reading: 60 },
{ week: '2주차', vocab: 0, grammar: 80, reading: 0 },
{ week: '3주차', vocab: 100, grammar: 0, reading: 95 },
{ week: '4주차', vocab: 0, grammar: 0, reading: 0 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
]}
xKey="week"
yKeys={['vocab', 'grammar', 'reading']}
stackMode="stacked"
labels={studyLabels}
showLegend
showTooltip
/>
);
export default AreaChartWithZeroValuesExample;
반응형 (너비 자동 조정)
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const studyLabels = { vocab: '어휘', grammar: '문법', reading: '독해' };
const AreaChartResponsiveExample = () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 32, width: '100%' }}>
{([280, 480, 720] as const).map((w) => (
<div key={w} style={{ width: w, height: 240 }}>
<AreaChart
data={weeklyStudyData}
xKey="week"
yKeys={['vocab', 'grammar', 'reading']}
stackMode="stacked"
labels={studyLabels}
showLegend
/>
</div>
))}
</div>
);
export default AreaChartResponsiveExample;
Compound 패턴
import { AreaChart } from '@mildang/design-system/Chart';
// 주차별 과목 학습 시간(분)
const weeklyStudyData = [
{ week: '1주차', vocab: 120, grammar: 90, reading: 60 },
{ week: '2주차', vocab: 140, grammar: 80, reading: 75 },
{ week: '3주차', vocab: 100, grammar: 110, reading: 95 },
{ week: '4주차', vocab: 160, grammar: 95, reading: 120 },
{ week: '5주차', vocab: 180, grammar: 130, reading: 110 },
{ week: '6주차', vocab: 150, grammar: 120, reading: 140 },
];
const AreaChartCompoundUsageExample = () => (
<AreaChart data={weeklyStudyData} xKey="week" yKeys={['vocab', 'grammar']} stackMode="stacked">
<AreaChart.Grid />
<AreaChart.XAxis hideTicks hideAxisLine />
<AreaChart.Areas />
</AreaChart>
);
export default AreaChartCompoundUsageExample;