Skip to main content

Data Visualisation Standards

Data visualisation standards define the rules for representing data graphically across organisational reporting systems. This reference provides lookup tables for chart selection, colour specifications, accessibility requirements, and formatting conventions that apply to all dashboards, reports, and analytical outputs.

Chart Selection

Chart selection depends on the data structure and the analytical question. The following matrix maps data characteristics to appropriate chart types.

By Data Relationship

RelationshipData StructurePrimary ChartAlternatives
Comparison across categoriesCategorical × NumericBar chart (horizontal)Column chart, dot plot
Comparison over timeTime seriesLine chartArea chart, column chart
Part-to-wholeCategorical × PercentageStacked bar (100%)Treemap, waffle chart
DistributionSingle numeric variableHistogramBox plot, density plot
CorrelationTwo numeric variablesScatter plotBubble chart (with third variable)
RankingCategorical × Numeric (ordered)Bar chart (sorted)Lollipop chart, slope chart
Flow or processSource → Destination × VolumeSankey diagramChord diagram
GeographicLocation × NumericChoropleth mapBubble map, hex map
HierarchicalNested categories × NumericTreemapSunburst, icicle chart
Change over time (few categories)Time × Numeric × 2-5 categoriesMulti-line chartSmall multiples
Change over time (many categories)Time × Numeric × 6+ categoriesSmall multiplesHeatmap

By Audience and Purpose

PurposeAudienceRecommended Approach
Executive summarySenior leadershipSingle KPI cards, sparklines, 3-5 key metrics maximum
Operational monitoringProgramme staffReal-time gauges, status indicators, exception highlighting
Donor reportingExternal fundersClean bar/line charts, clear labels, minimal interactivity
Data explorationAnalystsInteractive filters, drill-down, scatter plots, distributions
Public communicationGeneral audienceSimple bar charts, pictograms, infographic style
Field teamsLow-bandwidth contextsStatic images, simplified palettes, offline-capable

Chart Type Specifications

Chart TypeMaximum CategoriesMinimum Data PointsAvoid When
Pie chart52Values are similar; precise comparison needed
Donut chart52Values are similar; more than one ring needed
Bar chart (horizontal)151Time-based data; continuous values
Column chart123Labels are long; many categories
Line chart7 lines4Comparing exact values; categorical data
Area chart4 areas4Overlapping values obscure data
Scatter plotN/A10Categorical data; few points
HistogramN/A30Comparing categories; small samples
Box plot1020 per boxAudience unfamiliar with statistics
Treemap303Precise comparison needed; small differences
Heatmap50 × 503 × 3Precise values needed; few cells
Choropleth mapN/A5 regionsPoint data; non-contiguous regions

Colour Palettes

Colour palettes divide into three functional categories: sequential palettes represent ordered data from low to high, diverging palettes represent data with a meaningful centre point, and categorical palettes distinguish unrelated groups.

Sequential Palettes

Sequential palettes progress from light to dark (or low saturation to high saturation) to represent magnitude. Use these for metrics where higher values have consistent meaning across the dataset.

Palette NameUse CaseHex Values (5 steps)
Blue sequentialDefault for most metrics#E6F0F5, #A3C4D9, #5A9ABF, #2E6B8A, #0D3B54
Green sequentialPositive outcomes, growth#E8F4E8, #A8D4A8, #5FB35F, #2E8B2E, #0D5C0D
Orange sequentialAttention, warnings#FFF0E6, #FFD4B3, #FFB380, #E67300, #994D00
Grey sequentialNeutral, background data#F5F5F5, #D4D4D4, #A3A3A3, #6B6B6B, #333333

For continuous data requiring more than 5 steps, interpolate between the provided values. Most BI platforms provide interpolation functions; in Apache Superset, use the LINEAR colour interpolation mode.

Diverging Palettes

Diverging palettes extend outward from a neutral centre point. Use these when data has a meaningful midpoint: zero change, target value, or median. The centre colour should be neutral (white or light grey), with distinct hues extending in each direction.

