Small Multiples (Trellis Charts)
Small multiples (also called trellis charts or facet grids) repeat the same chart type once per category, side by side, using identical axes and scales so the panels can be compared directly.
Quick answer: In Python with seaborn, build small multiples with sns.FacetGrid(data, col='category', col_wrap=2).map(sns.lineplot, 'x', 'y'), or with plain matplotlib using plt.subplots(rows, cols, sharex=True, sharey=True) and looping over categories. In Tableau, drag a dimension onto Columns or Rows and turn on synchronized axes. Keep every panel on the same scale, limit the grid to 6-12 panels, and label each one clearly โ that's what makes small multiples comparable at a glance.
How do I create small multiples in Python?
Seaborn's FacetGrid is the fastest route for a simple faceted grid; use raw matplotlib subplots when you need more manual control over layout or styling.
Using Seaborn FacetGrid
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# Sample data: Sales by month for different regions
data = pd.DataFrame({
'month': list(range(1, 13)) * 4,
'sales': [100, 120, 115, 140, 160, 155, 170, 165, 180, 175, 190, 200,
80, 90, 85, 100, 110, 105, 120, 115, 130, 125, 140, 150,
120, 140, 135, 160, 180, 175, 190, 185, 200, 195, 210, 220,
90, 110, 105, 125, 140, 135, 150, 145, 160, 155, 170, 180],
'region': ['North']*12 + ['South']*12 + ['East']*12 + ['West']*12
})
# Create small multiples
g = sns.FacetGrid(data, col='region', col_wrap=2, height=3)
g.map(sns.lineplot, 'month', 'sales')
g.set_titles("{col_name} Region")
g.set_axis_labels("Month", "Sales")
plt.tight_layout()
plt.show()
Using Matplotlib Subplots
fig, axes = plt.subplots(2, 2, figsize=(12, 8), sharex=True, sharey=True)
regions = data['region'].unique()
for idx, region in enumerate(regions):
ax = axes[idx // 2, idx % 2]
region_data = data[data['region'] == region]
ax.plot(region_data['month'], region_data['sales'], marker='o')
ax.set_title(f'{region} Region')
ax.set_xlabel('Month')
ax.set_ylabel('Sales')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
When should I use small multiples instead of one combined chart?
Reach for small multiples whenever a single chart with many overlapping lines or bars becomes hard to read โ splitting by category trades one busy chart for several simple ones.
- Comparing trends across multiple categories
- Showing the same metric for different groups
- Avoiding cluttered single charts with many lines
- Highlighting patterns that vary by category
Do small multiples work with bar charts and histograms, not just lines?
Yes โ FacetGrid's .map() accepts any plotting function, so the same faceting pattern works with bar plots, scatter plots, and histograms without changing the setup.
Bar Charts
# Sales by product category across regions
g = sns.FacetGrid(data, col='region', col_wrap=2)
g.map(sns.barplot, 'category', 'sales')
g.set_xticklabels(rotation=45)
plt.show()
Scatter Plots
# Price vs. quantity across different stores
g = sns.FacetGrid(data, col='store', col_wrap=3)
g.map(sns.scatterplot, 'price', 'quantity')
g.add_legend()
plt.show()
Histograms
# Distribution of scores by department
g = sns.FacetGrid(data, col='department', col_wrap=3)
g.map(plt.hist, 'score', bins=20)
plt.show()
What makes a small multiples grid easy to read?
Consistency across panels matters more than any individual panel's design โ the whole point is fair, instant comparison.
- Use same scales: Makes comparison easier
- Consistent formatting: Same colors, fonts, styles
- Clear titles: Label each small multiple
- Logical ordering: Arrange by magnitude or category
- Limit quantity: 6-12 multiples max for readability
Can I facet on two variables at once?
Yes โ pass a second dimension to FacetGrid's row parameter alongside col to get a full grid faceted by both variables simultaneously.
# Small multiples by region AND product type
g = sns.FacetGrid(data,
col='region',
row='product_type',
height=3,
aspect=1.5)
g.map(sns.lineplot, 'month', 'sales')
g.add_legend()
g.set_titles(col_template="{col_name}", row_template="{row_name}")
plt.show()
How do I make small multiples in Tableau?
Drag the category dimension onto Columns or Rows, synchronize the axes so every panel shares a scale, then format borders for separation between panels.
Creating Small Multiples in Tableau:
1. Drag dimension to Columns or Rows
2. Right-click axis โ Edit Axis โ ensure "Include zero" matches
3. Format โ Borders to add separation
4. Use "Synchronized axis" for consistent scaling
Tip: Use Ctrl+drag to duplicate sheets with same formatting
Pro Tip: Small multiples work best when comparing patterns, not absolute values. Always use the same scale on all charts to enable fair comparison. Limit to 6-12 multiples to avoid overwhelming viewers!
โ Back to Visualization Tips