Pick the right chart type based on what you're trying to communicate. This guide covers the 90% case — when in doubt, use a bar chart.
Ask yourself: "What relationship am I showing?"
| Relationship | Chart Type | When to Use |
|---|---|---|
| Comparison (this vs that) | Bar chart (horizontal) | Comparing categories with long labels |
| Comparison (this vs that) | Bar chart (vertical) | Comparing categories with short labels |
| Comparison (part of whole) | Stacked bar (100%) | Showing composition across categories |
| Trend (change over time) | Line chart | Continuous time series, 2+ periods |
| Trend (discrete periods) | Column chart | Monthly/quarterly comparisons |
| Distribution | Histogram | Understanding data spread |
| Distribution | Box plot | Comparing distributions across groups |
| Correlation | Scatter plot | Relationship between two continuous variables |
| Composition (static) | Stacked bar | Parts of a whole at one point in time |
| Composition (over time) | Area chart (stacked) | How parts change over time |
| Geographic | Choropleth map | Value varies by region |
| Flow | Sankey diagram | Movement between stages |
| Ranking | Horizontal bar (sorted) | Top N / Bottom N |
| KPI Status | Bullet chart | Actual vs target with qualitative ranges |
| Single Value | KPI card | One number that tells the story |
What are you showing?
│
├─ A single important number?
│ └─ KPI CARD with trend indicator
│
├─ How something changes over time?
│ ├─ Continuous (daily/hourly)? → LINE CHART
│ ├─ Discrete periods (monthly)? → COLUMN CHART
│ └─ Cumulative? → AREA CHART
│
├─ Comparison between categories?
│ ├─ How many categories?
│ │ ├─ 2-5 → GROUPED BAR CHART
│ │ ├─ 6-15 → HORIZONTAL BAR (sorted)
│ │ └─ 15+ → TABLE or TOP-N BAR
│ └─ Part of a whole?
│ ├─ 2-4 parts → DONUT CHART (only exception to no-pie rule)
│ └─ 5+ parts → STACKED BAR (100%)
│
├─ Distribution of values?
│ ├─ One variable? → HISTOGRAM
│ ├─ Compare distributions? → BOX PLOT
│ └─ Density estimation? → VIOLIN PLOT
│
├─ Relationship between variables?
│ ├─ Two continuous? → SCATTER PLOT
│ ├─ Add a third via size? → BUBBLE CHART
│ └─ Many variables? → HEATMAP MATRIX
│
├─ Geographic data?
│ ├─ Regional aggregates? → CHOROPLETH MAP
│ ├─ Point locations? → SYMBOL MAP
│ └─ Routes/flows? → FLOW MAP
│
└─ Progress toward goal?
├─ Single metric vs target? → BULLET CHART
└─ Multiple metrics vs targets? → TABLE with conditional formatting
Anatomy of a good KPI card:
┌─────────────────────────────┐
│ Revenue (MTD) │ ← Label + time period
│ $2.4M │ ← Big number
│ ▲ 12% vs last month │ ← Trend with comparison
│ Target: $2.8M │ ← Context
└─────────────────────────────┘
| Chart Type | Color Strategy |
|---|---|
| Single series line/bar | One brand color |
| Multi-series line | Distinct categorical palette (max 7) |
| Comparison (actual vs target) | Blue (actual) + Gray (target) |
| Good/bad encoding | Green/Red with pattern backup |
| Sequential data | Single-hue gradient (light → dark) |
| Diverging data | Two-hue gradient (red ← gray → blue) |
┌──────────┬──────────┬──────────┬──────────┐
│ KPI 1 │ KPI 2 │ KPI 3 │ KPI 4 │ ← Status row
├──────────┴──────────┴──────────┴──────────┤
│ │
│ Main Trend Chart │ ← Analysis
│ │
├─────────────────────┬──────────────────────┤
│ Breakdown Chart 1 │ Breakdown Chart 2 │ ← Detail
├─────────────────────┴──────────────────────┤
│ Detail Table │ ← Export
└────────────────────────────────────────────┘
┌──────────────────────┬─────────────────────┐
│ Current Period │ Previous Period │ ← Side by side
├──────────────────────┴─────────────────────┤
│ Variance Chart │ ← What changed
├────────────────────────────────────────────┤
│ Top Movers Table │ ← Biggest changes
└────────────────────────────────────────────┘
┌────────────────────────────────────────────┐
│ Funnel Visualization │ ← The flow
├────────────┬───────────────┬───────────────┤
│ Stage 1 │ Stage 2 │ Stage 3 │ ← Stage details
│ Metrics │ Metrics │ Metrics │
├────────────┴───────────────┴───────────────┤
│ Drop-Off Analysis │ ← Where we lose them
└────────────────────────────────────────────┘
┌─────────────────────────┬──────────────────┐
│ │ Region KPIs │
│ Map │ ┌────────────┐ │
│ │ │ North: $2M │ │
│ │ │ South: $1M │ │
│ │ └────────────┘ │
├─────────────────────────┴──────────────────┤
│ Regional Trend Chart │
└────────────────────────────────────────────┘
value_format for readabilitylisten filters to link tiles, not cross-filteringrequired_fields for performanceA field-tested framework for building dashboards that people actually use. These principles apply regardless of tool (Tableau, Looker, Power BI) or domain.
Every dashboard must have a single primary question it answers. If you can't state that question in one sentence, your dashboard is trying to do too much.
Good primary questions:
Bad primary questions:
Place the answer to the primary question in the top-left quadrant of the dashboard. This is where the eye lands first (F-pattern reading). Use a large KPI card or a single trend line with a clear up/down indicator.
A viewer should understand the dashboard's main message within 5 seconds of looking at it. This means:
| Element | Maximum Count |
|---|---|
| KPI cards in the header row | 4-6 |
| Charts visible without scrolling | 3-4 |
| Filters visible at once | 3-5 |
| Colors used for encoding | 5-7 |
1. BIG NUMBERS (KPI cards) → Instant comprehension
2. Trend lines → Direction and velocity
3. Bar charts → Comparison
4. Tables → Detail (put below the fold)
Place elements in this order from top to bottom. Heavy-reading elements (tables, detailed breakdowns) go below the fold.
Structure information in three layers:
Once you assign a meaning to a visual property, never break that contract.
Green = Good / On Track / Growth
Red = Bad / Behind / Decline
Blue = Primary / Current Period
Gray = Secondary / Comparison Period
Orange = Warning / Needs Attention
KPI Value: 28-36pt, Bold, Dark
KPI Label: 12-14pt, Regular, Medium Gray
Chart Title: 14-16pt, Semi-Bold, Dark
Axis Labels: 10-12pt, Regular, Medium Gray
Annotations: 11pt, Italic, Dark Gray
Section padding: 24px
Card internal pad: 16px
Between cards: 12px
Chart margins: 16px top, 12px sides
Design for the narrowest screen first, then expand.
| Screen | Width | Grid Columns | Approach |
|---|---|---|---|
| Mobile | <768px | 1 | Stack everything vertically, KPIs only |
| Tablet | 768-1024px | 2 | KPIs + one chart, filters in drawer |
| Desktop | 1024-1440px | 3-4 | Full layout |
| Large Display | >1440px | 4-6 | Add context panels |
1. KPI cards: Show value + trend arrow, hide sparklines
2. Charts: Show one at a time with swipe navigation
3. Filters: Collapse into a filter drawer, show active count
4. Tables: Convert to card layout (one row = one card)
Filters are the primary interaction model. Design them carefully.
Every filter must have a sensible default:
Document how filters interact:
Numbers without context are meaningless. Always provide:
Define and display thresholds for KPIs:
Revenue Growth: Green >10%, Yellow 0-10%, Red <0%
Customer Churn: Green <2%, Yellow 2-5%, Red >5%
NPS Score: Green >50, Yellow 30-50, Red <30
A dashboard that takes 10 seconds to load won't be used daily.
1. Limit to 10 queries per dashboard (fewer is better)
2. Pre-aggregate where possible (use materialized views / extracts)
3. Default date range should query <1M rows
4. Use incremental refresh for real-time-ish data
5. Lazy-load below-the-fold content
Be boringly consistent with names.
{Domain} - {Focus} - {Audience}
Example: Marketing - Campaign Performance - Team Lead
{Metric Name} ({Time Period})
Example: Revenue (MTD), New Users (Last 7 Days)
{Metric} by {Dimension} — {Time Period}
Example: Conversion Rate by Channel — Monthly
Select {Dimension}
Example: Select Region, Select Date Range
Every dashboard needs a companion spec. Minimum documentation:
## Dashboard: [Name]
**Primary Question:** [What this dashboard answers]
**Audience:** [Who looks at this and how often]
**Data Sources:** [Tables/views used]
**Refresh Cadence:** [How often data updates]
**Owner:** [Who maintains this]
**KPI Definitions:**
- [Metric 1]: [exact calculation logic]
- [Metric 2]: [exact calculation logic]
**Known Limitations:**
- [What this dashboard does NOT show]
- [Data delays or gaps]| Anti-Pattern | Why It Fails | Fix |
|---|---|---|
| Pie charts with >5 slices | Humans can't compare arc angles | Bar chart |
| 3D charts | Distorts proportions | Flat 2D always |
| Dual-axis with unrelated metrics | Implies correlation that doesn't exist | Two separate charts |
| Red/green only encoding | 8% of men are colorblind | Add shape/pattern encoding |
| Dashboard as a data dump | No narrative, no insight | Start with a question |
| Vanity metrics | Big numbers that don't drive action | Show rate-based or actionable metrics |
| No date context | "Revenue: $1.2M" means nothing without when | Always show time period |
| Auto-scaling axes from zero | Small changes look dramatic | Fix axis or add reference line |