Palette NameUse CaseBelow CentreCentreAbove Centre
Red-Blue divergingPerformance vs target#B22222, #DC6464, #F0F0F0, #6495ED, #1E3A8A
Brown-Teal divergingChange from baseline#8B4513, #C9956C, #F5F5F5, #5F9EA0, #006666
Purple-Green divergingPositive/negative sentiment#663399, #A385C2, #F0F0F0, #7CB68A, #228B22

When using diverging palettes, set the centre point explicitly rather than relying on automatic scaling. A target achievement palette centred on 100% ensures that 80% and 120% receive equal visual weight on opposite sides of the midpoint.

Categorical Palettes

Categorical palettes distinguish unrelated groups without implying order. Colours should be perceptually distinct while maintaining similar saturation and lightness to avoid visual hierarchy.

Palette NameMaximum CategoriesHex Values
Primary categorical6#2E6B8A, #8B4513, #228B22, #663399, #DC143C, #DAA520
Extended categorical10Primary + #008B8B, #FF6347, #4682B4, #9ACD32
Muted categorical6#6B8E9F, #A08060, #7CB68A, #9683A9, #C9736B, #C9B458

Beyond 10 categories, categorical palettes become difficult to distinguish. Group smaller categories into an “Other” category, use small multiples, or employ direct labelling instead of a legend.

Colour-Blind Safe Palettes

Approximately 8% of males and 0.5% of females have some form of colour vision deficiency. Red-green colour blindness (deuteranopia and protanopia) is most common. The following palettes remain distinguishable under common colour vision deficiencies.

Palette NameTypeHex ValuesSafe For
Blue-Orange safeDiverging#0072B2, #56B4E9, #F0F0F0, #E69F00, #D55E00Deuteranopia, Protanopia
ViridisSequential#440154, #3B528B, #21918C, #5DC863, #FDE725All common deficiencies
IBM categoricalCategorical#648FFF, #785EF0, #DC267F, #FE6100, #FFB000Deuteranopia, Protanopia
Tol brightCategorical#4477AA, #EE6677, #228833, #CCBB44, #66CCEEAll common deficiencies

When colour alone conveys meaning, provide a secondary encoding: pattern fills for bar charts, marker shapes for scatter plots, or direct labels. Dashboard filtering should not rely solely on colour-coded buttons.

Accessibility Requirements

Visualisations must meet WCAG 2.1 Level AA requirements. The following specifications ensure compliance.

Contrast Ratios

ElementMinimum Contrast RatioMeasurement Against
Data elements (bars, lines, points)3:1Background
Adjacent data elements3:1Each other
Text labels4.5:1Background
Large text (18pt+ or 14pt+ bold)3:1Background
Axis lines3:1Background
Gridlines1.5:1Background (intentionally subtle)

Verify contrast ratios using tools such as WebAIM Contrast Checker or browser developer tools. For programmatic checking in dashboards, the formula is:

Contrast ratio = (L1 + 0.05) / (L2 + 0.05)
Where L1 is the relative luminance of the lighter colour
L2 is the relative luminance of the darker colour
Relative luminance L = 0.2126 × R + 0.7152 × G + 0.0722 × B
(with R, G, B values linearised from sRGB)

Text Requirements

ElementMinimum SizeFont WeightMaximum Characters
Chart title16pxSemi-bold (600)60
Axis title12pxMedium (500)30
Axis labels11pxRegular (400)20
Data labels10pxRegular (400)10
Legend text11pxRegular (400)25
Tooltip text12pxRegular (400)100
Annotation text11pxRegular (400)80

Use sans-serif fonts for all chart text. Recommended families: Inter, Source Sans Pro, Roboto, or system defaults (system-ui). Avoid condensed or light weights below 12px.

Keyboard and Screen Reader Support

Interactive visualisations require keyboard navigation and screen reader compatibility:

RequirementImplementation
Focus indicatorsVisible 2px outline on focusable elements
Tab orderLogical sequence: title → legend → data elements → controls
Arrow key navigationMove between data points within a series
Data table alternativeHidden table with complete data for screen readers
ARIA labelsaria-label on chart container describing the visualisation
Live regionsaria-live="polite" for filter changes affecting displayed data

