PassFlow suppresses arrows when circular mean resultant is below 0.3
Bins whose mean resultant length R (circular concentration) < 0.3 render a neutral glyph (hollow circle by default) instead of an arrow. A zone where passes go in every direction has no honest mean — drawing an arrow would invent a direction the data doesn't support.
Context
PassFlow computes a circular mean over pass angles per grid bin. That mean
is only meaningful when directions cluster. A bin with antiparallel passes
(half forward, half backward) has R ≈ 0 — an arrow pointing the resulting
direction is statistical noise, not signal. mplsoccer renders it anyway and
relies on the reader to squint at low-count bins. That’s a bug dressed as a
feature.
Decision
dispersionFloor: 0.3 gates arrow rendering. Bins with R < 0.3 emit
hasArrow: false and render the lowDispersionGlyph (hollow circle by
default, configurable). Mean angle and R are always emitted on the bin model
so consumers can override or inspect. Independent of the count threshold —
minCountForArrow: 2 also applies.
Why 0.3
Empirically tuned. At R < 0.2 a bin is essentially omnidirectional;
R = 0.5 is a clear one-way preference. 0.3 catches the genuinely confused
bins without over-gating bins with one strong direction and a few outliers.
Consumers who want every mean rendered pass dispersionFloor: 0.
Consequences
- Zones with dispersed pass directions render a visible “no dominant direction” glyph, which is honest editorial output.
- Recipes can preset
dispersionFloor: 0for specialist audit views where all means matter. - Tooltips still surface mean angle and R for gated bins, so analysts can inspect the underlying numbers even when no arrow is drawn.
- Arrow rendering is always gated by
min(R ≥ dispersionFloor, count ≥ minCountForArrow).