The Matchup clusters section is the first block inside the collapsed Dive Analysis details near the bottom of every dive page. It answers a question the scatter plot can’t: which IV spreads are actually interchangeable, and which win a genuinely different set of fights?
The scatter’s y-axis is an average over the whole opponent pool, and averages hide structure: two IV spreads can sit at the same average score while winning different opponents. This section drops the average entirely and groups IV spreads by their win/loss fingerprint - the exact set of marginal matchups each spread wins.
For one shield scenario, most opponents are settled: every IV spread beats them, or none does. Nothing about your IV choice can change those fights, so they carry no information about which spread to build.
The action is in the sharp marginal opponents - the ones between 2% and 98% of the IV spreads beat. On the reference Oinkologne (Female) Great League dive’s 1v1 scenario (a 2026-07 snapshot; your dive shows live values), that’s 15 of 87 opponents: 28 are always-win, 37 are always-lose, and 15 actually flip depending on your IVs. Each spread’s fingerprint is its win/loss vector over just those 15.
IV spreads with similar fingerprints get grouped into clusters (bottom-up, by how many marginal matchups they disagree on - no fixed cluster count is assumed, and a split is only kept when every cluster holds a meaningful number of spreads). Clusters are ordered weakest to strongest by how many marginal fights their members win on average.
The number of clusters isn’t fixed: the method scores each candidate count (2 through 6) by silhouette - how cleanly the fingerprints separate - and keeps only counts where every cluster clears a minimum size. Among those, it deliberately picks the fewest clusters that come within a hair (0.03) of the best silhouette, so a coarser, more readable grouping wins whenever it’s essentially as good as a finer one. If no split clears the minimum-size floor, the section says so outright rather than inventing clusters.
The key honesty note baked into the layout: win-sets cross rather than nest. A “stronger” cluster usually gains matchups and trades some away. The cluster summary table says both - on the reference dive’s 1v1, the stronger cluster gains Florges (+92pp), Sableye (+81pp), and Feraligatr (+76pp), but trades away Empoleon (-73pp) and Mimikyu (-68pp). That trade is the real content of the section: it tells you the two groups of spreads are built for different jobs, not that one strictly beats the other.
Each headline also carries a silhouette score - a 0-to-1 measure of how cleanly the fingerprints separate. When it’s below 0.30 the headline says “weak separation” outright; read weakly-separated clusters as tendencies, not tiers.
The scatter panels project the same IV spreads onto each pair of battle stats - atk x def, atk x hp, def x hp - colored by cluster. This is the “invisible in score, obvious in stats” view: the clusters usually overlap completely on the main scatter’s score axis, but fall into clean stat regions here, because crossing a breakpoint or bulkpoint is what moves a spread from one cluster to the next.
The Shield scenario dropdown (0v0 / 1v1 / 2v2, defaulting to 1v1) switches everything in the section at once - panels and tables. There is deliberately no “average across scenarios” view: different shield counts reward different stats, and averaging them washes out exactly the structure this section exists to show.
The section is computed at bake time for the page’s featured moveset, with the default opponent IVs and bait-selective shield play, over the full opponent pool. It does not follow the scatter’s moveset / opponent-IV / bait dropdowns or the opponent filter - the caption at the top of the section says exactly what it was computed with.
If you’ve pasted your collection into the paste-box, the cluster panels mark your on-grid spreads as gold stars - hover one to see which of your mons sits there and which cluster it lands in. (The tables stay collection-agnostic.)
This section replaced an earlier experimental “banding & clusters” block (retired 2026-07) that clustered on the opponent-averaged score. That method usually fired on numerical noise in the average - and even when it caught a real tier, it couldn’t say which matchups defined it. The matchup-space reframe comes from a dedicated methodology re-evaluation across 17 dived species; the section’s collapsed “How this works” note carries the short version.
Battle engine is a Python port of PvPoke; all game data from PvPoke by Empoleon_Dynamite (MIT license). This project would not exist without it.
Part of the PvP dive site. Explainers regenerate from current dive data every publish, so numbers stay in sync with the methodology. Last regenerated 2026-08-27.