The hidden data table pattern provides screen reader users with access to underlying values. Implement as a visually hidden <table> element containing all data points, with <caption> repeating the chart title.

<div class="chart-container" role="img" aria-label="Monthly beneficiary registrations, January to December 2024">
<div class="visually-hidden">
<table>
<caption>Monthly beneficiary registrations, January to December 2024</caption>
<thead>
<tr><th>Month</th><th>Registrations</th></tr>
</thead>
<tbody>
<tr><td>January</td><td>1,245</td></tr>
<!-- remaining rows -->
</tbody>
</table>
</div>
<!-- visible chart implementation -->
</div>

Typography and Labelling

Number Formatting

Value TypeFormatExample
Whole numbers under 10,000No separators8472
Whole numbers 10,000+Thousands separator84,720
Large numbers (millions)Abbreviated with suffix2.4M
PercentagesOne decimal place maximum42.7%
CurrencySymbol prefix, thousands separator$1,245,000
RatiosColon separator3:1
Dates (axis)Abbreviated month, yearJan 2024
Dates (tooltips)Full format15 January 2024
Time24-hour format14:30
Negative numbersMinus sign prefix-1,245

Apply consistent formatting within a single visualisation. Mixed formats (some values abbreviated, others not) impair comparison.

Label Placement

Chart TypeLabel PositionAlignment
Horizontal barEnd of bar (outside if space permits)Left-aligned
Column chartAbove column (outside)Centre-aligned
Line chartEnd of line or direct on lineRight-aligned
Pie/donutOutside with leader linesRadial
Scatter plotAdjacent to point (offset)Left-aligned
MapCentred within region or adjacent to pointCentre-aligned

Direct labelling (placing values on or adjacent to data elements) eliminates the need for legends when category count is low. Prefer direct labelling for 4 or fewer series on line charts and for all bar charts where space permits.

Axis Conventions

Axis ElementConvention
Y-axis originStart at zero for bar and column charts; may start elsewhere for line charts showing change
Y-axis maximumExtend 10-15% beyond highest value to prevent truncation
X-axis time intervalsConsistent intervals (daily, weekly, monthly); indicate gaps explicitly
Tick marks5-7 ticks per axis; round numbers preferred
Grid linesHorizontal only for most charts; vertical for time series if helpful
Axis labelsHorizontal where possible; rotate 45° maximum if necessary

Truncating the y-axis (starting above zero) is acceptable for line charts showing trends where the focus is on change rather than absolute magnitude. Include an axis break symbol (⫽) and note in the title or annotation when truncation occurs.

Legend and Annotation Standards

Legend Placement

ScenarioPositionJustification
Chart width exceeds heightRight side, top-alignedPreserves horizontal chart space
Chart height exceeds widthBottom, centre-alignedPreserves vertical chart space
2-3 categoriesTop, inline with titleMinimises eye movement
Interactive dashboardClickable legend for filteringTop or right, prominent
Print/exportBelow chartEnsures capture in screenshots

Legends should appear within the chart container, not separated by whitespace. Maximum legend entries for a single chart: 10. Beyond this threshold, consider small multiples or a different encoding approach.

Annotation Types

Annotation TypeUse CaseVisual Treatment
Reference lineTarget, threshold, averageDashed line, 1px, contrasting colour
Reference bandAcceptable range, confidence intervalSemi-transparent fill (20% opacity)
CalloutSignificant event, anomaly explanationText box with pointer line
Trend lineStatistical trendDotted line, distinct from data
Period markerTime period boundariesVertical line, labelled

Reference lines require labels. An unlabelled horizontal line at y=100 communicates nothing; label it “Target: 100” or “Baseline”.

Annotation Text

Annotation text explains what the audience should notice. Write annotations as complete thoughts:

Poor AnnotationImproved Annotation
”Peak""Registration peak of 3,420 during flood response (March 2024)"
"Declined""25% decline following programme phase-out in District B"
"Target""Annual target: 50,000 beneficiaries”

