Charts and graphs help users understand data quickly.
This guidance helps teams choose and design charts and graphs that communicate data clearly and consistently across NSW digital products. This guidance was previously titled ‘Data visualisation’. The rename to ‘Charts and graphs’ aligns with the NSW Brand Toolkit and reflects the current scope of this guidance.
It covers common chart types used in services and dashboards, including bar charts, line charts, scatter plots and similar formats. The guidance is tool-agnostic and applies regardless of charting library or platform.
It sets shared principles for clarity, accessibility and consistency rather than prescribing exact implementation. Teams using custom visualisation tools such as D3 should apply the same principles to ensure charts remain understandable and accessible.
These use cases may require bespoke design and technical decisions beyond the scope of the design system. Future guidance may expand to cover additional visualisation types as needs mature.
These principles apply to all charts and graphs in NSW digital products.
Every chart communicates something. Be clear on what that is before you choose how to show it.
Use honest scales, meaningful baselines and clear labels. Let the data speak for itself.
Remove anything that doesn’t help the reader get to the insight faster. If a chart is trying to say everything, it ends up saying nothing.
Ensure sufficient colour contrast, label data directly where possible, and always provide a text or table alternative.
Use the approved palette, typeface and spacing so charts feel recognisably NSW Government.
Set up your charting tool to enforce accessibility, clarity and brand from the start.
Each chart type is designed to reveal a specific kind of relationship in data, and choosing the wrong one obscures the message rather than clarifying it.
The most common relationships are comparison and ranking, trend, proportion, distribution and correlation.
You may not need a chart at all. If a single number tells the story, use a callout value. If users need precise figures, use a table. Only use a chart when the visual pattern adds meaning the data alone cannot.
Chart examples on this page use Chart.js but the guidance applies regardless of which charting library you use.
For additional chart relationships and examples, refer to the Financial Times Visual Vocabulary.
The default choice for comparing value across categories. Switch to horizontal bars if category labels are long.
Summary: City of Sydney and Parramatta assessed the highest number of applications in Q1 2025, together accounting for over a third of the total.
| Local government area | Applications assessed |
|---|---|
| City of Sydney | 312 |
| Parramatta | 284 |
| Blacktown | 251 |
| Liverpool | 198 |
| Penrith | 176 |
| Camden | 143 |
Source: NSW Planning Portal. Last updated: March 2025.
Use when showing a ranked list, or when category labels are too long to read on a vertical chart.
Summary: Rental Assistance for Vulnerable Households received the largest allocation, at nearly three times the funding of the smallest programme.
| Programme | Funding ($M) |
|---|---|
| Rental Assistance for Vulnerable Households | 48.2 |
| Small Business Digital Transformation Grant | 31.6 |
| Regional Infrastructure Maintenance Program | 27.4 |
| Early Childhood Development Support Initiative | 22.8 |
| Aboriginal Community Housing Improvement Fund | 18.3 |
| Domestic Violence Crisis Response Program | 14.7 |
Source: Service NSW. Last updated: June 2025.
Shows the composition of a whole across categories, making it easy to spot differences in the mix. Keep segments to three or four and label clearly.
Summary: Digital contact grew steadily across all four quarters, while phone and in-person volumes declined. By Q4, digital accounted for more than two-thirds of all requests.
| Quarter | Phone | Digital | In person |
|---|---|---|---|
| Q1 | 4,200 | 5,800 | 1,100 |
| Q2 | 3,900 | 6,400 | 980 |
| Q3 | 3,600 | 7,100 | 890 |
| Q4 | 3,200 | 8,200 | 760 |
Source: Service NSW. Last updated: June 2025.
Compares two or more series side by side within each category, making it easy to see differences between series at a glance.
Summary: Approval rates were consistent across all categories, ranging from 87% to 89%. Building contractor licences had the highest volume overall.
| Licence category | Lodged | Approved |
|---|---|---|
| Contractor licence -- building | 1,840 | 1,620 |
| Contractor licence -- electrical | 1,210 | 1,090 |
| Supervisor certificate | 980 | 870 |
| Tradesperson certificate | 760 | 690 |
| Owner-builder permit | 430 | 380 |
Source: NSW Fair Trading. Last updated: June 2025.
The standard choice for showing change over a continuous time period. Use multi-line when you need to compare more than one series.
Summary: Incidents were highest in summer months, peaking in December and January. July recorded the lowest monthly total for the year.
| Month | Incidents |
|---|---|
| January | 3,240 |
| February | 2,980 |
| March | 3,100 |
| April | 2,760 |
| May | 2,640 |
| June | 2,580 |
| July | 2,490 |
| August | 2,520 |
| September | 2,710 |
| October | 2,890 |
| November | 3,040 |
| December | 3,380 |
Source: Transport for NSW. Last updated: December 2024.
Compares how multiple series trend over the same time period. Works best with three or four series. Beyond that, patterns become difficult to separate.
Summary: App transactions grew fastest over the year, nearly doubling. Web remained the largest channel. Assisted digital declined steadily as self-service adoption increased.
| Period | Web | App | Assisted digital |
|---|---|---|---|
| Jul 2024 | 42,000 | 18,000 | 6,200 |
| Jan 2025 | 48,000 | 24,000 | 5,400 |
| Jun 2025 | 51,000 | 31,000 | 4,100 |
Source: Service NSW. Last updated: June 2025.
Shows cumulative volume or share building over time. Use sparingly as a line chart is usually clearer for non-cumulative data.
Summary: Grant disbursements accelerated from October, with the final quarter accounting for more than half of the full-year total.
| Month | Cumulative total ($M) |
|---|---|
| July | 12.4 |
| August | 28.7 |
| September | 41.2 |
| October | 58.9 |
| November | 74.3 |
| December | 89.1 |
Source: NSW Treasury. Last updated: December 2024.
Shows two related measures with different units over the same period. Only use this when the relationship between the two measures is the point of the chart.
Summary: Visit volumes and wait times both increased in May and June, suggesting capacity pressure heading into the second half of the year.
| Month | Visits | Average wait time (minutes) |
|---|---|---|
| January | 18,400 | 12 |
| February | 16,200 | 10 |
| March | 19,100 | 14 |
| April | 17,800 | 11 |
| May | 20,400 | 16 |
| June | 21,200 | 18 |
Source: Service NSW. Last updated: June 2025.
Shows how components contribute to a changing total over time. Better than a multi-line chart when the cumulative total is as important as the individual series.
Summary: The total number of open cases grew steadily across all priority levels. Critical cases grew fastest proportionally, nearly doubling between January and June.
| Period | Standard | High | Critical |
|---|---|---|---|
| Jan | 200 | 540 | 80 |
| Feb | 230 | 620 | 90 |
| Mar | 300 | 640 | 95 |
| Apr | 330 | 680 | 120 |
| May | 520 | 690 | 135 |
| Jun | 600 | 700 | 150 |
Source: Service NSW. Last updated: June 2025.
Shows simple proportion between two to four segments. The centre space can display a total or key callout value, which makes it a common choice for dashboards. Use a bar chart when precise comparison between segments matters more than showing the whole.
Summary: More than three-quarters of service requests were resolved on first contact in Q2 2025.
| Outcome | Share |
|---|---|
| Resolved on first contact | 78% |
| Escalated | 22% |
Source: Service NSW. Last updated: June 2025.
Functionally identical to a doughnut but without the centre space. Doughnuts are generally preferred in digital products as the centre can carry additional context.
Summary: Digital channels accounted for the largest share of service requests in Q2 2025, followed by phone and in-person channels.
| Channel | Share |
|---|---|
| Digital | 40% |
| Phone | 25% |
| In person | 20% |
| 15% |
Source: Service NSW. Last updated: June 2025.
Compares proportional composition across categories where each bar sums to 100%. Because actual counts are hidden, provide the absolute total for each category so users can judge the scale behind the percentages.
Summary: Resolution rates were highest in Metro and Hunter regions. Western NSW had the lowest resolution rate and the highest escalation rate.
| Region | Resolved (%) | Escalated (%) | Withdrawn (%) |
|---|---|---|---|
| Metro | 74 | 18 | 8 |
| Hunter | 71 | 20 | 9 |
| Illawarra | 68 | 22 | 10 |
| Western NSW | 65 | 24 | 11 |
Source: NSW Fair Trading. Last updated: June 2025.
Shows the relationship or correlation between two variables across a dataset. Use only when there is a genuine relationship worth showing.
Summary: Applications with higher complexity scores consistently took longer to process. Most straightforward applications (score below 30) resolved within 5 working days. Complex applications (score above 70) averaged 18 days, with significant variation.
| Application | Complexity score | Processing time (days) |
|---|---|---|
| A | 24 | 4 |
| B | 31 | 6 |
| C | 45 | 9 |
| D | 62 | 14 |
| E | 74 | 18 |
| F | 86 | 22 |
Source: NSW Planning Portal. Last updated: March 2025.
Shows relationship and magnitude across two variables, with bubble size encoding a third dimension. Use only when all three dimensions are meaningful, otherwise a scatter plot is simpler and clearer.
Summary: Higher-complexity applications generally had longer processing times, with the largest application volumes clustered in the mid-complexity range.
| Location | Complexity score | Processing time (days) | Applications |
|---|---|---|---|
| Sydney | 42 | 9 | 480 |
| Parramatta | 51 | 11 | 420 |
| Blacktown | 57 | 13 | 390 |
| Liverpool | 63 | 15 | 350 |
| Penrith | 68 | 17 | 310 |
| Camden | 74 | 19 | 260 |
Source: NSW Planning Portal. Last updated: March 2025.
Shows distribution across categories with less visual weight than bars. A good alternative to a bar chart when showing the spread of individual data points matters as much as the category totals.
Summary: Processing-time variation was widest in the middle of the week. Monday and Friday showed tighter clustering, while Wednesday and Thursday had more spread.
| Weekday | Observed processing times (days) |
|---|---|
| Mon | 4.1, 5.2, 6.0, 7.2 |
| Tue | 5.1, 5.8, 6.5, 7.8 |
| Wed | 6.0, 6.9, 7.6, 8.9 |
| Thu | 5.5, 6.4, 7.0, 8.3 |
| Fri | 4.8, 5.9, 6.7, 7.4 |
Source: Service NSW. Last updated: June 2025.
Shows how values are distributed across a continuous numeric range. Use this instead of a bar chart when the data is continuous and the shape of the distribution is the story.
Summary: The majority of calls were handled within 3 to 5 minutes. Calls under 1 minute and over 10 minutes each represented less than 10% of total volume.
| Duration (minutes) | Number of calls |
|---|---|
| 0–1 | 1,840 |
| 1–2 | 3,210 |
| 2–3 | 4,890 |
| 3–5 | 6,120 |
| 5–10 | 3,840 |
| 10+ | 1,100 |
Source: Service NSW. Last updated: March 2025.
Compares profiles across the same fixed set of dimensions. Use only when the overall shape of the profile matters, as a grouped bar chart or table is clearer when precise values are the priority.
Summary: Metro outperformed Regional on all five dimensions. Accessibility showed the largest gap between the two regions.
| Dimension | Metro | Regional |
|---|---|---|
| Timeliness | 84 | 76 |
| Accuracy | 91 | 88 |
| Satisfaction | 87 | 82 |
| Accessibility | 79 | 71 |
| Resolution rate | 88 | 80 |
Source: Service NSW. Last updated: June 2025.
Use honest scales, meaningful baselines and clear labels. Let the data speak for itself.
Column chart starts at 90, labels are rotated and the title does not explain the timeframe.
Use a horizontal bar chart that starts at zero with direct labels and a clear timeframe.
| Region | Completions |
|---|---|
| Illawarra Shoalhaven | 96 |
| Central Coast | 101 |
| Hunter New England | 98 |
| Western NSW | 104 |
Every chart must include the core elements required for clarity and accurate interpretation. The title can optionally include either a subtitle or a callout value.
Numbered markers on the chart map to the anatomy list.
Summary: Requests resolved on time increased from January to May 2026, then eased slightly in June. Late resolutions trended down across the same period.
| Month | Resolved on time | Resolved late |
|---|---|---|
| Jan | 410 | 72 |
| Feb | 438 | 68 |
| Mar | 467 | 74 |
| Apr | 492 | 70 |
| May | 525 | 66 |
| Jun | 508 | 61 |
Remove anything that doesn’t help the reader get to the insight faster. If a chart is trying to say everything, it ends up saying nothing.
Charts must meet WCAG 2.2 AA and AAA where possible. Accessibility is the responsibility of the product team, regardless of which tool or library is used.
Colour must not be the only way to communicate meaning (WCAG 1.4.1).
When differentiating data series:
Interactive charts must support full keyboard operation (WCAG 2.1.1).
Every chart must have a text alternative. Users must be able to access the same information without relying on the visual chart. This includes screen reader users, users who have disabled images, and users in low-bandwidth environments.
Write a short summary that captures the key insight in plain language. Place it directly above or below the chart.
A summary is not a description of the chart. Do not write ‘the chart shows a line going up.’ Write what the data means.
A data table gives users access to to the underlying data. The right approach depends on the complexity of the data set.
If a chart is rendered as a static image, it must have descriptive alt text.
alt=“Line chart showing monthly service applications for January to June 2025. Data in table below”Charts must remain usable at 200% zoom and 375px viewport width
Apply the NSW brand colour and typography with care. Prioritise contrast and readability. Do not use the palette decoratively.
Not all NSW palette colours meet the minimum contrast requirement for chart marks. The colours below have been pre-validated against a white background and are approved for use in charts and graphs.
Begin with the 01 and 02 colours from your main colour theme. If your theme is Blue and Red, start with Blue 01, Blue 02, Red 01 and Red 02, in that order.
Starting with your theme colours ensures charts feel consistent with the rest of your digital product before introducing additional colours.
Once your main theme colours are used, bring in 01 and 02 colours from another colour column. Apply the same sequence – 01 before 02 – and avoid mixing colours from too many sets in a single chart.
If you find yourself needing more than six to eight colours in one chart, consider whether the data can be simplified, grouped, or split across multiple charts instead.
Charts must use a white background (#FFFFFF or --nsw-brand-white) to ensure sufficient contrast for data marks.
| Swatch (plain) | Colour value | Contrast ratio on white | Swatch (pattern) | Line value | Pattern contrast |
|---|---|---|---|---|---|
| Blue 01 plain swatch | Blue 01 (#002664) |
14.37:1 |
Blue 01 patterned swatch | Blue 04 (#CBEDFD) |
11.68:1 |
| Blue 02 plain swatch | Blue 02 (#146CFD) |
4.57:1 |
Blue 02 patterned swatch | Blue 04 (#CBEDFD) |
3.72:1 |
| Purple 01 plain swatch | Purple 01 (#441170) |
13.46:1 |
Purple 01 patterned swatch | Purple 04 (#E6E1FD) |
10.61:1 |
| Purple 02 plain swatch | Purple 02 (#8055F1) |
4.68:1 |
Purple 02 patterned swatch | Purple 04 (#E6E1FD) |
3.69:1 |
| Fuchsia 01 plain swatch | Fuchsia 01 (#65004D) |
12.65:1 |
Fuchsia 01 patterned swatch | Fuchsia 04 (#FDDEF2) |
10.18:1 |
| Fuchsia 02 plain swatch | Fuchsia 02 (#D912AE) |
4.52:1 |
Fuchsia 02 patterned swatch | Fuchsia 04 (#FDDEF2) |
3.64:1 |
| Red 01 plain swatch | Red 01 (#630019) |
13.60:1 |
Red 01 patterned swatch | Red 04 (#FFE6EA) |
11.50:1 |
| Red 02 plain swatch | Red 02 (#D7153A) |
5.18:1 |
Red 02 patterned swatch | Red 04 (#FFE6EA) |
4.38:1 |
| Orange 01 plain swatch | Orange 01 (#941B00) |
8.69:1 |
Orange 01 patterned swatch | Orange 04 (#FDEDDF) |
7.60:1 |
| Orange 02 plain swatch | Orange 02 (#F3631B) |
3.18:1 |
Orange 02 patterned swatch | White (#FFFFFF) |
3.18:1 |
| Brown 01 plain swatch | Brown 01 (#523719) |
10.94:1 |
Brown 01 patterned swatch | Brown 04 (#EDE3D7) |
8.63:1 |
| Brown 02 plain swatch | Brown 02 (#B68D5D) |
3.02:1 |
Brown 02 patterned swatch | White (#FFFFFF) |
3.02:1 |
| Yellow 01 plain swatch | Yellow 01 (#694800) |
8.31:1 |
Yellow 01 patterned swatch | Yellow 04 (#FFF4CF) |
7.55:1 |
| Green 01 plain swatch | Green 01 (#004000) |
12.12:1 |
Green 01 patterned swatch | Green 04 (#DBFADF) |
10.82:1 |
| Green 02 plain swatch | Green 02 (#00AA45) |
3.07:1 |
Green 02 patterned swatch | White (#FFFFFF) |
3.07:1 |
| Teal 01 plain swatch | Teal 01 (#0B3F47) |
11.56:1 |
Teal 01 patterned swatch | Teal 04 (#D1EEEA) |
9.43:1 |
| Teal 02 plain swatch | Teal 02 (#2E808E) |
4.57:1 |
Teal 02 patterned swatch | Teal 04 (#D1EEEA) |
3.73:1 |
| Grey 01 plain swatch | Grey 01 (#22272B) |
15.07:1 |
Grey 01 patterned swatch | Grey 04 (#EBEBEB) |
12.64:1 |
| Grey 02 plain swatch | Grey 02 (#495054) |
8.21:1 |
Grey 02 patterned swatch | Grey 04 (#EBEBEB) |
6.88:1 |
In a few 02 rows, the line colour uses White or 01 to keep pattern contrast at or above 3:1.
| Swatch (plain) | Colour value | Contrast ratio on white | Swatch (pattern) | Line value | Pattern contrast |
|---|---|---|---|---|---|
| Earth red plain swatch | Earth red (#950906) |
9.05:1 |
Earth red patterned swatch | Galah pink (#FDD9D9) |
6.94:1 |
| Ember red plain swatch | Ember red (#E1261C) |
4.67:1 |
Ember red patterned swatch | Galah pink (#FDD9D9) |
3.58:1 |
| Deep orange plain swatch | Deep orange (#882600) |
9.04:1 |
Deep orange patterned swatch | Sunset orange (#F9D4BE) |
6.54:1 |
| Orange ochre plain swatch | Orange ochre (#EE6314) |
3.27:1 |
Orange ochre patterned swatch | White (#FFFFFF) |
3.27:1 |
| Bush honey yellow plain swatch | Bush honey yellow (#895E00) |
5.73:1 |
Bush honey yellow patterned swatch | Sunbeam yellow (#FFF1C5) |
5.09:1 |
| Riverbed brown plain swatch | Riverbed brown (#552105) |
13.08:1 |
Riverbed brown patterned swatch | Macadamia brown (#E9C8B2) |
8.32:1 |
| Firewood brown plain swatch | Firewood brown (#9E5332) |
5.62:1 |
Firewood brown patterned swatch | Macadamia brown (#E9C8B2) |
3.58:1 |
| Charcoal grey plain swatch | Charcoal grey (#272727) |
14.94:1 |
Charcoal grey patterned swatch | Smoke grey (#E5E3E0) |
11.66:1 |
| Emu grey plain swatch | Emu grey (#555555) |
7.46:1 |
Emu grey patterned swatch | Smoke grey (#E5E3E0) |
5.82:1 |
| Bushland green plain swatch | Bushland green (#215834) |
8.37:1 |
Bushland green patterned swatch | Saltbush green (#DAE6D1) |
6.46:1 |
| Marshland lime plain swatch | Marshland lime (#78A146) |
3.01:1 |
Marshland lime patterned swatch | White (#FFFFFF) |
3.01:1 |
| Billabong blue plain swatch | Billabong blue (#00405E) |
11.08:1 |
Billabong blue patterned swatch | Coastal blue (#C1E2E8) |
8.08:1 |
| Saltwater blue plain swatch | Saltwater blue (#0D6791) |
6.24:1 |
Saltwater blue patterned swatch | Coastal blue (#C1E2E8) |
4.55:1 |
| Bush plum plain swatch | Bush plum (#472642) |
12.93:1 |
Bush plum patterned swatch | Dusk purple (#E4CCE0) |
8.63:1 |
| Spirit lilac plain swatch | Spirit lilac (#9A5E93) |
4.78:1 |
Spirit lilac patterned swatch | Dusk purple (#E4CCE0) |
3.19:1 |
Aboriginal palette options shown here all meet at least 3:1 contrast on white. Where same-family pairings are too low, white pattern lines are used to maintain compliance.
Not all charts need multiple colours. Some chart types communicate clearly with a single colour and do not require colour differentiation between categories.
A bar chart comparing values across categories is a good example. Each bar represents a separate category, and the position and length of the bar communicates the difference - not the colour. Using a single colour in this case reduces visual noise and keeps the focus on the data.
Use a single colour when:
Use multiple colours when:
The most common type of colour vision deficiency is red-green confusion. Avoid placing these colour pairs next to each other:
For line charts, use dash styles, not fill patterns. Dash patterns (solid, dashed, dotted, dash-dot) are the correct redundant channel for distinguishing line series. Fill patterns are for bar, area and pie/doughnut chart marks only.
| Style swatch | Name | Use |
|---|---|---|
| Solid line style | Solid | Primary series |
| Dashed line style | Dashed | Secondary |
| Dotted line style | Dotted | Tertiary |
| Dash-dot line style | Dash-dot | Quaternary |
Colour is usually the primary cue for distinguishing datasets, but charts must remain understandable when users cannot rely on colour alone.
3:1 contrast between fill and pattern stroke.Pattern usage limits
Keep to 4 to 5 patterns maximum in a single chart. Avoid thin lines or dense fills, use stroke widths 1.5 to 2px. Validate at 200% zoom and 375px viewport width before publishing. Patterns are reference swatches only: final scale must be validated in the rendered environment.
| Swatch | Pattern type | Typical use |
|---|---|---|
| Diagonal | Good for secondary series in stacked bars and columns. | |
| Crosshatch | Useful where stronger differentiation is required than single-line patterns. | |
| Dots | Works well for pie and doughnut slices where subtle texture is enough. | |
| Grid (tight) | Suitable for medium-to-large marks where repeated structure is clear. | |
| Grid (wide) | Best for larger visual marks where denser patterns would look noisy. | |
| Zigzag | Useful for highlighting one key series when other series are solid. |
Reference swatches only. Validate final pattern scale at 200% zoom and at mobile widths.
Text should help users quickly understand the data without competing with visual elements. Use NSW Government primary typeface, Public Sans. If this is not possible, use Arial as fallback.
| Element | Size |
|---|---|
| Chart title | 16 to 18px |
| Subtitle | 12 to 14px |
| Callout | 32 to 40px |
| Axis labels | 12 to 14px |
| Dataset labels | 12 to 14px |
| Data labels | 12px minimum |
| Notes or sources | 11 to 12px |
Avoid text smaller than 12px in digital charts.
Keep all text horizontal where possible. Angled or vertical text is harder to read and fails more easily at 200% zoom and on mobile viewports.
If rotating text cannot be avoided due to tool constraints, limit rotation to 45 degrees and ensure the text still meets the 12px minimum size at all viewport widths.
1,000).DDS does not prescribe tools. However, because tool defaults are not automatically compliant, teams must:
These examples show common issues and better implementations. Use them to spot risks early and improve consistency.
Stacked bar uses red and green only, with no labels and low contrast.
Use accessible colours, clear contrast, and a supporting table for labels.
| Quarter | Resolved on time | Resolved late |
|---|---|---|
| Q1 | 120 | 30 |
| Q2 | 140 | 25 |
| Q3 | 110 | 40 |
| Q4 | 150 | 20 |
Line chart shows values only on hover with no table or summary.
Include a summary and a semantic table for the same data.
Summary: Applications rose steadily from January to May, with a small drop in June.
| Month | Applications |
|---|---|
| January | 220 |
| February | 260 |
| March | 310 |
| April | 370 |
| May | 420 |
| June | 390 |
Using many small slices makes comparison difficult and creates visual clutter.
Keep pie segments limited so users can quickly compare relative share.
| Channel | Share |
|---|---|
| Digital | 46% |
| Phone | 28% |
| In person | 17% |
| 9% |
Before publishing:
If any answer is no, revise before release.