Bee Swarm Plot
Uses a d3-force simulation to displace overlapping points outward from the value axis, so every observation stays visible and the swarm width encodes local density. Unlike a strip/jitter plot (random scatter) it is deterministic and density-aware; unlike a violin plot (kernel estimate) it preserves exact values.
Assessment Scores by Group
Each dot is one participant
View data (75 rows)
| Group | Score |
|---|---|
| A | 72 |
| A | 68 |
| A | 81 |
| A | 77 |
| A | 85 |
| A | 64 |
| A | 90 |
| A | 74 |
| A | 79 |
| A | 71 |
| A | 83 |
| A | 76 |
| A | 69 |
| A | 87 |
| A | 73 |
| A | 78 |
| A | 75 |
| A | 70 |
| A | 82 |
| A | 80 |
| A | 76 |
| A | 74 |
| A | 79 |
| A | 77 |
| A | 75 |
| B | 55 |
| B | 62 |
| B | 48 |
| B | 70 |
| B | 59 |
| B | 66 |
| B | 43 |
| B | 58 |
| B | 64 |
| B | 52 |
| B | 60 |
| B | 56 |
| B | 49 |
| B | 63 |
| B | 57 |
| B | 61 |
| B | 54 |
| B | 67 |
| B | 51 |
| B | 65 |
| B | 53 |
| B | 60 |
| B | 58 |
| B | 62 |
| B | 56 |
| C | 88 |
| C | 92 |
| C | 95 |
| C | 84 |
| C | 97 |
| C | 78 |
| C | 89 |
| C | 91 |
| C | 86 |
| C | 94 |
| C | 82 |
| C | 90 |
| C | 87 |
| C | 93 |
| C | 85 |
| C | 88 |
| C | 91 |
| C | 89 |
| C | 86 |
| C | 92 |
| C | 90 |
| C | 87 |
| C | 93 |
| C | 88 |
| C | 89 |
Use a bee swarm plot when…
- Medium datasets (20–200 points per group) where every observation must be visible
- Comparing distributions across 2–5 groups when you want both individual values and density shape
- When random jitter would mislead - bee swarm displaces points in a principled, non-overlapping way
Avoid when…
- Large datasets (>500 points per group) - use violin or density plot instead
- When only summary statistics matter - use box plot
- Audiences unfamiliar with force-layout charts - prefer strip/jitter or box plot
Data it needs
| Property | Value |
|---|---|
| Min Rows | 10 |
| Min Columns | 2 |
| Column Types | stringnumber |
Visual anatomy
Guiding principles
Consider instead
Common mistakes
Dot radius too large, causing excessive lateral displacement that distorts perceived density
Forgetting to sort or label groups meaningfully
Confusing bee swarm with random jitter - the horizontal spread here encodes density, not noise
History
Evolved from Wilkinson's dot plot algorithm; the force-displacement approach was popularized by the D3 beeswarm plugin and the R beeswarm package.
Accessibility notes
Provide group-level summary statistics (median, range) as text. Use distinct group colors with sufficient contrast.
Related reading
Got data? Let's see what works.
Drop your CSV. You'll get a Bee Swarm Plot plus four alternatives - ranked by which one actually fits your data best.