Updated
Chart
Chart is a set of mobile chart types, one for each common data shape. Every one is 361 wide so it fits a 393 point screen, and all of them are drawn on the same four series colors, so a chart answers one question at a glance.
Updated
On this page
Preview
Weekly revenue as a bar chart. One column is Solid and carries its value, the other six rest in Soft, and a dashed line marks the average.
Chart ships with 16 types, plus Legend and Sparkline. Every drawing on this page is a live SVG colored only by tokens, so switch the theme and it redraws in Dark. The charts and the Sparkline play their entrance from the Figma file once, as you scroll to them.
Which chart should I use?
Pick by the shape of the data. A trend over time takes Line, a comparison between categories takes a bar, a share of a whole takes Donut, one value inside a known range takes Gauge.
| Chart | Data shape | Use it for | Rule |
|---|---|---|---|
| Line | Two series over ordered points | A trend and its comparison period | Smoothing never passes a data point. Scrub, tooltip and range are optional. |
| Area | Parts of one total over time | Channels that share a total | Three bands on the brand ramp, the total as a line 2.5 wide. |
| Candlestick | Open, high, low and close per day | A price over a month | Each candle opens on the previous close. A 7 day average and a dashed last price line. |
| Bar | One series over categories | A weekly total with one column highlighted | No y axis. The value sits on the highlighted column. |
| Bar - Grouped | Two series per category | This period against last | Two series at most. A third bar in a 41 wide column is 12 wide and unreadable. |
| Bar - Stacked | Parts of each column total | How each column splits | Three segments at most. Past that the middle bands cannot be compared. |
| Bar - Horizontal | Ranked categories with word names | Top sources, top pages | Use it when names are words, not dates. A word does not fit under a column. |
| Waterfall | A start total, steps, an end total | A bridge such as monthly recurring revenue | Gains green, losses red, totals in chart/series-1. |
| Donut | Parts of a whole | A split of one total | Four segments at most, largest first, from twelve o'clock clockwise. |
| Ring | Progress against targets | Daily goals | Three rings at most. Each needs a legend row because an arc does not say what it counts. |
| Gauge | One value in a known range | Storage, a credit score | Only with a real maximum. With no ceiling, show the number alone. |
| Bullet | Actual against a target | Progress toward a target | Tone the bar by whether the target was met. |
| Funnel | Steps of a conversion | Where people drop off | Four steps is the mobile limit. Show the drop between steps. |
| Heatmap | Intensity by week and day | Activity and streaks | Five levels. Swap the level to change a cell. |
| Scatter | Two values per point, two groups | A correlation | A dashed trend with its confidence band and one highlighted point. |
| Radar | Six values on one scale | The profile of one subject | Six axes with rings at 25, 50, 75 and 100. |
The rules are the ones each Figma component states in its own description.
Line, Area and Candlestick
Use these when the x axis is time. Line compares two periods, Area splits one total into channels, Candlestick shows the range of a price on each day.
- This week
- Last week
- Organic
- Paid
- Referral
Line and Area curves are Catmull-Rom smoothing converted to cubic Beziers, so the curve bends between points and every point stays where the data put it. A curve that passes beside a data point misstates the data. Show Tooltip and Show Range are properties, and Range is a Segmented Control at Size Small with five tabs.
Bar, Grouped, Stacked, Horizontal and Waterfall
Use these to compare categories. Vertical bars suit days and months, Horizontal suits names, Waterfall suits a total that changes in steps.
- This week
- Last week
- Direct
- Search
- Social
Show Track draws a Weak track behind every column and is off by default, which is how the Preview draws Bar. Bars are 24 wide in a 41 wide column, columns are 12 apart, and every column stands on a baseline 8 above its label. On Bar a column is as tall as the value divided by the maximum, times 136, plus 48. Grouped and Stacked show no values on the bars.
Donut, Ring, Gauge, Bullet and Funnel
Use these for a share, a progress or a position: Donut and Ring for parts of a whole, Gauge for one value in a range, Bullet for a target, Funnel for conversion.
Donut segments start at twelve o'clock and run clockwise, 2 degrees apart, so a reader always starts in the same place. Ring arcs have butt ends. The Gauge value ends in round caps made of circles 20 across. In Bullet the tick is the target and the bar is where you are.
Heatmap, Scatter and Radar
Use these to show a pattern: Heatmap for intensity by day, Scatter for two measures at once, Radar for the profile of one subject on six axes.
- New
- Returning
Heatmap fills the 361 with 13 weeks of 22 wide cells and 3 between them. Its five levels are tokens on the brand ramp, so a level changes the token and a hand set fill never appears. Scatter sizes its dots by group, 6 to 10 across for New and 8 to 12 for Returning, with a ring in the surface color so overlaps stay separate.
What does every chart header carry?
Every chart opens with the same header: a title, a value and, on the time charts, a trend chip with a comparison text. Show Header turns it off when the surrounding card already carries a title.
The header is 88 high with a context row and 60 without one. Ring, Gauge, Bullet, Heatmap, Scatter and Radar use the short header, and Donut has none. Label, Value, Show Context and Context are properties, so the title and the figure are text you edit.
How many series does the palette carry?
Four. chart/series-1 to chart/series-4 are the categorical colors, and chart/muted and chart/soft are the neutrals a chart pairs with them. Past four series, switch to a bar chart or group the rest as Other.
- chart/series-1First series
- chart/series-2Second series
- chart/series-3Third series
- chart/series-4Fourth series
- chart/mutedComparison, other
- chart/softColumns at rest
Series 1 is the brand blue. Each series has a Light and a Dark value, listed in the Tokens table, and the Dark values differ from Light. Two charts use the brand ramp instead of series colors: Area takes alpha 72, 48 and 24, and Heatmap takes alpha 24, 48 and 72 below chart/series-1.
Sparkline and Legend
Two pieces every chart reuses, published so a list row or a metric card can use them too. Legend is the color key, Sparkline is a trend line that carries shape and no values.
- Groceries45%
- Transport25%
- Dining20%
- Other10%
Horizontal
- Groceries45%
- Transport25%
- Dining20%
- Other10%
Vertical
Up
Down
Flat
Show Dot off
Use Horizontal under a wide chart and Vertical beside a Donut or Ring, and order the rows by value, largest first. All Sparkline trends share one vertical domain of 0 to 20, so a flat trend sits at mid height and a rising one never fills the box. Pair a Sparkline with the number it belongs to.
Which parts build the charts?
Five parts build the charts. They are underscore components, kept out of the published library, and an instance of each sits inside the charts above.
Below
Above
Brand
Success
Error
Brand, Dimmed
Success, Dimmed
Error, Dimmed
0
1
2
3
4
Brand, Solid
Neutral, Solid
Success, Solid
Error, Solid
Brand, Soft
Neutral, Soft
Success, Soft
Error, Soft
Point Dimmed is 35 percent opacity. Column has a 16 value slot over the bar and a 16 label under it, so a column is the bar plus 48. Give the column its height and the bar fills what is left. Put Grid behind the marks.
Properties
Each chart is one component with Show and text properties and no variants. Legend and Sparkline are sets, and the five parts are sets or components of their own.
| Property | Type | Default | Charts that have it |
|---|---|---|---|
Show Header | boolean | true | All but Donut and Ring |
Label | text | Per chart | All but Donut and Ring |
Value | text | Per chart | All but Donut and Ring |
Show Context | boolean | true | All but Donut and Ring. False by default on Gauge, Bullet, Heatmap, Scatter and Radar |
Context | text | Per chart | All but Donut and Ring |
Show Gridlines | boolean | true | Line, Area, Bar, Grouped, Stacked, Candlestick, Scatter |
Show Labels | boolean | true | Line, Area |
Show Points | boolean | true | Line |
Show Tooltip | boolean | true | Line, Area |
Show Range | boolean | true | Line, Area |
Show Legend | boolean | true | Grouped, Donut, Ring |
Show Track | boolean | false | Bar |
Average | boolean | true | Bar |
Average Value | text | Avg 1.7k | Bar |
| Chart | Label | Value | Context |
|---|---|---|---|
| Line | Sessions | 18,204 | vs last week |
| Area | Active users | 2,940 | vs last week |
| Bar | Revenue this week | 11,720 | vs last week |
| Bar - Grouped | Orders this week vs last | 1,284 | vs last week |
| Bar - Stacked | Sessions by channel | 48,120 | vs last week |
| Bar - Horizontal | Top sources | 9,410 | vs last month |
| Waterfall | Net change | +1,860 | MRR this quarter |
| Candlestick | BTC / EUR | 58,420 | this month |
| Gauge | Storage used | 64.2 GB | of 100 GB |
| Bullet | Against target | 3 of 5 on track | vs last quarter |
| Funnel | Signup funnel | 8.3% end to end | vs last month |
| Heatmap | Active days | 58 of 91 | Longest streak 12 days |
| Scatter | Spend vs revenue | r = 0.82 | Strong correlation |
| Radar | Squad profile | 78 overall | vs last season |
| Set | Property | Values | Default |
|---|---|---|---|
Chart / Legend | Orientation | Horizontal, Vertical | Horizontal |
Sparkline | Trend | Up, Down, Flat | Up |
Sparkline | Show Dot | boolean | true |
_Chart Point | Tone | Brand, Success, Error | Brand |
_Chart Point | State | Default, Dimmed | Default |
_Chart Cell | Level | 0, 1, 2, 3, 4 | 0 |
_Chart Tooltip | Point | Below, Above | Below |
_Chart Tooltip | Value | text | 12,480 |
_Chart Column | Tone | Brand, Neutral, Success, Error | Brand |
_Chart Column | Emphasis | Solid, Soft | Solid |
_Chart Column | Label, Value | text | Mon, 24 |
_Chart Column | Show Value | boolean | true |
Line, Area, Stacked and Scatter draw a key row under the plot that has no property of its own.
Read from the component property definitions of the Chart page on October 2, 2026.
Tokens
Series colors are their own variables, so a rebrand moves the charts with the rest of the kit. Everything else is a neutral or state token the components already use.
| Token | Light | Dark | Applied to |
|---|---|---|---|
chart/series-1 | #155DFC | #2B7FFF | First series: this week, Solid columns, Donut and Heatmap peak, Scatter New |
chart/series-2 | #7D52F4 | #693EE0 | Second series: Donut, Stacked middle, Scatter Returning |
chart/series-3 | #22D3BB | #1DAF9C | Third series: Donut, Stacked top |
chart/series-4 | #FE9A00 | #E17100 | Fourth series |
chart/muted | #D1D1D6 | #6A7282 at 24% | Comparison period, last week bars, Other |
chart/soft | #DEDEE0 | #6A7282 at 24% | Columns at rest on Bar |
brand/alpha-10 | #2B7FFF at 10% | #2B7FFF at 10% | Average pill, Funnel track, Scatter band |
brand/alpha-16 | #2B7FFF at 16% | #2B7FFF at 16% | Radar fill, Ring Move track |
brand/alpha-24 | #2B7FFF at 24% | #2B7FFF at 24% | Area third band, Heatmap level 1 |
brand/alpha-48 | #2B7FFF at 48% | #2B7FFF at 48% | Area second band, Heatmap level 2 |
brand/alpha-72 | #2B7FFF at 72% | #2B7FFF at 72% | Area first band, Heatmap level 3, Scatter trend |
state/success/base-500 | #22C55E | #16A34A | Gains, up candles, target met, Ring Exercise, Trend Up |
state/error/base-500 | #FB2C36 | #FB2C36 | Losses, down candles, target missed, Trend Down |
state/warning/base-500 | #FF6900 | #F54900 | Ring Stand arc |
state/success/lighter-50 | #F0FDF4 | #22C55E at 16% | Trend chip, Ring Exercise track |
state/warning/lighter-50 | #FFF7ED | #FF6900 at 16% | Ring Stand track |
state/success/dark-950 | #09361B | #86EFAC | Trend chip text and arrow |
state/success/light-200 | #BBF7D0 | #22C55E at 24% | Column Success Soft |
state/error/light-200 | #FFC9C9 | #FB2C36 at 24% | Column Error Soft |
bg/soft-100 | #E9E9EA | #48484A | Gauge, Horizontal and Bullet tracks |
bg/weak-50 | #F4F5F5 | #242427 | Heatmap level 0, Bar track, Range |
bg/sub-300 | #C7C7CC | #8E8E93 | Column Neutral Solid |
bg/white-0 | #FFFFFF | #0E0E0F | Surface: point rings, Area seams, tooltip text |
border/sub-200 | #D1D1D6 | #48484A | Grid, cursor, connectors |
border/soft-100 | #E9E9EA | #2F2F31 | Candlestick and Scatter gridlines, Radar rings |
fg/strong-950 | #0E0E0F | #FFFFFF | Values, tooltip fill, Bullet tick |
fg/sub-700 | #48484A | #C7C7CC | Titles, axis labels, legend labels |
fg/soft-500 | #8E8E93 | #AEAEB2 | Axis ticks, Funnel drops, context text |
text/on-color/strong | #FFFFFF | #FFFFFF | Candlestick price tag |
The header context text binds text/soft-500, which resolves to the same values as fg/soft-500.
Read as bound variable names from the Chart page, Light and Dark, on October 2, 2026.
How do the charts compare with Swift Charts and Material 3?
Appetite UI draws its own charts, one set for both platforms. Apple ships charts as the Swift Charts framework and Material 3 publishes no chart component, so neither the iOS pages nor the Material 3 pages of the file carry a chart to mirror.
| Appetite UI chart | iOS counterpart | Material 3 counterpart | What differs |
|---|---|---|---|
| Line, Area, Bar, Grouped, Stacked | LineMark, AreaMark, BarMark in Swift Charts, code only | None | The weekly charts have no y axis. The value sits on the highlighted column and the plot keeps its 361. |
| Donut | SectorMark in Swift Charts, code only | None | Four segments, 2 degrees apart, a 20 band on a 160 ring. |
| Gauge | The SwiftUI Gauge view | None | A half circle 240 wide with a 20 band and a required real maximum. |
| Scatter, Heatmap | PointMark, RectMark in Swift Charts | None | Cells of 22 on a five step brand ramp, dots 6 to 12 across with a surface ring. |
| Ring, Bullet, Funnel, Waterfall, Candlestick, Radar, Sparkline | None as a component | None | Built in Appetite UI from the same header, grid and tokens as the rest. |
Charts belong to the platform neutral data layer next to Table, and the drawing is the same on iOS and on Android.
Apple's pages and the Material 3 pages in the Figma file have no chart, gauge or sparkline page, checked by name on October 2, 2026.
How do I label a chart for accessibility?
Give the plot an image role and a label that states the data, or put the values in a table beside it. A chart drawn as vectors is one picture to a screen reader, so the label has to carry what a sighted reader gets from the shapes.
- Write the label as data. Give the chart type, the subject, the period and the one fact the highlight states. Every specimen above does it, for example "Line chart: sessions this week against last week, Monday to Sunday. The week peaks on Saturday at 3,200."
- Expose the values yourself. On iOS use
accessibilityLabelandaccessibilityValueon each mark. On Android setcontentDescriptionon the chart and a semantics node for each value. On the web give the svgrole="img"and anaria-label, and keep a visually hidden table next to dense charts such as Heatmap, Scatter and Candlestick. - Let color repeat a value. Waterfall prints a plus or minus sign, Funnel prints its drop, Bullet prints the percent beside the bar, and Donut and Ring print every value in the legend.
- Mind the contrast of small labels. In Light, the 12 point gain labels on Waterfall in state/success/base-500 measure 2.3 to 1 on white and the axis ticks in fg/soft-500 measure 3.3 to 1, so both repeat what a bar already says. A label that carries data on its own uses fg/sub-700 or fg/strong-950.
- Size the controls. The Range row is a Segmented Control at Size Small with segments 30 high, and its hit area still has to reach 44 pt on iOS and 48 dp on Android, the platform/min-touch-target values.
- Respect reduced motion. Draw the finished chart and skip the entrance. The specimens on this page play theirs only while prefers-reduced-motion allows motion, and otherwise open finished.
If a reader needs a number, show it as text next to the chart. The specimens above are pictures: none takes focus, and the Range row is hidden from assistive technology.
Guidelines
Charts fail when they promise more than they can show. Keep to the limits each set states.
Do
Keep a Donut to four segments, largest first, starting at twelve o'clock. Group the tail as Other in chart/muted.
Don't
Do not slice a Donut into seven. Past four segments a bar chart reads faster, because nobody compares seven angles.
Do
Use a Gauge when the maximum is real, like storage or a credit score. The range under the arc says what a full arc means.
Don't
Do not draw a Gauge with an invented ceiling. With no real maximum, show the number alone: a made up maximum states a progress that does not exist.
Grouped is two series at most and Stacked is three segments at most. Show the drop between Funnel steps as well as the totals, and stop at four steps on a phone. Tone a Bullet by whether the target was met. Pair every Sparkline with the number it belongs to.
Count: 16 charts, plus Legend and Sparkline, on the Chart page of the Figma file.