Skip to content

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.

On this page
  1. Preview
  2. Choosing a chart
  3. Over time
  4. Categories
  5. Shares and ranges
  6. Patterns
  7. Chart header
  8. Series colors
  9. Sparkline and Legend
  10. Parts
  11. Properties
  12. Tokens
  13. iOS and Material 3
  14. Accessibility
  15. Guidelines

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.

Bar361 wide, bar 24, track 8 radius, average line dashed
Revenue this week11,72012.4%vs last week
MonTueWedThuFri2.6kSatSunAvg 1.7k

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.

Charts, data shape, use it for, rule from the set description
ChartData shapeUse it forRule
LineTwo series over ordered pointsA trend and its comparison periodSmoothing never passes a data point. Scrub, tooltip and range are optional.
AreaParts of one total over timeChannels that share a totalThree bands on the brand ramp, the total as a line 2.5 wide.
CandlestickOpen, high, low and close per dayA price over a monthEach candle opens on the previous close. A 7 day average and a dashed last price line.
BarOne series over categoriesA weekly total with one column highlightedNo y axis. The value sits on the highlighted column.
Bar - GroupedTwo series per categoryThis period against lastTwo series at most. A third bar in a 41 wide column is 12 wide and unreadable.
Bar - StackedParts of each column totalHow each column splitsThree segments at most. Past that the middle bands cannot be compared.
Bar - HorizontalRanked categories with word namesTop sources, top pagesUse it when names are words, not dates. A word does not fit under a column.
WaterfallA start total, steps, an end totalA bridge such as monthly recurring revenueGains green, losses red, totals in chart/series-1.
DonutParts of a wholeA split of one totalFour segments at most, largest first, from twelve o'clock clockwise.
RingProgress against targetsDaily goalsThree rings at most. Each needs a legend row because an arc does not say what it counts.
GaugeOne value in a known rangeStorage, a credit scoreOnly with a real maximum. With no ceiling, show the number alone.
BulletActual against a targetProgress toward a targetTone the bar by whether the target was met.
FunnelSteps of a conversionWhere people drop offFour steps is the mobile limit. Show the drop between steps.
HeatmapIntensity by week and dayActivity and streaksFive levels. Swap the level to change a cell.
ScatterTwo values per point, two groupsA correlationA dashed trend with its confidence band and one highlighted point.
RadarSix values on one scaleThe profile of one subjectSix 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.

Line361 by 386, this week 2.5 wide, last week dashed
Sessions18,20412.4%vs last week
MonTueWedThuFriSatSun
  • This week
  • Last week
Area361 by 386, bands at alpha 72, 48, 24
Active users2,9408.1%vs last week
MonTueWedThuFriSatSun
  • Organic
  • Paid
  • Referral
Candlestick361 by 292, wick 1, body 7
BTC / EUR58,4204.5%this month
58.4k1 Sep8 Sep15 Sep22 Sep

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.

Bar with Show Track361 by 292, bars 24 wide, 12 apart
Revenue this week11,72012.4%vs last week
MonTueWedThuFri2.6kSatSunAvg 1.7k
Bar - Grouped361 by 328, two bars of 19.64, 2 apart
Orders this week vs last1,28412.4%vs last week
MonTueWedThuFriSatSun
  • This week
  • Last week
Bar - Stacked361 by 328, three segments, 2 apart
Sessions by channel48,12012.4%vs last week
MonTueWedThuFriSatSun
  • Direct
  • Search
  • Social
Bar - Horizontal361 by 236, track 229 by 8
Top sources9,41012.4%vs last month
Direct3,820Search2,640Social1,480Referral940Email530
Waterfall361 by 292, bars 32 wide
Net change+1,86038.8%MRR this quarter
4.8kStart+3.6kNew+1.4kUpsell−1.1kDownsell−2.0kChurn6.7kEnd

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.

Donut361 by 160, ring 160, band 20
1,240TotalGroceries45%Transport25%Dining20%Other10%
Ring361 by 240, rings 16 wide, 2 apart
Daily goals67%
Move780 / 1,000Exercise33 / 60 minStand8 / 12 h
Gauge361 by 235, half circle 240, band 20
Storage used64.2 GB
64%of 100 GB0100 GB
Bullet361 by 294, track 10, tick 2 by 16
Against target3 of 5 on track
Revenue78%Signups92%Retention54%NPS66%Churn38%
Funnel361 by 364, bars 26 high, radius 8
Signup funnel8.3% end to end12.4%vs last month
Visited12,480↓ 67% dropSigned up4,120↓ 47% dropActivated2,180↓ 52% dropSubscribed1,040

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.

Heatmap361 by 312, cells 22, 3 apart
Active days58 of 91
Scatter361 by 300, dots 6 to 12
Spend vs revenuer = 0.82
  • New
  • Returning
Radar361 by 332, radius 96, rings at 100, 75, 50, 25
Squad profile78 overall
Pace86Shot78Pass81Drib84Def62Phys74

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.

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.

Series 1 to 4, muted and softseries 1 to 4, then muted and soft
  • 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.

Legend, Horizontal and VerticalHorizontal 361 by 52, Vertical 180 by 116
  • Groceries45%
  • Transport25%
  • Dining20%
  • Other10%

Horizontal

  • Groceries45%
  • Transport25%
  • Dining20%
  • Other10%

Vertical

Sparkline, Trend Up, Down and Flat, then Show Dot off64 by 20, line 1.5, dot 4

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.

Tooltip, Point Below and AboveTooltip 68 by 35.75, point 12, cell 16, column 40 by 184

