accepted

PassMap renders dots when destination coordinates are missing, never invents arrows

Passes with null / missing `endX` or `endY` render as a dot at the origin, not as an omitted pass and not as an inferred trajectory. Header counts include both arrows and dots so the completion denominator stays honest.

PassMap data-integrityvisual-encodingaccessibility

Context

Providers vary in destination completeness. StatsBomb is dense, Opta F24 has gaps, and adapters that derive pass destinations from the next-event frame can leave events with only origin coordinates. Two failure modes to avoid:

  • Drop the pass entirely — header counts lie; “he made 48 passes” disagrees with the rendered 41.
  • Invent a destination — picks a direction and draws a fake arrow, which reads as analysis but is a hallucination.

Decision

When a pass lacks valid endX / endY, render a dot marker at the origin and keep it in the model. All header stats (attempted, completed, completion percentage) run over the full pass set — dots and arrows both count. Legend gains a “unknown destination” key when any dot renders.

Consequences

  • Analysts reading the chart see at a glance which passes have full trajectory data and which don’t; no hand-audit required against the raw feed.
  • Static SVG export must serialise both arrow and dot glyphs for the chart to remain interpretable offline.
  • Dense pass maps with high missing-endpoint rates become dot-heavy but stay readable; filtering via recipe is always available for arrow-only views.
  • The dot style is configurable via PassMapProps.dots; the fallback itself is not opt-out — invented trajectories aren’t a supported mode.
← All decisions