
Two stacked areas normalized so every month fills 100%, showing each series' share rather than its value.
@esuiss
components/charts/area-chart-stacked-expand.tsx
"use client"
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card"
import {
type ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from "@/components/ui/chart"
const chartData = [
{ month: "January", desktop: 186, mobile: 80 },
{ month: "February", desktop: 305, mobile: 200 },
{ month: "March", desktop: 237, mobile: 120 },
{ month: "April", desktop: 173, mobile: 190 },
{ month: "May", desktop: 209, mobile: 130 },
{ month: "June", desktop: 264, mobile: 140 },
]
const chartConfig = {
desktop: { label: "Desktop", color: "var(--chart-1)" },
mobile: { label: "Mobile", color: "var(--chart-2)" },
} satisfies ChartConfig
export function AreaChartStackedExpand() {
return (
<Card variant="filled" size="sm">
<CardHeader>
<CardTitle>Stacked to 100%</CardTitle>
<CardDescription>Each month adds up to 100%</CardDescription>
</CardHeader>
<CardContent>
<ChartContainer
config={chartConfig}
className="aspect-auto h-48 w-full"
>
<AreaChart
accessibilityLayer
data={chartData}
stackOffset="expand"
margin={{ top: 10, right: 4, left: 12, bottom: 0 }}
>
<CartesianGrid vertical={false} strokeDasharray="2 4" />
<XAxis
dataKey="month"
tickLine={false}
axisLine={false}
tickMargin={8}
interval={0}
tickFormatter={(value: string) => value.slice(0, 3)}
/>
<YAxis
orientation="right"
tickLine={false}
axisLine={false}
tickMargin={6}
width="auto"
ticks={[0, 0.5, 1]}
tickFormatter={(value: number) => `${Math.round(value * 100)}%`}
/>
<ChartTooltip content={<ChartTooltipContent indicator="line" />} />
<Area
dataKey="mobile"
type="natural"
stackId="a"
stroke="var(--color-mobile)"
fill="var(--color-mobile)"
fillOpacity={0.35}
/>
<Area
dataKey="desktop"
type="natural"
stackId="a"
stroke="var(--color-desktop)"
fill="var(--color-desktop)"
fillOpacity={0.35}
/>
</AreaChart>
</ChartContainer>
</CardContent>
</Card>
)
}
