Position annotations close to the data they reference, connected by a leader line if necessary. Avoid overlapping data elements; adjust placement or use callout boxes.

Table Design Standards

Data tables in dashboards and reports follow consistent formatting rules.

Structure

ElementSpecification
Header rowBold text, bottom border (2px), background fill (#F5F5F5)
Column alignmentText left, numbers right, dates centre
Row heightMinimum 32px for touch targets
Cell padding8px horizontal, 4px vertical
Row stripingOptional; alternate rows (#FAFAFA) for tables exceeding 10 rows
Row borders1px, #E0E0E0, between rows
Frozen headersFixed position on scroll for tables exceeding viewport height

Numeric Columns

RequirementImplementation
Decimal alignmentAlign on decimal point
Negative valuesRed text (#B22222) or parentheses for financial contexts
Zero valuesDisplay as “0” not blank
Null/missing valuesDisplay as ”—” (en dash) with explanatory footnote
Totals rowBold text, top border (2px), positioned at bottom
PercentagesRight-align with % symbol; include conditional formatting bars if comparative

Conditional Formatting

Format TypeUse CaseSpecification
Data barsShow relative magnitudeColour-blind safe blue (#2E6B8A), 50% cell width maximum
Colour scaleHeatmap tablesSequential palette, light-to-dark
Icon setsStatus indicatorsTraffic light (with redundant symbols), directional arrows
Threshold highlightingException flaggingBackground fill for cells exceeding threshold

Traffic light colour coding (red/yellow/green) alone fails accessibility requirements. Combine with shapes: circle for green/good, triangle for yellow/warning, square for red/critical. Alternatively, use symbols: ✓, !, ✗.

Map Visualisation Standards

Geographic visualisations require specific conventions for clarity and accuracy.

Choropleth Maps

ElementSpecification
Classification methodNatural breaks (Jenks), quantiles, or equal intervals depending on distribution
Number of classes5-7 classes maximum
Colour paletteSequential for rates; diverging for deviation from mean
No-data regionsDistinct pattern fill (hatching) or grey, labelled in legend
Boundary lines1px, colour contrasting with adjacent fill values
LabelsRegion names at centroid for regions above threshold area

Equal intervals work for normally distributed data. Quantiles ensure equal counts per class but can obscure magnitude differences. Natural breaks optimise for variance within classes; use for skewed distributions.

Point Maps

ElementSpecification
Marker sizeMinimum 8px diameter; scale by square root of value for proportional symbols
Marker shapeCircle default; use distinct shapes for categorical differentiation
ClusteringEnable for datasets exceeding 100 points at default zoom
Cluster thresholdCluster when points would overlap by more than 50%
Popup contentLocation name, primary metric, secondary metrics

Proportional symbol scaling uses square root of the value to determine radius, ensuring perceived area scales linearly with value:

radius = base_radius × √(value / reference_value)

A value of 400 should appear twice the area of a value of 100, requiring a radius 2× larger (√4 = 2).

Basemap Selection

ContextBasemapJustification
Analytical dashboardsLight grey, minimal labelsReduces visual competition with data layer
Field operationsOpenStreetMap or satelliteRoad/terrain detail needed for navigation
Public reportsSimple political boundariesMaximises data emphasis
Humanitarian responseOCHA COD boundariesStandard reference for coordination

For humanitarian contexts, source administrative boundary data from the Common Operational Datasets (CODs) maintained by OCHA. These provide standardised P-codes required for interoperability with cluster information management systems.

Common Mistakes

MistakeProblemCorrection
Pie chart with 8+ segmentsSlices become indistinguishableUse horizontal bar chart
3D effects on any chartDistorts perception of valuesRemove; use 2D charts exclusively
Dual y-axes with different scalesImplies false correlation; misleads on magnitudeUse two separate charts
Rainbow colour palettesNo perceptual order; fails accessibilityUse sequential or diverging palette
Legend-only identificationRequires constant eye movementDirect label where possible
Excessive decimal placesFalse precision; cognitive loadRound to meaningful precision
Inconsistent time intervalsMisleads on rate of changeUse consistent intervals; note gaps
Missing zero baseline (bars)Exaggerates differencesStart y-axis at zero for bar charts
Sorted line chartsImplies time relationshipUse bar chart for categorical comparison
Unlabelled axesValues lack contextLabel all axes with units
Red-green encoding onlyExcludes colour-blind usersAdd shape, pattern, or label redundancy
Rotated labels beyond 45°Difficult to readAbbreviate labels or use horizontal bar
Gridlines matching data colourData becomes camouflagedUse subtle gridlines (#E0E0E0)
Auto-scaled axes between viewsComparison across dashboards misleadingLock axis scales where comparison needed

Tool-Specific Implementation

Apache Superset

{
"color_scheme": "custom_org_categorical",
"custom_colors": ["#2E6B8A", "#8B4513", "#228B22", "#663399", "#DC143C", "#DAA520"],
"label_colors": {},
"shared_label_colors": {},
"map_style": "mapbox://styles/mapbox/light-v10"
}

Configure organisation palettes in superset_config.py:

EXTRA_CATEGORICAL_COLOR_SCHEMES = [
{
"id": "org_categorical",
"description": "Organisation standard categorical palette",
"label": "Organisation Categorical",
"colors": ["#2E6B8A", "#8B4513", "#228B22", "#663399", "#DC143C", "#DAA520"]
}
]
EXTRA_SEQUENTIAL_COLOR_SCHEMES = [
{
"id": "org_blue_sequential",
"description": "Organisation standard sequential palette",
"label": "Organisation Blue Sequential",
"colors": ["#E6F0F5", "#A3C4D9", "#5A9ABF", "#2E6B8A", "#0D3B54"]
}
]

Power BI

Apply organisation palettes via theme JSON:

{
"name": "Organisation Standard",
"dataColors": ["#2E6B8A", "#8B4513", "#228B22", "#663399", "#DC143C", "#DAA520"],
"background": "#FFFFFF",
"foreground": "#333333",
"tableAccent": "#2E6B8A",
"visualStyles": {
"*": {
"*": {
"labels": [{
"fontFamily": "Inter, sans-serif",
"fontSize": {"expr": {"Literal": {"Value": "11D"}}}
}],
"title": [{
"fontFamily": "Inter, sans-serif",
"fontSize": {"expr": {"Literal": {"Value": "16D"}}},
"fontColor": {"solid": {"color": "#333333"}}
}]
}
}
}
}

Import via External Tools → Theme → Import from file, or embed in the .pbix file.

Tableau

Create organisation palette in Preferences.tps (located in My Tableau Repository):

<?xml version='1.0'?>
<workbook>
<preferences>
<color-palette name="Organisation Categorical" type="regular">
<color>#2E6B8A</color>
<color>#8B4513</color>
<color>#228B22</color>
<color>#663399</color>
<color>#DC143C</color>
<color>#DAA520</color>
</color-palette>
<color-palette name="Organisation Blue Sequential" type="ordered-sequential">
<color>#E6F0F5</color>
<color>#A3C4D9</color>
<color>#5A9ABF</color>
<color>#2E6B8A</color>
<color>#0D3B54</color>
</color-palette>
<color-palette name="Organisation Diverging" type="ordered-diverging">
<color>#B22222</color>
<color>#DC6464</color>
<color>#F0F0F0</color>
<color>#6495ED</color>
<color>#1E3A8A</color>
</color-palette>
</preferences>
</workbook>

For Tableau Server/Cloud, publish palettes via Site Settings → Extensions → Customize.

Metabase

Configure colours in Admin → Settings → Appearance:

Brand color: #2E6B8A
Chart colors: #2E6B8A, #8B4513, #228B22, #663399, #DC143C, #DAA520

Metabase does not support custom sequential palettes in the interface. For advanced customisation, modify frontend/src/metabase/lib/colors.js in a self-hosted deployment.

See Also