Below

Above

Point, Tone by State

Brand

Success

Error

Brand, Dimmed

Success, Dimmed

Error, Dimmed

Cell, Level 0 to 4

0

1

2

3

4

Column, Emphasis Solid then Soft, by Tone
24Mon

Brand, Solid

24Mon

Neutral, Solid

24Mon

Success, Solid

24Mon

Error, Solid

24Mon

Brand, Soft

24Mon

Neutral, Soft

24Mon

Success, Soft

24Mon

Error, Soft

Grid

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.

Properties of the charts, property, type, default, charts that have it
PropertyTypeDefaultCharts that have it
Show HeaderbooleantrueAll but Donut and Ring
LabeltextPer chartAll but Donut and Ring
ValuetextPer chartAll but Donut and Ring
Show ContextbooleantrueAll but Donut and Ring. False by default on Gauge, Bullet, Heatmap, Scatter and Radar
ContexttextPer chartAll but Donut and Ring
Show GridlinesbooleantrueLine, Area, Bar, Grouped, Stacked, Candlestick, Scatter
Show LabelsbooleantrueLine, Area
Show PointsbooleantrueLine
Show TooltipbooleantrueLine, Area
Show RangebooleantrueLine, Area
Show LegendbooleantrueGrouped, Donut, Ring
Show TrackbooleanfalseBar
AveragebooleantrueBar
Average ValuetextAvg 1.7kBar
Text defaults of the charts, chart, label, value, context
ChartLabelValueContext
LineSessions18,204vs last week
AreaActive users2,940vs last week
BarRevenue this week11,720vs last week
Bar - GroupedOrders this week vs last1,284vs last week
Bar - StackedSessions by channel48,120vs last week
Bar - HorizontalTop sources9,410vs last month
WaterfallNet change+1,860MRR this quarter
CandlestickBTC / EUR58,420this month
GaugeStorage used64.2 GBof 100 GB
BulletAgainst target3 of 5 on trackvs last quarter
FunnelSignup funnel8.3% end to endvs last month
HeatmapActive days58 of 91Longest streak 12 days
ScatterSpend vs revenuer = 0.82Strong correlation
RadarSquad profile78 overallvs last season
Properties of Legend, Sparkline and the parts, set, property, values, default
SetPropertyValuesDefault
Chart / LegendOrientationHorizontal, VerticalHorizontal
SparklineTrendUp, Down, FlatUp
SparklineShow Dotbooleantrue
_Chart PointToneBrand, Success, ErrorBrand
_Chart PointStateDefault, DimmedDefault
_Chart CellLevel0, 1, 2, 3, 40
_Chart TooltipPointBelow, AboveBelow
_Chart TooltipValuetext12,480
_Chart ColumnToneBrand, Neutral, Success, ErrorBrand
_Chart ColumnEmphasisSolid, SoftSolid
_Chart ColumnLabel, ValuetextMon, 24
_Chart ColumnShow Valuebooleantrue

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.

Tokens, token, light, dark, applied to
TokenLightDarkApplied to
chart/series-1#155DFC#2B7FFFFirst series: this week, Solid columns, Donut and Heatmap peak, Scatter New
chart/series-2#7D52F4#693EE0Second series: Donut, Stacked middle, Scatter Returning
chart/series-3#22D3BB#1DAF9CThird series: Donut, Stacked top
chart/series-4#FE9A00#E17100Fourth 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#16A34AGains, up candles, target met, Ring Exercise, Trend Up
state/error/base-500#FB2C36#FB2C36Losses, down candles, target missed, Trend Down
state/warning/base-500#FF6900#F54900Ring 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#86EFACTrend 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#48484AGauge, Horizontal and Bullet tracks
bg/weak-50#F4F5F5#242427Heatmap level 0, Bar track, Range
bg/sub-300#C7C7CC#8E8E93Column Neutral Solid
bg/white-0#FFFFFF#0E0E0FSurface: point rings, Area seams, tooltip text
border/sub-200#D1D1D6#48484AGrid, cursor, connectors
border/soft-100#E9E9EA#2F2F31Candlestick and Scatter gridlines, Radar rings
fg/strong-950#0E0E0F#FFFFFFValues, tooltip fill, Bullet tick
fg/sub-700#48484A#C7C7CCTitles, axis labels, legend labels
fg/soft-500#8E8E93#AEAEB2Axis ticks, Funnel drops, context text
text/on-color/strong#FFFFFF#FFFFFFCandlestick 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
Appetite UI chartiOS counterpartMaterial 3 counterpartWhat differs
Line, Area, Bar, Grouped, StackedLineMark, AreaMark, BarMark in Swift Charts, code onlyNoneThe weekly charts have no y axis. The value sits on the highlighted column and the plot keeps its 361.
DonutSectorMark in Swift Charts, code onlyNoneFour segments, 2 degrees apart, a 20 band on a 160 ring.
GaugeThe SwiftUI Gauge viewNoneA half circle 240 wide with a 20 band and a required real maximum.
Scatter, HeatmapPointMark, RectMark in Swift ChartsNoneCells of 22 on a five step brand ramp, dots 6 to 12 across with a surface ring.
Ring, Bullet, Funnel, Waterfall, Candlestick, Radar, SparklineNone as a componentNoneBuilt 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 accessibilityLabel and accessibilityValue on each mark. On Android set contentDescription on the chart and a semantics node for each value. On the web give the svg role="img" and an aria-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.

1,240Total

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.

64%of 100 GB0100 GB

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.