Data Visualization
Create clear, purposeful visualizations that communicate data effectively.
Decision Framework
1. Choose Output Format
| Format |
Best For |
Implementation |
| React Artifact |
Interactive dashboards, real-time exploration, web delivery |
Recharts + Tailwind |
| HTML Artifact |
Standalone interactive charts, shareable files |
Chart.js or D3 |
| Python → PNG/PDF |
Print-ready graphics, reports, presentations |
Matplotlib/Seaborn |
| Python → Interactive |
Notebooks, exploratory analysis |
Plotly |
2. Choose Chart Type
Comparison (values across categories):
- Bar chart: Few categories, discrete comparison
- Grouped bar: Multiple series comparison
- Lollipop: Cleaner alternative to bars
Trend (change over time):
- Line chart: Continuous data, multiple series
- Area chart: Emphasize magnitude/cumulative
- Sparkline: Compact trend indicator
Distribution (data spread):
- Histogram: Frequency distribution
- Box plot: Quartiles and outliers
- Violin: Distribution shape
Composition (parts of whole):
- Pie/Donut: 2-5 categories max, percentages
- Stacked bar: Composition over categories
- Treemap: Hierarchical composition
Relationship (correlation):
- Scatter plot: Two variables correlation
- Bubble chart: Three variables
- Heatmap: Matrix relationships
Geospatial:
- Choropleth: Regional data
- Point map: Location-based values
Implementation Patterns
React Artifact (Recharts)
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';
const data = [
{ month: 'Jan', value: 400 },
{ month: 'Feb', value: 300 },
];
export default function Chart() {
return (
<ResponsiveContainer width="100%" height={400}>
<LineChart data={data} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>
<CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" />
<XAxis dataKey="month" tick={{ fill: '#666' }} />
<YAxis tick={{ fill: '#666' }} />
<Tooltip />
<Line type="monotone" dataKey="value" stroke="#2563eb" strokeWidth={2} dot={false} />
</LineChart>
</ResponsiveContainer>
);
}
Python Static Export
import matplotlib.pyplot as plt
plt.style.use('seaborn-v0_8-whitegrid')
fig, ax = plt.subplots(figsize=(10, 6), dpi=150)
ax.plot(x, y, color='#2563eb', linewidth=2)
ax.set_title('Title', fontsize=14, fontweight='600', pad=20)
ax.set_xlabel('X Label', fontsize=11)
ax.set_ylabel('Y Label', fontsize=11)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.savefig('chart.png', bbox_inches='tight', facecolor='white')
HTML Artifact (Chart.js)
<canvas id="chart"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
new Chart(document.getElementById('chart'), {
type: 'bar',
data: {
labels: ['A', 'B', 'C'],
datasets: [{ data: [10, 20, 30], backgroundColor: '#2563eb' }]
},
options: { responsive: true, plugins: { legend: { display: false } } }
});
</script>
Design Principles
Color
- Sequential: Single hue gradient for ordered data (light→dark)
- Diverging: Two hues for data with meaningful center (blue←white→red)
- Categorical: Distinct hues for unordered categories (max 7-8)
- Colorblind-safe: avoid red/green pairs
Typography
- Title: 14-16px, semibold
- Axis labels: 11-12px, regular
- Annotations: 10-11px
- Sans-serif for clarity (Inter, system-ui)
Layout
- Data-ink ratio: maximize information, minimize decoration
- White space: generous margins
- Alignment: left-align text, right-align numbers
- Grid: subtle, low contrast
Accessibility
- Minimum contrast ratio 4.5:1
- Don't rely on color alone—use patterns, labels
- Alt text for static images
- Keyboard navigation for interactive
Anti-Patterns
- 3D charts (distort perception)
- Pie charts with >5 slices
- Dual Y-axes (misleading)
- Truncated axes (exaggerate)
- Rainbow color scales
- Excessive gridlines
Dashboard Composition
- Hierarchy: Lead with the key metric
- Flow: Left-to-right, top-to-bottom
- Grouping: Related charts in proximity
- Consistency: Same color encoding throughout
- Filtering: Global filters affect all charts
Data Preparation Checklist
Resources
See references/ for detailed guidance:
- color-palettes.md: Curated color schemes for different data types
- chart-selection.md: Extended decision tree for complex cases
1---2name: data-visualization-43description: Create production-quality data visualizations including charts, dashboards, and infographics. Use when the user asks to visualize data, create charts, build dashboards, make infographics, plot statistics, or transform datasets into visual representations. Supports React/Recharts artifacts, static images (PNG/PDF via Python), and interactive HTML. Triggers include "visualize this data", "create a chart", "build a dashboard", "make a graph", "plot this", "infographic", or any request to represent data visually.4---5
6# Data Visualization
7
8Create clear, purposeful visualizations that communicate data effectively.
9
10## Decision Framework
11
12### 1. Choose Output Format
13
14| Format | Best For | Implementation |
15|--------|----------|----------------|
16| **React Artifact** | Interactive dashboards, real-time exploration, web delivery | Recharts + Tailwind |
17| **HTML Artifact** | Standalone interactive charts, shareable files | Chart.js or D3 |
18| **Python → PNG/PDF** | Print-ready graphics, reports, presentations | Matplotlib/Seaborn |
19| **Python → Interactive** | Notebooks, exploratory analysis | Plotly |
20
21### 2. Choose Chart Type
22
23**Comparison** (values across categories):
24- Bar chart: Few categories, discrete comparison
25- Grouped bar: Multiple series comparison
26- Lollipop: Cleaner alternative to bars
27
28**Trend** (change over time):
29- Line chart: Continuous data, multiple series
30- Area chart: Emphasize magnitude/cumulative
31- Sparkline: Compact trend indicator
32
33**Distribution** (data spread):
34- Histogram: Frequency distribution
35- Box plot: Quartiles and outliers
36- Violin: Distribution shape
37
38**Composition** (parts of whole):
39- Pie/Donut: 2-5 categories max, percentages
40- Stacked bar: Composition over categories
41- Treemap: Hierarchical composition
42
43**Relationship** (correlation):
44- Scatter plot: Two variables correlation
45- Bubble chart: Three variables
46- Heatmap: Matrix relationships
47
48**Geospatial**:
49- Choropleth: Regional data
50- Point map: Location-based values
51
52## Implementation Patterns
53
54### React Artifact (Recharts)
55
56```jsx
57import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';
58
59const data = [
60 { month: 'Jan', value: 400 },
61 { month: 'Feb', value: 300 },
62];
63
64export default function Chart() {
65 return (
66 <ResponsiveContainer width="100%" height={400}>
67 <LineChart data={data} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>
68 <CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" />
69 <XAxis dataKey="month" tick={{ fill: '#666' }} />
70 <YAxis tick={{ fill: '#666' }} />
71 <Tooltip />
72 <Line type="monotone" dataKey="value" stroke="#2563eb" strokeWidth={2} dot={false} />
73 </LineChart>
74 </ResponsiveContainer>
75 );
76}
77```
78
79### Python Static Export
80
81```python
82import matplotlib.pyplot as plt
83
84plt.style.use('seaborn-v0_8-whitegrid')
85fig, ax = plt.subplots(figsize=(10, 6), dpi=150)
86
87ax.plot(x, y, color='#2563eb', linewidth=2)
88ax.set_title('Title', fontsize=14, fontweight='600', pad=20)
89ax.set_xlabel('X Label', fontsize=11)
90ax.set_ylabel('Y Label', fontsize=11)
91ax.spines['top'].set_visible(False)
92ax.spines['right'].set_visible(False)
93
94plt.tight_layout()
95plt.savefig('chart.png', bbox_inches='tight', facecolor='white')
96```
97
98### HTML Artifact (Chart.js)
99
100```html
101<canvas id="chart"></canvas>
102<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
103<script>
104new Chart(document.getElementById('chart'), {
105 type: 'bar',
106 data: {
107 labels: ['A', 'B', 'C'],
108 datasets: [{ data: [10, 20, 30], backgroundColor: '#2563eb' }]
109 },
110 options: { responsive: true, plugins: { legend: { display: false } } }
111});
112</script>
113```
114
115## Design Principles
116
117### Color
118- **Sequential**: Single hue gradient for ordered data (light→dark)
119- **Diverging**: Two hues for data with meaningful center (blue←white→red)
120- **Categorical**: Distinct hues for unordered categories (max 7-8)
121- Colorblind-safe: avoid red/green pairs
122
123### Typography
124- Title: 14-16px, semibold
125- Axis labels: 11-12px, regular
126- Annotations: 10-11px
127- Sans-serif for clarity (Inter, system-ui)
128
129### Layout
130- Data-ink ratio: maximize information, minimize decoration
131- White space: generous margins
132- Alignment: left-align text, right-align numbers
133- Grid: subtle, low contrast
134
135### Accessibility
136- Minimum contrast ratio 4.5:1
137- Don't rely on color alone—use patterns, labels
138- Alt text for static images
139- Keyboard navigation for interactive
140
141## Anti-Patterns
142
143- 3D charts (distort perception)
144- Pie charts with >5 slices
145- Dual Y-axes (misleading)
146- Truncated axes (exaggerate)
147- Rainbow color scales
148- Excessive gridlines
149
150## Dashboard Composition
151
1521. **Hierarchy**: Lead with the key metric
1532. **Flow**: Left-to-right, top-to-bottom
1543. **Grouping**: Related charts in proximity
1554. **Consistency**: Same color encoding throughout
1565. **Filtering**: Global filters affect all charts
157
158## Data Preparation Checklist
159
160- [ ] Handle missing values
161- [ ] Check for outliers
162- [ ] Normalize if comparing scales
163- [ ] Sort meaningfully
164- [ ] Aggregate appropriately
165- [ ] Round display values (2-3 digits)
166
167## Resources
168
169See `references/` for detailed guidance:
170- **color-palettes.md**: Curated color schemes for different data types
171- **chart-selection.md**: Extended decision tree for complex cases