accepted

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.

PassFlow default-behaviourvisual-encodingdata-integrity

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: 0 for 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).
← All decisions