Skill: Data Visualization
Choose the right chart for the story, not just the data shape. Every chart should make an argument.
Metadata
| Field |
Value |
| Skill ID |
data-visualization |
| Version |
1.0.0 |
| Category |
Data Analytics |
| Difficulty |
Intermediate |
| Prerequisites |
None |
| Related Skills |
data-analysis, dashboard-design, data-storytelling, chart-interpretation, executive-storytelling, slide-design, graphic-design |
Overview
Data visualization is not chart generation -- it is visual argumentation. The chart type, color palette, annotation, and title are all rhetorical choices that either strengthen or weaken the story.
Core Principles
| Principle |
Rule |
| Title = Insight |
Chart titles state the takeaway, not the data label. "California leads with 39M" not "Population by State" |
| Story-Intent First |
Ask "what story?" before "what chart?" |
| Data-Ink Ratio |
Every pixel of ink should represent data. Remove everything else (Tufte) |
| 3-Second Test |
If a viewer can't grasp the point in 3 seconds, redesign |
| Annotation = Argument |
Callouts carry the story; the chart is evidence, the annotation is the argument |
Module 1: Story-Intent Chart Selection
The primary axis for chart selection is what story the user wants to tell. Data shape is a secondary constraint.
Step 1 -- Identify Story Intent
| Story Intent |
Question Being Answered |
Primary Charts |
Advanced Charts |
| Compare |
"How do these items rank or differ?" |
Bar, Horizontal Bar, Grouped Bar, Radar |
Beeswarm, Parallel Coordinates |
| Change Over Time |
"How has this evolved?" |
Line, Area, Stacked Area |
Streamgraph, Ridgeline |
| Part-to-Whole |
"What share does each segment hold?" |
Donut, Stacked Bar, Pie |
Waffle, Sunburst |
| Distribution |
"How is this spread? What's normal vs. outlier?" |
Histogram, Scatter |
Violin, Beeswarm, Ridgeline |
| Relationship |
"How are these variables connected?" |
Scatter, Bubble |
Chord, Network Graph, Parallel Coords |
| Flow / Process |
"Where does it go? What are the paths?" |
Horizontal Bar (stages) |
Sankey, Chord |
| Hierarchy |
"How is this organized in levels?" |
Treemap |
Sunburst |
| Spatial Pattern |
"Where are the concentrations?" |
Heatmap |
Network Graph |
| Deviation |
"What deviates from the baseline?" |
Bar (diverging), Line (+ reference line) |
Beeswarm |
Step 2 -- Narrow by Data Shape
| Data Shape |
Compatible Intents |
Ruled Out |
| Categorical + numeric |
Compare, Part-to-Whole, Distribution |
Flow (unless sequential) |
| Two numeric variables |
Relationship, Distribution |
Part-to-Whole |
| Time series |
Change Over Time, Deviation |
Hierarchy |
| Network / adjacency |
Relationship, Flow |
Part-to-Whole, Change Over Time |
| Hierarchical (parent-child) |
Hierarchy, Part-to-Whole |
Change Over Time, Distribution |
| Flow matrix (source-target) |
Flow, Relationship |
Compare (use grouped bar) |
Step 3 -- Audience & Context Filter
| Choose Standard When |
Choose Advanced When |
| Audience expects familiar shapes |
Complex relationships (flows, networks) |
| Tooltip interactivity is critical |
Distribution shape matters more than values |
| Chart.js handles the data shape |
Hierarchical structure needs multi-level view |
| Dashboard has 3+ charts (consistency) |
Single hero viz to anchor a story |
| Executive audience (30s scan) |
Analyst audience (exploration expected) |
Story-Intent Detection Heuristics
When the user doesn't state intent explicitly, infer from language:
| User Language |
Inferred Intent |
| "rank", "compare", "versus", "top", "best/worst" |
Compare |
| "over time", "trend", "growth", "decline", "monthly" |
Change Over Time |
| "share", "proportion", "breakdown", "percent of" |
Part-to-Whole |
| "spread", "range", "outlier", "normal", "distribution" |
Distribution |
| "correlation", "relationship", "predict", "affects" |
Relationship |
| "flow", "path", "from X to Y", "conversion", "funnel" |
Flow / Process |
| "hierarchy", "drill down", "parent/child", "levels" |
Hierarchy |
| "where", "hotspot", "concentration", "geographic" |
Spatial Pattern |
| "deviation", "variance", "above/below target", "gap" |
Deviation |
Module 2: Narrative Chart Pairing
A single chart tells one point. Paired charts reinforce the insight from a second angle.
| Primary Chart |
Good Pair |
Why |
| Bar (compare) |
Donut (proportion) |
Shows both absolute and relative size |
| Line (trend) |
Bar (change amount) |
Shows direction and magnitude |
| Scatter (relationship) |
Histogram (distribution) |
Shows correlation and individual spread |
| Treemap (hierarchy) |
Table (detail) |
Shows structure and precise values |
| Sankey (flow) |
Stacked bar (proportions at each stage) |
Shows paths and stage composition |
The Inverted Pyramid Pattern
From population.html reference -- arrange visuals in absorption order:
| Layer |
Component |
Time to Absorb |
Purpose |
| 1 |
KPI cards |
2 seconds |
"What's the big picture?" |
| 2 |
Hero chart |
10 seconds |
Full distribution, interactive |
| 3 |
Supporting charts |
15 seconds |
Same data, different lens |
| 4 |
Table |
As needed |
Precise values for analysts |
| 5 |
Drill-down |
On click |
Detail without clutter |
Module 3: Color Theory
Mandatory: Colorblind-Safe Palette
All chart output MUST use a colorblind-safe palette. The canonical palette for all Alex charting skills is Tableau 10, verified against deuteranopia, protanopia, and tritanopia:
#4e79a7 Blue-Steel (primary)
#f28e2b Orange
#e15759 Coral
#76b7b2 Teal
#59a14f Sage
#edc948 Gold
#b07aa1 Mauve
#ff9da7 Rose
#9c755f Brown
#bab0ac Warm Gray
| Palette |
Colors |
Use Case |
| Categorical (default) |
First N colors from the canonical 10 above |
Unordered categories |
| Sequential Blue |
#deebf7 → #08519c |
Low-to-high numeric |
| Diverging RdBu |
#b2182b → #f7f7f7 → #2166ac |
Above/below midpoint |
| Semantic Region |
Consistent color per category across all charts on a page |
Region, department, status |
Color Rules (Non-Negotiable)
| Rule |
Explanation |
| Always colorblind-safe |
Never use a palette that has not been tested for deuteranopia, protanopia, and tritanopia |
| Semantic consistency |
Same color = same meaning across all charts on a page |
| Highlight, don't decorate |
Use saturated color for the key data point; mute everything else |
| Sequential for ordered data |
Light-to-dark for low-to-high |
| Diverging for deviation |
Two hues diverging from neutral midpoint |
| Never rely on color alone |
Add patterns, labels, or shapes for accessibility |
| Test with Sim Daltonism |
Verify with protanopia and deuteranopia simulation |
WCAG Contrast Requirements
| Context |
Minimum Ratio |
| Text on background |
4.5:1 (AA), 7:1 (AAA) |
| Chart labels |
4.5:1 minimum |
| Data vs. background |
3:1 for graphical elements |
Module 4: Decluttering (Tufte's Data-Ink Ratio)
Every element must earn its place. Remove anything that doesn't carry data.
| Remove |
Replace With |
| Gridlines |
Light reference lines only if needed |
| Borders around chart area |
White space separation |
| Legends (when possible) |
Direct labels on data |
| Background fills |
Transparent / minimal |
| 3D effects |
Never. Always flat. |
| Redundant axis labels |
Context in title or subtitle |
Before/After Anti-Patterns
| Anti-Pattern |
Problem |
Fix |
| Rainbow palette |
No semantic meaning |
Use 2-3 purposeful colors |
| Every bar labeled |
Visual noise |
Label key values only |
| Dual Y axes |
Misleading correlation |
Two separate charts |
| Pie with 8+ slices |
Unreadable |
Horizontal bar, sorted |
| Missing axis zero |
Exaggerated differences |
Start at zero or note truncation |
Module 5: Annotation Hierarchy
| Element |
Content |
Rule |
| Title |
The insight ("Sales peaked at $4.2M in Q3") |
Never a data label |
| Subtitle |
Context ("Quarterly revenue, FY 2024-2025") |
Who, what, when |
| Callout |
The exception ("Q1 2025: +31% jump -- pricing change?") |
Arrow or highlight |
| Footnote |
Caveats ("Excludes returns. Source: SAP ERP.") |
Small, bottom |
| Source |
Data provenance |
Always present |
Module 6: Small Multiples
Use faceted views when a single chart would be overloaded.
| Use Small Multiples When |
Use Overlay When |
| 5+ series on one chart |
2-3 series that interact |
| Each series has its own pattern |
Comparison is the point |
| Reader needs to see individual shapes |
Relative position matters |
Implementation
Grid: 2x3 or 3x4 panels
Each panel: Same axes, same scale (critical!)
Difference: One variable changes per panel (category, time period, cohort)
Module 7: Accessibility
| Requirement |
Implementation |
| Alt text |
Describe the chart's insight, not its structure ("Revenue grew 34% in 2024" not "Bar chart showing revenue") |
| Patterns |
Add hatching or shapes alongside color |
| Keyboard |
Tab-navigable data points in interactive charts |
| Screen reader |
aria-label on chart container, data table fallback |
| High contrast |
Test in Windows High Contrast mode |
Module 8: Tool Targets
| Target |
Library |
Output |
When |
| HTML (self-contained) |
Chart.js 4.x via CDN |
.html file |
Default -- zero-config dashboards |
| HTML (advanced) |
Raw Canvas 2D API |
.html file |
Sankey, Chord, Sunburst, etc. |
| Python |
Plotly |
Interactive HTML/notebook |
Data science workflows |
| Python (static) |
Matplotlib + Seaborn |
PNG/SVG |
Publications, reports |
| Markdown |
Mermaid |
Inline in docs |
Documentation, PRs |
| Power BI |
DAX measures + visuals |
.pbix |
Enterprise BI |
Chart.js Configuration Defaults
// Standard Chart.js defaults for all data-viz skills
Chart.defaults.font.family = "'Segoe UI', system-ui, sans-serif";
Chart.defaults.font.size = 13;
Chart.defaults.plugins.legend.display = false; // prefer direct labels
Chart.defaults.scales.x.grid.display = false; // declutter
Chart.defaults.scales.y.grid.color = "rgba(255,255,255,0.06)"; // subtle
Chart.defaults.plugins.tooltip.backgroundColor = "rgba(0,0,0,0.85)";
Module 9: Advanced Canvas Charts
10 chart types rendered with raw Canvas 2D API -- no extra dependencies beyond the browser.
| Chart |
Story Intent |
Data Shape |
Key Technique |
| Sankey |
Flow |
Source-target-value |
Bezier curves between stacked bars |
| Chord |
Relationship |
Adjacency matrix |
Circular arcs with ribbons |
| Streamgraph |
Change Over Time |
Multi-series time |
Stacked area with centered baseline |
| Sunburst |
Hierarchy |
Parent-child |
Concentric arcs, angular proportion |
| Parallel Coordinates |
Compare (multi-dim) |
Many numeric columns |
Vertical axes, polylines |
| Beeswarm |
Distribution |
Categorical + numeric |
Force-separated dots on axis |
| Ridgeline |
Distribution (compare) |
Series of distributions |
Overlapping density curves |
| Waffle |
Part-to-Whole |
Percentages |
Grid of colored squares |
| Network Graph |
Relationship |
Nodes + edges |
Force-directed layout |
| Violin |
Distribution |
Grouped distributions |
Mirrored density curves |
Canvas Rendering Pattern
// Standard pattern for all advanced charts
const canvas = document.getElementById("chart");
const ctx = canvas.getContext("2d");
const dpr = window.devicePixelRatio || 1;
canvas.width = canvas.clientWidth * dpr;
canvas.height = canvas.clientHeight * dpr;
ctx.scale(dpr, dpr);
// ... render logic
Reference Implementations
| File |
Charts |
Pattern |
visuals.html |
14 standard types |
Card grid, mini/full pairs, per-chart metadata |
adv_visuals.html |
10 advanced types |
Canvas-only rendering, zero dependencies |
population.html |
4 dashboard charts |
Inverted pyramid, narrative flow, drill-down |
Anti-Patterns
| Anti-Pattern |
Why It Fails |
Fix |
| "Chart type first, data second" |
Picks visual before understanding the story |
Start with story intent |
| Title just labels axes |
No argument, no insight |
Write a sentence the viewer should conclude |
| Rainbow palette on categories |
No semantic meaning, accessibility failure |
Max 2-3 purposeful hues |
| Dual Y axes |
Implies false correlation |
Two separate charts |
| Pie chart with 8+ slices |
Unreadable, angle perception is poor |
Sorted horizontal bar |
| 3D anything |
Distorts perception, adds zero information |
Always flat |
| Default gridlines |
Clutter that competes with data |
Remove or make very subtle |
1---2name: data-visualization-23description: Story-intent chart selection, color theory, annotation patterns, decluttering rules, and the "title = insight" principle for data-driven visuals4---56# Skill: Data Visualization78> Choose the right chart for the story, not just the data shape. Every chart should make an argument.910## Metadata1112| Field | Value |13| ------------------ | ------------------------------------------------------------------------------------------------------------------------------ |14| **Skill ID** | data-visualization |15| **Version** | 1.0.0 |16| **Category** | Data Analytics |17| **Difficulty** | Intermediate |18| **Prerequisites** | None |19| **Related Skills** | data-analysis, dashboard-design, data-storytelling, chart-interpretation, executive-storytelling, slide-design, graphic-design |2021## Overview2223Data visualization is not chart generation -- it is **visual argumentation**. The chart type, color palette, annotation, and title are all rhetorical choices that either strengthen or weaken the story.2425### Core Principles2627| Principle | Rule |28| ------------------------- | ---------------------------------------------------------------------------------------------------------- |29| **Title = Insight** | Chart titles state the takeaway, not the data label. "California leads with 39M" not "Population by State" |30| **Story-Intent First** | Ask "what story?" before "what chart?" |31| **Data-Ink Ratio** | Every pixel of ink should represent data. Remove everything else (Tufte) |32| **3-Second Test** | If a viewer can't grasp the point in 3 seconds, redesign |33| **Annotation = Argument** | Callouts carry the story; the chart is evidence, the annotation is the argument |3435## Module 1: Story-Intent Chart Selection3637The primary axis for chart selection is **what story the user wants to tell**. Data shape is a secondary constraint.3839### Step 1 -- Identify Story Intent4041| Story Intent | Question Being Answered | Primary Charts | Advanced Charts |42| -------------------- | ------------------------------------------------ | ---------------------------------------- | ------------------------------------- |43| **Compare** | "How do these items rank or differ?" | Bar, Horizontal Bar, Grouped Bar, Radar | Beeswarm, Parallel Coordinates |44| **Change Over Time** | "How has this evolved?" | Line, Area, Stacked Area | Streamgraph, Ridgeline |45| **Part-to-Whole** | "What share does each segment hold?" | Donut, Stacked Bar, Pie | Waffle, Sunburst |46| **Distribution** | "How is this spread? What's normal vs. outlier?" | Histogram, Scatter | Violin, Beeswarm, Ridgeline |47| **Relationship** | "How are these variables connected?" | Scatter, Bubble | Chord, Network Graph, Parallel Coords |48| **Flow / Process** | "Where does it go? What are the paths?" | Horizontal Bar (stages) | Sankey, Chord |49| **Hierarchy** | "How is this organized in levels?" | Treemap | Sunburst |50| **Spatial Pattern** | "Where are the concentrations?" | Heatmap | Network Graph |51| **Deviation** | "What deviates from the baseline?" | Bar (diverging), Line (+ reference line) | Beeswarm |5253### Step 2 -- Narrow by Data Shape5455| Data Shape | Compatible Intents | Ruled Out |56| --------------------------- | ------------------------------------ | ------------------------------- |57| Categorical + numeric | Compare, Part-to-Whole, Distribution | Flow (unless sequential) |58| Two numeric variables | Relationship, Distribution | Part-to-Whole |59| Time series | Change Over Time, Deviation | Hierarchy |60| Network / adjacency | Relationship, Flow | Part-to-Whole, Change Over Time |61| Hierarchical (parent-child) | Hierarchy, Part-to-Whole | Change Over Time, Distribution |62| Flow matrix (source-target) | Flow, Relationship | Compare (use grouped bar) |6364### Step 3 -- Audience & Context Filter6566| Choose Standard When | Choose Advanced When |67| ------------------------------------- | --------------------------------------------- |68| Audience expects familiar shapes | Complex relationships (flows, networks) |69| Tooltip interactivity is critical | Distribution shape matters more than values |70| Chart.js handles the data shape | Hierarchical structure needs multi-level view |71| Dashboard has 3+ charts (consistency) | Single hero viz to anchor a story |72| Executive audience (30s scan) | Analyst audience (exploration expected) |7374### Story-Intent Detection Heuristics7576When the user doesn't state intent explicitly, infer from language:7778| User Language | Inferred Intent |79| ------------------------------------------------------ | ---------------- |80| "rank", "compare", "versus", "top", "best/worst" | Compare |81| "over time", "trend", "growth", "decline", "monthly" | Change Over Time |82| "share", "proportion", "breakdown", "percent of" | Part-to-Whole |83| "spread", "range", "outlier", "normal", "distribution" | Distribution |84| "correlation", "relationship", "predict", "affects" | Relationship |85| "flow", "path", "from X to Y", "conversion", "funnel" | Flow / Process |86| "hierarchy", "drill down", "parent/child", "levels" | Hierarchy |87| "where", "hotspot", "concentration", "geographic" | Spatial Pattern |88| "deviation", "variance", "above/below target", "gap" | Deviation |8990## Module 2: Narrative Chart Pairing9192A single chart tells one point. Paired charts reinforce the insight from a second angle.9394| Primary Chart | Good Pair | Why |95| ---------------------- | --------------------------------------- | --------------------------------------- |96| Bar (compare) | Donut (proportion) | Shows both absolute and relative size |97| Line (trend) | Bar (change amount) | Shows direction and magnitude |98| Scatter (relationship) | Histogram (distribution) | Shows correlation and individual spread |99| Treemap (hierarchy) | Table (detail) | Shows structure and precise values |100| Sankey (flow) | Stacked bar (proportions at each stage) | Shows paths and stage composition |101102### The Inverted Pyramid Pattern103104From `population.html` reference -- arrange visuals in absorption order:105106| Layer | Component | Time to Absorb | Purpose |107| ----- | ----------------- | -------------- | ------------------------------ |108| 1 | KPI cards | 2 seconds | "What's the big picture?" |109| 2 | Hero chart | 10 seconds | Full distribution, interactive |110| 3 | Supporting charts | 15 seconds | Same data, different lens |111| 4 | Table | As needed | Precise values for analysts |112| 5 | Drill-down | On click | Detail without clutter |113114## Module 3: Color Theory115116### Mandatory: Colorblind-Safe Palette117118All chart output MUST use a colorblind-safe palette. The canonical palette for all Alex charting skills is **Tableau 10**, verified against deuteranopia, protanopia, and tritanopia:119120```121#4e79a7 Blue-Steel (primary)122#f28e2b Orange123#e15759 Coral124#76b7b2 Teal125#59a14f Sage126#edc948 Gold127#b07aa1 Mauve128#ff9da7 Rose129#9c755f Brown130#bab0ac Warm Gray131```132133| Palette | Colors | Use Case |134| ------------------------- | --------------------------------------------------------- | -------------------------- |135| **Categorical (default)** | First N colors from the canonical 10 above | Unordered categories |136| **Sequential Blue** | `#deebf7 → #08519c` | Low-to-high numeric |137| **Diverging RdBu** | `#b2182b → #f7f7f7 → #2166ac` | Above/below midpoint |138| **Semantic Region** | Consistent color per category across all charts on a page | Region, department, status |139140### Color Rules (Non-Negotiable)141142| Rule | Explanation |143| ------------------------------- | ----------------------------------------------------------------------------------------- |144| **Always colorblind-safe** | Never use a palette that has not been tested for deuteranopia, protanopia, and tritanopia |145| **Semantic consistency** | Same color = same meaning across all charts on a page |146| **Highlight, don't decorate** | Use saturated color for the key data point; mute everything else |147| **Sequential for ordered data** | Light-to-dark for low-to-high |148| **Diverging for deviation** | Two hues diverging from neutral midpoint |149| **Never rely on color alone** | Add patterns, labels, or shapes for accessibility |150| **Test with Sim Daltonism** | Verify with protanopia and deuteranopia simulation |151152### WCAG Contrast Requirements153154| Context | Minimum Ratio |155| ------------------- | -------------------------- |156| Text on background | 4.5:1 (AA), 7:1 (AAA) |157| Chart labels | 4.5:1 minimum |158| Data vs. background | 3:1 for graphical elements |159160## Module 4: Decluttering (Tufte's Data-Ink Ratio)161162Every element must earn its place. Remove anything that doesn't carry data.163164| Remove | Replace With |165| ------------------------- | ------------------------------------ |166| Gridlines | Light reference lines only if needed |167| Borders around chart area | White space separation |168| Legends (when possible) | Direct labels on data |169| Background fills | Transparent / minimal |170| 3D effects | Never. Always flat. |171| Redundant axis labels | Context in title or subtitle |172173### Before/After Anti-Patterns174175| Anti-Pattern | Problem | Fix |176| ------------------ | ----------------------- | -------------------------------- |177| Rainbow palette | No semantic meaning | Use 2-3 purposeful colors |178| Every bar labeled | Visual noise | Label key values only |179| Dual Y axes | Misleading correlation | Two separate charts |180| Pie with 8+ slices | Unreadable | Horizontal bar, sorted |181| Missing axis zero | Exaggerated differences | Start at zero or note truncation |182183## Module 5: Annotation Hierarchy184185| Element | Content | Rule |186| ------------ | ------------------------------------------------------- | ------------------ |187| **Title** | The insight ("Sales peaked at $4.2M in Q3") | Never a data label |188| **Subtitle** | Context ("Quarterly revenue, FY 2024-2025") | Who, what, when |189| **Callout** | The exception ("Q1 2025: +31% jump -- pricing change?") | Arrow or highlight |190| **Footnote** | Caveats ("Excludes returns. Source: SAP ERP.") | Small, bottom |191| **Source** | Data provenance | Always present |192193## Module 6: Small Multiples194195Use faceted views when a single chart would be overloaded.196197| Use Small Multiples When | Use Overlay When |198| ------------------------------------- | ------------------------- |199| 5+ series on one chart | 2-3 series that interact |200| Each series has its own pattern | Comparison is the point |201| Reader needs to see individual shapes | Relative position matters |202203### Implementation204205```206Grid: 2x3 or 3x4 panels207Each panel: Same axes, same scale (critical!)208Difference: One variable changes per panel (category, time period, cohort)209```210211## Module 7: Accessibility212213| Requirement | Implementation |214| ----------------- | ------------------------------------------------------------------------------------------------------------ |215| **Alt text** | Describe the chart's insight, not its structure ("Revenue grew 34% in 2024" not "Bar chart showing revenue") |216| **Patterns** | Add hatching or shapes alongside color |217| **Keyboard** | Tab-navigable data points in interactive charts |218| **Screen reader** | `aria-label` on chart container, data table fallback |219| **High contrast** | Test in Windows High Contrast mode |220221## Module 8: Tool Targets222223| Target | Library | Output | When |224| --------------------- | ---------------------- | ------------------------- | --------------------------------- |225| HTML (self-contained) | Chart.js 4.x via CDN | `.html` file | Default -- zero-config dashboards |226| HTML (advanced) | Raw Canvas 2D API | `.html` file | Sankey, Chord, Sunburst, etc. |227| Python | Plotly | Interactive HTML/notebook | Data science workflows |228| Python (static) | Matplotlib + Seaborn | PNG/SVG | Publications, reports |229| Markdown | Mermaid | Inline in docs | Documentation, PRs |230| Power BI | DAX measures + visuals | .pbix | Enterprise BI |231232### Chart.js Configuration Defaults233234```javascript235// Standard Chart.js defaults for all data-viz skills236Chart.defaults.font.family = "'Segoe UI', system-ui, sans-serif";237Chart.defaults.font.size = 13;238Chart.defaults.plugins.legend.display = false; // prefer direct labels239Chart.defaults.scales.x.grid.display = false; // declutter240Chart.defaults.scales.y.grid.color = "rgba(255,255,255,0.06)"; // subtle241Chart.defaults.plugins.tooltip.backgroundColor = "rgba(0,0,0,0.85)";242```243244## Module 9: Advanced Canvas Charts24524610 chart types rendered with raw Canvas 2D API -- no extra dependencies beyond the browser.247248| Chart | Story Intent | Data Shape | Key Technique |249| ------------------------ | ---------------------- | ----------------------- | ----------------------------------- |250| **Sankey** | Flow | Source-target-value | Bezier curves between stacked bars |251| **Chord** | Relationship | Adjacency matrix | Circular arcs with ribbons |252| **Streamgraph** | Change Over Time | Multi-series time | Stacked area with centered baseline |253| **Sunburst** | Hierarchy | Parent-child | Concentric arcs, angular proportion |254| **Parallel Coordinates** | Compare (multi-dim) | Many numeric columns | Vertical axes, polylines |255| **Beeswarm** | Distribution | Categorical + numeric | Force-separated dots on axis |256| **Ridgeline** | Distribution (compare) | Series of distributions | Overlapping density curves |257| **Waffle** | Part-to-Whole | Percentages | Grid of colored squares |258| **Network Graph** | Relationship | Nodes + edges | Force-directed layout |259| **Violin** | Distribution | Grouped distributions | Mirrored density curves |260261### Canvas Rendering Pattern262263```javascript264// Standard pattern for all advanced charts265const canvas = document.getElementById("chart");266const ctx = canvas.getContext("2d");267const dpr = window.devicePixelRatio || 1;268canvas.width = canvas.clientWidth * dpr;269canvas.height = canvas.clientHeight * dpr;270ctx.scale(dpr, dpr);271// ... render logic272```273274## Reference Implementations275276| File | Charts | Pattern |277| ------------------ | ------------------ | ---------------------------------------------- |278| `visuals.html` | 14 standard types | Card grid, mini/full pairs, per-chart metadata |279| `adv_visuals.html` | 10 advanced types | Canvas-only rendering, zero dependencies |280| `population.html` | 4 dashboard charts | Inverted pyramid, narrative flow, drill-down |281282## Anti-Patterns283284| Anti-Pattern | Why It Fails | Fix |285| ------------------------------- | ------------------------------------------- | ------------------------------------------- |286| "Chart type first, data second" | Picks visual before understanding the story | Start with story intent |287| Title just labels axes | No argument, no insight | Write a sentence the viewer should conclude |288| Rainbow palette on categories | No semantic meaning, accessibility failure | Max 2-3 purposeful hues |289| Dual Y axes | Implies false correlation | Two separate charts |290| Pie chart with 8+ slices | Unreadable, angle perception is poor | Sorted horizontal bar |291| 3D anything | Distorts perception, adds zero information | Always flat |292| Default gridlines | Clutter that competes with data | Remove or make very subtle |