Component Library
Browse and explore components
Pie chart
A Pie Chart is a data visualization component used to represent categorical data as proportional slices of a circle, emphasizing the relative contribution of each category to the whole by illustrating parts-to-whole relationships in a compact and intuitive format.
Default
Component Code
Copy Code
'use client'
import { Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A simple pie chart'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 187, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 90, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieSimpleCode() {
return (
<>
<ChartContainer config={chartConfig}>
<PieChart>
<ChartTooltip
cursor={false}
content={<ChartTooltipContent hideLabel />}
/>
<Pie data={chartData} dataKey='visitors' nameKey='browser' />
</PieChart>
</ChartContainer>
</>
)
}
Separator None
Component Code
Copy Code
'use client'
import { Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A pie chart with no separator'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 187, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 90, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieSeparatorNoneCode() {
return (
<>
<ChartContainer config={chartConfig}>
<PieChart>
<ChartTooltip
cursor={false}
content={<ChartTooltipContent hideLabel />}
/>
<Pie
data={chartData}
dataKey='visitors'
nameKey='browser'
stroke='0'
/>
</PieChart>
</ChartContainer>
</>
)
}
Label
Component Code
Copy Code
'use client'
import { Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A pie chart with a label'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 187, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 90, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieLabelCode() {
return (
<>
<ChartContainer
config={chartConfig}
className='[&_.recharts-pie-label-text]:fill-foreground'>
<PieChart>
<ChartTooltip content={<ChartTooltipContent hideLabel />} />
<Pie data={chartData} dataKey='visitors' label nameKey='browser' />
</PieChart>
</ChartContainer>
</>
)
}
Custom Label
Component Code
Copy Code
'use client'
import { Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A pie chart with a custom label'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 187, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 90, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieLabelCustomCode() {
return (
<>
<ChartContainer config={chartConfig}>
<PieChart>
<ChartTooltip
content={<ChartTooltipContent nameKey='visitors' hideLabel />}
/>
<Pie
data={chartData}
dataKey='visitors'
labelLine={false}
label={({ payload, ...props }) => {
return (
<text
cx={props.cx}
cy={props.cy}
x={props.x}
y={props.y}
textAnchor={props.textAnchor}
dominantBaseline={props.dominantBaseline}
fill='var(--color-primary)'>
{payload.visitors}
</text>
)
}}
nameKey='browser'
/>
</PieChart>
</ChartContainer>
</>
)
}
Label List
Component Code
Copy Code
'use client'
import { LabelList, Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A pie chart with a label list'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 187, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 90, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieLabelListCode() {
return (
<>
<ChartContainer
config={chartConfig}
className='[&_.recharts-text]:fill-background'>
<PieChart>
<ChartTooltip
content={<ChartTooltipContent nameKey='visitors' hideLabel />}
/>
<Pie data={chartData} dataKey='visitors'>
<LabelList
dataKey='browser'
className='fill-link'
stroke='none'
fontSize={12}
formatter={(value: keyof typeof chartConfig) =>
chartConfig[value]?.label
}
/>
</Pie>
</PieChart>
</ChartContainer>
</>
)
}
Legend
Component Code
Copy Code
'use client'
import { Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartLegend,
ChartLegendContent,
} from '@/components/ui/chart'
export const description = 'A pie chart with a legend'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 187, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 90, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieLegendCode() {
return (
<>
<ChartContainer config={chartConfig}>
<PieChart>
<Pie data={chartData} dataKey='visitors' />
<ChartLegend
content={<ChartLegendContent nameKey='browser' />}
className='-translate-y-2 flex-wrap gap-2 *:basis-1/4 *:justify-center'
/>
</PieChart>
</ChartContainer>
</>
)
}
Donut
Component Code
Copy Code
'use client'
import { Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A donut chart'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 187, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 90, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieDonutCode() {
return (
<>
<ChartContainer config={chartConfig}>
<PieChart>
<ChartTooltip
cursor={false}
content={<ChartTooltipContent hideLabel />}
/>
<Pie
data={chartData}
dataKey='visitors'
nameKey='browser'
innerRadius={60}
/>
</PieChart>
</ChartContainer>
</>
)
}
Donut active
Component Code
Copy Code
'use client'
import { Pie, PieChart, Sector } from 'recharts'
import { PieSectorDataItem } from 'recharts/types/polar/Pie'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A donut chart with an active sector'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 187, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 90, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieDonutActiveCode() {
return (
<>
<ChartContainer config={chartConfig}>
<PieChart>
<ChartTooltip
cursor={false}
content={<ChartTooltipContent hideLabel />}
/>
<Pie
data={chartData}
dataKey='visitors'
nameKey='browser'
innerRadius={60}
strokeWidth={5}
activeIndex={0}
activeShape={({ outerRadius = 0, ...props }: PieSectorDataItem) => (
<Sector {...props} outerRadius={outerRadius + 10} />
)}
/>
</PieChart>
</ChartContainer>
</>
)
}
Donut With Text
Component Code
Copy Code
'use client'
import * as React from 'react'
import { Label, Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A donut chart with text'
const chartData = [
{ browser: 'chrome', visitors: 275, fill: 'var(--color-primary)' },
{ browser: 'safari', visitors: 200, fill: 'var(--color-secondary)' },
{ browser: 'firefox', visitors: 287, fill: 'var(--color-warning)' },
{ browser: 'edge', visitors: 173, fill: 'var(--color-error)' },
{ browser: 'other', visitors: 190, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
chrome: {
label: 'Chrome',
color: 'var(--chart-1)',
},
safari: {
label: 'Safari',
color: 'var(--chart-2)',
},
firefox: {
label: 'Firefox',
color: 'var(--chart-3)',
},
edge: {
label: 'Edge',
color: 'var(--chart-4)',
},
other: {
label: 'Other',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieDonutTextCode() {
const totalVisitors = React.useMemo(() => {
return chartData.reduce((acc, curr) => acc + curr.visitors, 0)
}, [])
return (
<>
<ChartContainer config={chartConfig}>
<PieChart>
<ChartTooltip
cursor={false}
content={<ChartTooltipContent hideLabel />}
/>
<Pie
data={chartData}
dataKey='visitors'
nameKey='browser'
innerRadius={60}
strokeWidth={5}>
<Label
content={({ viewBox }) => {
if (viewBox && 'cx' in viewBox && 'cy' in viewBox) {
return (
<text
x={viewBox.cx}
y={viewBox.cy}
textAnchor='middle'
dominantBaseline='middle'>
<tspan
x={viewBox.cx}
y={viewBox.cy}
className='fill-foreground text-3xl font-bold'>
{totalVisitors.toLocaleString()}
</tspan>
<tspan
x={viewBox.cx}
y={(viewBox.cy || 0) + 24}
className='fill-muted-foreground'>
Visitors
</tspan>
</text>
)
}
}}
/>
</Pie>
</PieChart>
</ChartContainer>
</>
)
}
Stacked
Component Code
Copy Code
'use client'
import * as React from 'react'
import { Pie, PieChart } from 'recharts'
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
export const description = 'A pie chart with stacked sections'
const desktopData = [
{ month: 'january', desktop: 186, fill: 'var(--color-primary)' },
{ month: 'february', desktop: 305, fill: 'var(--color-secondary)' },
{ month: 'march', desktop: 237, fill: 'var(--color-warning)' },
{ month: 'april', desktop: 173, fill: 'var(--color-error)' },
{ month: 'may', desktop: 209, fill: 'var(--color-info)' },
]
const mobileData = [
{ month: 'january', mobile: 80, fill: 'var(--color-primary)' },
{ month: 'february', mobile: 200, fill: 'var(--color-secondary)' },
{ month: 'march', mobile: 120, fill: 'var(--color-warning)' },
{ month: 'april', mobile: 190, fill: 'var(--color-error)' },
{ month: 'may', mobile: 130, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
desktop: {
label: 'Desktop',
},
mobile: {
label: 'Mobile',
},
january: {
label: 'January',
color: 'var(--chart-1)',
},
february: {
label: 'February',
color: 'var(--chart-2)',
},
march: {
label: 'March',
color: 'var(--chart-3)',
},
april: {
label: 'April',
color: 'var(--chart-4)',
},
may: {
label: 'May',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieStackedCode() {
return (
<>
<ChartContainer config={chartConfig}>
<PieChart>
<ChartTooltip
content={
<ChartTooltipContent
labelKey='visitors'
nameKey='month'
indicator='line'
labelFormatter={(_, payload) => {
return chartConfig[
payload?.[0].dataKey as keyof typeof chartConfig
].label
}}
/>
}
/>
<Pie data={desktopData} dataKey='desktop' outerRadius={60} />
<Pie
data={mobileData}
dataKey='mobile'
innerRadius={70}
outerRadius={90}
/>
</PieChart>
</ChartContainer>
</>
)
}
Interactive
Component Code
Copy Code
'use client'
import * as React from 'react'
import { Label, Pie, PieChart, Sector } from 'recharts'
import { PieSectorDataItem } from 'recharts/types/polar/Pie'
import {
ChartConfig,
ChartContainer,
ChartStyle,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/components/ui/select'
export const description = 'An interactive pie chart'
const desktopData = [
{ month: 'january', desktop: 186, fill: 'var(--color-primary)' },
{ month: 'february', desktop: 305, fill: 'var(--color-secondary)' },
{ month: 'march', desktop: 237, fill: 'var(--color-warning)' },
{ month: 'april', desktop: 173, fill: 'var(--color-error)' },
{ month: 'may', desktop: 209, fill: 'var(--color-info)' },
]
const chartConfig = {
visitors: {
label: 'Visitors',
},
desktop: {
label: 'Desktop',
},
mobile: {
label: 'Mobile',
},
january: {
label: 'January',
color: 'var(--chart-1)',
},
february: {
label: 'February',
color: 'var(--chart-2)',
},
march: {
label: 'March',
color: 'var(--chart-3)',
},
april: {
label: 'April',
color: 'var(--chart-4)',
},
may: {
label: 'May',
color: 'var(--chart-5)',
},
} satisfies ChartConfig
export default function ChartPieInteractiveCode() {
const id = 'pie-interactive'
const [activeMonth, setActiveMonth] = React.useState(desktopData[0].month)
const activeIndex = React.useMemo(
() => desktopData.findIndex((item) => item.month === activeMonth),
[activeMonth]
)
const months = React.useMemo(() => desktopData.map((item) => item.month), [])
return (
<>
<ChartStyle id={id} config={chartConfig} />
<div>
<Select value={activeMonth} onValueChange={setActiveMonth}>
<SelectTrigger
className='sm:ml-auto max-w-32 rounded-lg pl-2.5'
aria-label='Select a value'>
<SelectValue placeholder='Select month' />
</SelectTrigger>
<SelectContent align='end' className='rounded-xl'>
{months.map((key) => {
const config = chartConfig[key as keyof typeof chartConfig]
if (!config) {
return null
}
return (
<SelectItem
key={key}
value={key}
className='rounded-lg [&_span]:flex'>
<div className='flex items-center gap-2 text-xs'>
<span
className='flex h-3 w-3 shrink-0 rounded-xs'
style={{
backgroundColor: `var(--color-${key})`,
}}
/>
{config?.label}
</div>
</SelectItem>
)
})}
</SelectContent>
</Select>
<ChartContainer id={id} config={chartConfig}>
<PieChart>
<ChartTooltip
cursor={false}
content={<ChartTooltipContent hideLabel />}
/>
<Pie
data={desktopData}
dataKey='desktop'
nameKey='month'
innerRadius={60}
strokeWidth={5}
activeIndex={activeIndex}
activeShape={({
outerRadius = 0,
...props
}: PieSectorDataItem) => (
<g>
<Sector {...props} outerRadius={outerRadius + 10} />
<Sector
{...props}
outerRadius={outerRadius + 25}
innerRadius={outerRadius + 12}
/>
</g>
)}>
<Label
content={({ viewBox }) => {
if (viewBox && 'cx' in viewBox && 'cy' in viewBox) {
return (
<text
x={viewBox.cx}
y={viewBox.cy}
textAnchor='middle'
dominantBaseline='middle'>
<tspan
x={viewBox.cx}
y={viewBox.cy}
className='fill-foreground text-3xl font-bold'>
{desktopData[activeIndex].desktop.toLocaleString()}
</tspan>
<tspan
x={viewBox.cx}
y={(viewBox.cy || 0) + 24}
className='fill-muted-foreground'>
Visitors
</tspan>
</text>
)
}
}}
/>
</Pie>
</PieChart>
</ChartContainer>
</div>
</>
)
}