Stacked Chart
Stacked chart for the parts of a total: stacked and 100 % columns, stacked areas, diverging Likert bars, Marimekko and gapped rows.
Usage
Direct · Dec
$27.0k$27.0k
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | $14.0k | $10.0k | $5.0k |
| Feb | $18.0k | $11.0k | $7.0k |
| Mar | $16.0k | $10.0k | $6.0k |
| Apr | $20.0k | $14.0k | $8.0k |
| May | $19.0k | $13.0k | $7.0k |
| Jun | $23.0k | $15.0k | $9.0k |
| Jul | $21.0k | $14.0k | $8.0k |
| Aug | $25.0k | $16.0k | $10.0k |
| Sep | $22.0k | $15.0k | $9.0k |
| Oct | $20.0k | $13.0k | $8.0k |
| Nov | $24.0k | $16.0k | $10.0k |
| Dec | $27.0k | $17.0k | $11.0k |
Installation
Stacked Chart comes with WunderUI Core and Pro, in the package from your plan. See the plans.
Then import what you need:
import {
StackedChart,
StackedChartProps,
StackedChartVariant,
} from "@wunderui/react"Examples
Stacked Bar
Stacked Charts
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | 14k | 10k | 5k |
| Feb | 18k | 11k | 7k |
| Mar | 16k | 10k | 6k |
| Apr | 20k | 14k | 8k |
| May | 19k | 13k | 7k |
| Jun | 23k | 15k | 9k |
| Jul | 21k | 14k | 8k |
| Aug | 25k | 16k | 10k |
| Sep | 22k | 15k | 9k |
| Oct | 20k | 13k | 8k |
| Nov | 24k | 16k | 10k |
| Dec | 27k | 17k | 11k |
Stacked Bar 100
Stacked Charts
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | 14k | 10k | 5k |
| Feb | 18k | 11k | 7k |
| Mar | 16k | 10k | 6k |
| Apr | 20k | 14k | 8k |
| May | 19k | 13k | 7k |
| Jun | 23k | 15k | 9k |
| Jul | 21k | 14k | 8k |
| Aug | 25k | 16k | 10k |
| Sep | 22k | 15k | 9k |
| Oct | 20k | 13k | 8k |
| Nov | 24k | 16k | 10k |
| Dec | 27k | 17k | 11k |
Horizontal Stacked Bar
Stacked Charts
| country | Direct | Organic | Referral |
|---|---|---|---|
| DE | 26k | 15k | 10k |
| US | 23k | 15k | 8k |
| UK | 20k | 12k | 7k |
| FR | 17k | 10k | 6k |
| ES | 14k | 8k | 5k |
| IT | 11k | 7k | 4k |
| NL | 8k | 5k | 3k |
Stacked Area
Stacked Charts
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | 14k | 10k | 5k |
| Feb | 18k | 11k | 7k |
| Mar | 16k | 10k | 6k |
| Apr | 20k | 14k | 8k |
| May | 19k | 13k | 7k |
| Jun | 23k | 15k | 9k |
| Jul | 21k | 14k | 8k |
| Aug | 25k | 16k | 10k |
| Sep | 22k | 15k | 9k |
| Oct | 20k | 13k | 8k |
| Nov | 24k | 16k | 10k |
| Dec | 27k | 17k | 11k |
Stacked Area 100
Stacked Charts
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | 14k | 10k | 5k |
| Feb | 18k | 11k | 7k |
| Mar | 16k | 10k | 6k |
| Apr | 20k | 14k | 8k |
| May | 19k | 13k | 7k |
| Jun | 23k | 15k | 9k |
| Jul | 21k | 14k | 8k |
| Aug | 25k | 16k | 10k |
| Sep | 22k | 15k | 9k |
| Oct | 20k | 13k | 8k |
| Nov | 24k | 16k | 10k |
| Dec | 27k | 17k | 11k |
Stacked Gradient Bar
Stacked Charts
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | 14k | 10k | 5k |
| Feb | 18k | 11k | 7k |
| Mar | 16k | 10k | 6k |
| Apr | 20k | 14k | 8k |
| May | 19k | 13k | 7k |
| Jun | 23k | 15k | 9k |
| Jul | 21k | 14k | 8k |
| Aug | 25k | 16k | 10k |
| Sep | 22k | 15k | 9k |
| Oct | 20k | 13k | 8k |
| Nov | 24k | 16k | 10k |
| Dec | 27k | 17k | 11k |
Diverging Stacked Bar
Stacked Charts
| topic | Strongly disagree | Disagree | Neutral | Agree | Strongly agree |
|---|---|---|---|---|---|
| Onboarding | 6% | 14% | 12% | 52% | 16% |
| Docs | 12% | 16% | 10% | 38% | 24% |
| Pricing | 8% | 10% | 14% | 36% | 32% |
| Support | 10% | 14% | 12% | 50% | 14% |
| Performance | 7% | 10% | 18% | 30% | 35% |
| Integrations | 9% | 16% | 14% | 52% | 9% |
| Mobile app | 14% | 20% | 12% | 46% | 8% |
Marimekko
Stacked Charts
| region | Core | Pro | Enterprise | Add-ons |
|---|---|---|---|---|
| EMEA · 34% | 13.3% | 11.6% | 6.1% | 3.1% |
| North America · 29% | 8.7% | 9.9% | 7.5% | 2.9% |
| APAC · 22% | 6.8% | 7.5% | 4.4% | 3.3% |
| LatAm · 10% | 3.7% | 2.3% | 2.8% | 1.2% |
| Other · 5% | 2.2% | 1.6% | 0.9% | 0.4% |
Gapped Horizontal Stacked Bar
Stacked Charts
| week | Search | Social | Direct | |
|---|---|---|---|---|
| Week 1 | 18 | 14 | 16 | 22 |
| Week 2 | 25 | 19 | 19 | 26 |
| Week 3 | 21 | 15 | 22 | 22 |
| Week 4 | 28 | 20 | 25 | 26 |
| Week 5 | 24 | 16 | 18 | 22 |
| Week 6 | 20 | 21 | 21 | 26 |
| Week 7 | 27 | 17 | 24 | 22 |
State – Loading
Stacked Charts
State – Hover
Stacked Charts
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | 14k | 10k | 5k |
| Feb | 18k | 11k | 7k |
| Mar | 16k | 10k | 6k |
| Apr | 20k | 14k | 8k |
| May | 19k | 13k | 7k |
| Jun | 23k | 15k | 9k |
| Jul | 21k | 14k | 8k |
| Aug | 25k | 16k | 10k |
| Sep | 22k | 15k | 9k |
| Oct | 20k | 13k | 8k |
| Nov | 24k | 16k | 10k |
| Dec | 27k | 17k | 11k |
State – Legend Toggled
Stacked Charts
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | 14k | 10k | 5k |
| Feb | 18k | 11k | 7k |
| Mar | 16k | 10k | 6k |
| Apr | 20k | 14k | 8k |
| May | 19k | 13k | 7k |
| Jun | 23k | 15k | 9k |
| Jul | 21k | 14k | 8k |
| Aug | 25k | 16k | 10k |
| Sep | 22k | 15k | 9k |
| Oct | 20k | 13k | 8k |
| Nov | 24k | 16k | 10k |
| Dec | 27k | 17k | 11k |
State – Selected Range
Stacked Charts
| month | Direct | Organic | Referral |
|---|---|---|---|
| Jan | 14k | 10k | 5k |
| Feb | 18k | 11k | 7k |
| Mar | 16k | 10k | 6k |
| Apr | 20k | 14k | 8k |
| May | 19k | 13k | 7k |
| Jun | 23k | 15k | 9k |
| Jul | 21k | 14k | 8k |
| Aug | 25k | 16k | 10k |
| Sep | 22k | 15k | 9k |
| Oct | 20k | 13k | 8k |
| Nov | 24k | 16k | 10k |
| Dec | 27k | 17k | 11k |
In context
How the component is used inside real screens — the same compositions as the Usage section of the Figma page.
Requests by Status Code
Edge network requests stacked by status code per two hours; the legend switches classes off.
Requests by status code
Edge network, last 24 hours
| hour | 2xx | 3xx | 4xx | 5xx |
|---|---|---|---|---|
| 00:00 | 4.2k | 600 | 220 | 40 |
| 02:00 | 4.9k | 811 | 317 | 93 |
| 04:00 | 5.7k | 622 | 234 | 76 |
| 06:00 | 6.4k | 833 | 331 | 59 |
| 08:00 | 4.7k | 644 | 248 | 42 |
| 10:00 | 5.5k | 855 | 345 | 95 |
| 12:00 | 6.2k | 666 | 262 | 78 |
| 14:00 | 4.5k | 877 | 359 | 61 |
| 16:00 | 5.2k | 688 | 276 | 44 |
| 18:00 | 6k | 899 | 373 | 97 |
| 20:00 | 4.3k | 710 | 290 | 80 |
| 22:00 | 5k | 921 | 387 | 63 |
Plan Mix 100 %
Share of MRR by plan per month.
Plan mix
Share of MRR by plan
| month | Starter | Pro | Team |
|---|---|---|---|
| Jan | 42% | 38% | 20% |
| Feb | 41% | 38% | 21% |
| Mar | 39% | 39% | 22% |
| Apr | 38% | 40% | 22% |
| May | 36% | 41% | 23% |
| Jun | 35% | 41% | 24% |
| Jul | 33% | 42% | 25% |
| Aug | 32% | 43% | 25% |
| Sep | 31% | 43% | 26% |
| Oct | 30% | 44% | 26% |
| Nov | 28% | 45% | 27% |
| Dec | 27% | 45% | 28% |
Tickets by Channel
Support tickets per week stacked by channel, next to the agent list.
Tickets by channel
| week | Chat | Phone | |
|---|---|---|---|
| W35 | 120 | 90 | 40 |
| W36 | 157 | 119 | 57 |
| W37 | 134 | 148 | 44 |
| W38 | 171 | 107 | 61 |
| W39 | 148 | 136 | 48 |
| W40 | 125 | 95 | 65 |
| W41 | 162 | 124 | 52 |
| W42 | 139 | 153 | 69 |
Agents
Tickets solved this week
- ALAlina LorenzAvg. reply 2m 10s64tickets
- FBFelix BrandtAvg. reply 2m 42s58tickets
- MJMara JensenAvg. reply 3m 05s51tickets
Anatomy
The parts the component is made of. Each one renders a you can target from CSS.
- data-slot="chart-active"
API Reference
| Prop | Type | Default |
|---|---|---|
| variant | "stacked-bar" | "stacked-bar-100" | "horizontal-stacked-bar" | "stacked-area" | "stacked-area-100" | "stacked-gradient-bar" | "diverging-stacked-bar" | "marimekko" | "gapped-horizontal-stacked-bar" | "stacked-bar" |
| data | Record<string, unknown>[] | — |
| index | string | — |
| series | { key, label?, color?, dashed? }[] | — |
| height | number | 434 |
| state | "ready" | "loading" | "empty" | "error" | "ready" |
| label | string | — |
| valueFormatter | (v: number) => string | 42000 → 42k |
| hiddenSeries | string[] | — |
| activeIndex / defaultActiveIndex | number | null | — |
| selectedRange / onSelectedRangeChange | [number, number] | null | — |
| tooltip | boolean | true |
| animate | boolean | true |
| onRetry | () => void | — |
| negativeCount · showSegmentLabels | variant options | — |
| activeIndex | number | null | — |
| animationKey | string | number | — |
| axisFormatter | ChartValueFormatter | — |
| barWidth | number | — |
| categoryAxis | boolean | — |
| categoryFormatter | (label: string) => string | — |
| categoryTicks | readonly string[] | — |
| className | string | — |
| defaultActiveIndex | number | null | — |
| defaultSelectedRange | ChartRange | null | — |
| description | string | — |
| emptyDescription | string | — |
| emptyTitle | string | — |
| errorDescription | string | — |
| errorTitle | string | — |
| grid | boolean | — |
| gridIntervals | number | — |
| gridStyle | "solid" | "dashed" | — |
| includeZero | boolean | — |
| negativeCount | number | — |
| onActiveIndexChange | (index: number | null) => void | — |
| onSelectedRangeChange | (range: ChartRange | null) => void | — |
| rangeSelectable | boolean | — |
| segmentGap | number | — |
| selectedRange | ChartRange | null | — |
| showSegmentLabels | boolean | true |
| tooltipTitle | (datum: ChartDatum, index: number) => React.ReactNode | — |
| valueAxis | boolean | — |
| valueAxisSide | "left" | "right" | — |
| valueDomain | readonly [number, number] | — |
| valueTicks | readonly number[] | — |
| width | number | — |
Theming
The CSS variables this component reads. Set one on any wrapper to restyle everything inside it. More in Theming.
| Variable | Used for | Default |
|---|---|---|
| Color | ||
| Stroke | #FFFFFFdark #1C1D20 | |
| Motion | ||
| Duration | 250ms | |
| Easing | cubic-bezier(0.22, 1, 0.36, 1) | |