kvlak limn

Sport & Culture · MLB Statcast · Baseball Savant

What the Pitch
Was Doing

Since 2015, a camera-and-radar rig in every big-league park has measured every pitch in flight: the speed out of the hand, the spin on the ball, the exact inch it crossed the plate. This page reads that ledger - how hard the game now throws, what shapes it throws, and the gap the tracking keeps exposing between the best stuff and the best results.

712K pitches tracked, 2024
2015-2024
Curated 711,714 pitches in 2024, each measured

Thirty Labs

I · The Installation

Statcast is not a sample. The rig sits in all thirty major-league parks, so every pitch in every game is measured the same way, by the same instrument. Here each installation is sized by its home staff's season strikeouts - the loudest thing a pitch can do. Seattle and the Bronx run big; Denver, where the thin air flattens every breaking ball, runs quietest in the league.

Truist Park (ATL) - 1,545 K, 94.7 mph avg four-seam, 2,246 rpm Target Field (MIN) - 1,498 K, 94.5 mph avg four-seam, 2,264 rpm Minute Maid Park (HOU) - 1,472 K, 94.2 mph avg four-seam, 2,312 rpm Citi Field (NYM) - 1,450 K, 94.4 mph avg four-seam, 2,220 rpm Yankee Stadium (NYY) - 1,449 K, 94.7 mph avg four-seam, 2,359 rpm Petco Park (SD) - 1,448 K, 95.3 mph avg four-seam, 2,379 rpm Oracle Park (SF) - 1,429 K, 94.8 mph avg four-seam, 2,278 rpm Citizens Bank Park (PHI) - 1,424 K, 94.3 mph avg four-seam, 2,338 rpm Progressive Field (CLE) - 1,409 K, 93.3 mph avg four-seam, 2,245 rpm T-Mobile Park (SEA) - 1,407 K, 95.5 mph avg four-seam, 2,279 rpm Tropicana Field (TB) - 1,402 K, 94.3 mph avg four-seam, 2,321 rpm Dodger Stadium (LAD) - 1,384 K, 94.8 mph avg four-seam, 2,317 rpm Camden Yards (BAL) - 1,374 K, 94.2 mph avg four-seam, 2,319 rpm American Family Field (MIL) - 1,369 K, 93.9 mph avg four-seam, 2,311 rpm Globe Life Field (TEX) - 1,365 K, 93.6 mph avg four-seam, 2,299 rpm Great American Ball Park (CIN) - 1,364 K, 94.1 mph avg four-seam, 2,352 rpm Guaranteed Rate Field (CWS) - 1,363 K, 94.4 mph avg four-seam, 2,340 rpm PNC Park (PIT) - 1,353 K, 95.5 mph avg four-seam, 2,326 rpm Fenway Park (BOS) - 1,349 K, 94.2 mph avg four-seam, 2,319 rpm Wrigley Field (CHC) - 1,346 K, 93 mph avg four-seam, 2,306 rpm Comerica Park (DET) - 1,344 K, 94.5 mph avg four-seam, 2,267 rpm Kauffman Stadium (KC) - 1,329 K, 94.1 mph avg four-seam, 2,354 rpm loanDepot Park (MIA) - 1,312 K, 94.1 mph avg four-seam, 2,292 rpm Nationals Park (WSH) - 1,307 K, 94.5 mph avg four-seam, 2,256 rpm Busch Stadium (STL) - 1,306 K, 93.9 mph avg four-seam, 2,302 rpm Rogers Centre (TOR) - 1,306 K, 94.2 mph avg four-seam, 2,292 rpm Oakland Coliseum (ATH) - 1,257 K, 94.3 mph avg four-seam, 2,309 rpm Angel Stadium (LAA) - 1,250 K, 93.4 mph avg four-seam, 2,204 rpm Coors Field (COL) - 1,116 K, 94.2 mph avg four-seam, 2,242 rpm Chase Field (ARI) - 0 K, 0 mph avg four-seam, 0 rpm
One bubble per ballpark, placed at curator-authored stadium coordinates and sized by area (radius = square root of strikeouts). Alaska and Hawaii insets are empty - no MLB club plays there; Toronto sits just above the border.
Bubble size = staff strikeouts 900 1,300 1,600
Most strikeouts
  1. 01 Truist Park ATL 1,545
  2. 02 Target Field MIN 1,498
  3. 03 Minute Maid Park HOU 1,472
  4. 04 Citi Field NYM 1,450
  5. 05 Yankee Stadium NYY 1,449
Every park, in a table
Ballpark Club K 4-seam mph Spin rpm
American Family Field Milwaukee, WI MIL 1,369 93.9 2,311
Angel Stadium Anaheim, CA LAA 1,250 93.4 2,204
Busch Stadium St. Louis, MO STL 1,306 93.9 2,302
Camden Yards Baltimore, MD BAL 1,374 94.2 2,319
Chase Field Phoenix, AZ ARI 0 0 0
Citi Field Queens, NY NYM 1,450 94.4 2,220
Citizens Bank Park Philadelphia, PA PHI 1,424 94.3 2,338
Comerica Park Detroit, MI DET 1,344 94.5 2,267
Coors Field Denver, CO COL 1,116 94.2 2,242
Dodger Stadium Los Angeles, CA LAD 1,384 94.8 2,317
Fenway Park Boston, MA BOS 1,349 94.2 2,319
Globe Life Field Arlington, TX TEX 1,365 93.6 2,299
Great American Ball Park Cincinnati, OH CIN 1,364 94.1 2,352
Guaranteed Rate Field Chicago, IL CWS 1,363 94.4 2,340
Kauffman Stadium Kansas City, MO KC 1,329 94.1 2,354
loanDepot Park Miami, FL MIA 1,312 94.1 2,292
Minute Maid Park Houston, TX HOU 1,472 94.2 2,312
Nationals Park Washington, DC WSH 1,307 94.5 2,256
Oakland Coliseum Oakland, CA ATH 1,257 94.3 2,309
Oracle Park San Francisco, CA SF 1,429 94.8 2,278
Petco Park San Diego, CA SD 1,448 95.3 2,379
PNC Park Pittsburgh, PA PIT 1,353 95.5 2,326
Progressive Field Cleveland, OH CLE 1,409 93.3 2,245
Rogers Centre Toronto, ON TOR 1,306 94.2 2,292
T-Mobile Park Seattle, WA SEA 1,407 95.5 2,279
Target Field Minneapolis, MN MIN 1,498 94.5 2,264
Tropicana Field St. Petersburg, FL TB 1,402 94.3 2,321
Truist Park Atlanta, GA ATL 1,545 94.7 2,246
Wrigley Field Chicago, IL CHC 1,346 93 2,306
Yankee Stadium Bronx, NY NYY 1,449 94.7 2,359

Real Statcast figures: strikeouts, average four-seam velocity and spin roll up per home staff (pitching team = home club in the top of the inning) straight from the pitch-level export. Coordinates are curator-authored - see Methodology.

The Nastiest Stuff

II · The Leaderboard

Rank the arsenals by Stuff+, a pitch-quality index where 100 is league average and every 10 points above it is roughly a tier nastier. This is pure process: what the pitch is doing, before a batter has anything to say.

Rk Pitcher Primary Velo Whiff% Stuff+
01 Mason Miller ATH · RHP Four-Seam 100.9 37.7 130
02 Josh Hader HOU · LHP Sinker 96.1 37.9 124
03 Jason Adam SD · RHP Four-Seam 95.5 36.6 122
04 Blake Snell SF · LHP Four-Seam 95.9 35.4 121
05 Jeremiah Estrada SD · RHP Four-Seam 97.2 33.8 120
06 Michael Kopech LAD · RHP Four-Seam 98.7 31.3 119
07 Justin Martinez AZ · RHP Sinker 100.2 29.7 119
08 José Leclerc TEX · RHP Four-Seam 95.3 34.4 118
09 Garrett Crochet CWS · LHP Four-Seam 97.2 30.5 116
10 Tanner Scott SD · LHP Four-Seam 97 30.5 116
11 Aroldis Chapman PIT · LHP Four-Seam 97.8 29.7 116
12 Dylan Cease SD · RHP Four-Seam 96.9 30.6 116
13 Luke Weaver NYY · RHP Four-Seam 95.7 31.0 115
14 Tarik Skubal DET · LHP Four-Seam 96.9 28.3 113
15 Erik Miller SF · LHP Four-Seam 96.9 28.6 113
16 Paul Skenes PIT · RHP Four-Seam 98.8 26.5 113

Bars share one scale; the hairline marks the league-average 100. Velo and Whiff% (whiffs per swing on the whole mix) come straight from the pitch feed. Stuff+ here is a Curated stand-in computed from those real velocity and whiff inputs - Baseball Savant's proprietary Stuff+ model is not in the public export - so it is badged, not the model itself (see Methodology).

Stuff Is Not Results

III · The Gap

The tracking measures the pitch; the scoreboard measures the outcome. They do not always agree. Every pitcher below is placed by Stuff+ (how nasty, going right) against the xwOBA they allow (how much damage, better going up). The parade of triple-digit fastballs clusters to the right - but plenty of them sit low, giving up more than their stuff says they should. That distance is the whole story.

avg stuff (100) avg results 80100120140 .250.280.310.340 STUFF+ → nastier better results (xwOBA) → Mason Miller (ATH) - Stuff+ 130, xwOBA .210 Miller Josh Hader (HOU) - Stuff+ 124, xwOBA .261 Hader Jason Adam (SD) - Stuff+ 122, xwOBA .283 Adam Blake Snell (SF) - Stuff+ 121, xwOBA .254 Snell Jeremiah Estrada (SD) - Stuff+ 120, xwOBA .253 Estrada Michael Kopech (LAD) - Stuff+ 119, xwOBA .293 Kopech Justin Martinez (AZ) - Stuff+ 119, xwOBA .277 Martinez José Leclerc (TEX) - Stuff+ 118, xwOBA .297 Leclerc Garrett Crochet (CWS) - Stuff+ 116, xwOBA .266 Crochet Tanner Scott (SD) - Stuff+ 116, xwOBA .272 Scott Aroldis Chapman (PIT) - Stuff+ 116, xwOBA .272 Chapman Dylan Cease (SD) - Stuff+ 116, xwOBA .287 Cease Luke Weaver (NYY) - Stuff+ 115, xwOBA .286 Weaver Tarik Skubal (DET) - Stuff+ 113, xwOBA .258 Skubal Erik Miller (SF) - Stuff+ 113, xwOBA .280 Miller Paul Skenes (PIT) - Stuff+ 113, xwOBA .249 Skenes
Bottom-right = elite stuff, ordinary results (the gap). Top-left = beating the stuff. The diagonal cluster is where process and outcome agree.
Stuff outruns results Results outrun stuff The two agree
Best stuff, still waiting on results Jason Adam Stuff+ 122 · nastiness rank #3 · results rank #12

A top-3 arsenal that hitters have squared up more than the raw stuff suggests they should - the widest process-to-outcome gap in the set.

Beating the stuff Paul Skenes Stuff+ 113 · nastiness rank #16 · results rank #2

Middling grades on velocity and spin, but the results land near the top - command, sequencing and deception the model does not fully price.

xwOBA (expected wOBA) rolls up straight from the pitch feed's batted-ball model - real. Stuff+ here is a Curated stand-in from the real velocity and whiff inputs, not Baseball Savant's proprietary model, which the public export does not expose - see Methodology.

Line up any two arms, side by side.

Open the compare tool →

The Arms Race

IV · Over Time

Two trends the tracking caught in the act. The league keeps throwing harder: the average four-seamer is up 1.2 mph since 2015, a tenth or two every season, no plateau in sight. And the mix keeps bending away from the heat that defines it - the four-seam recedes year over year while the sweeper, not even a named pitch a decade ago, floods in.

Average four-seam velocity, mph
92.5 93.0 93.5 94.0 94.5 1523 2015: 93.1 mph2019: 93.4 mph2023: 94.2 mph2024: 94.3 mph 93.1 94.3
Pitch mix, share of all pitches (%)
0 10 20 30 40 1523 Four-seam 31.7Sinker 15.7Sweeper 7.3
Four-seam Sinker Sweeper (classified from 2023)
Every season, in a table
Year 4-seam mph 4-seam % Sinker % Sweeper %
2015 93.1 35.5 21.3 0.1
2019 93.4 35.9 16.0 1.0
2023 94.2 31.9 15.4 6.4
2024 94.3 31.7 15.7 7.3

The charted series only; the full eight-pitch mix by season sits in the table under The Whole Repertoire. The sweeper is blank before 2023 because Statcast bucketed it inside the slider until then. Real Statcast figures, aggregated per season from the pitch feed.

Ninety-Five Is the New Ninety

V · The Distribution

Averages flatter the change; the distribution shows it. In 2015 the league's four-seamers piled up at 91 and 92, and 25.9 percent cleared 95. In 2024 the whole curve has slid right and 40.0 percent sit at 95 or better. What used to be a scouting-report exclamation point is now the third pitch of an average inning.

Four-seam velocity, share of all four-seamers by 1-mph bin (%)
0 5 10 15 20 95 mph → 40.0% of four-seamers live here now 83-84 mph, 2015: 0.2% of four-seamers 83-84 mph, 2024: 0.0% of four-seamers 83 84-85 mph, 2015: 0.3% of four-seamers 84-85 mph, 2024: 0.1% of four-seamers 84 85-86 mph, 2015: 0.4% of four-seamers 85-86 mph, 2024: 0.1% of four-seamers 85 86-87 mph, 2015: 0.9% of four-seamers 86-87 mph, 2024: 0.2% of four-seamers 86 87-88 mph, 2015: 1.7% of four-seamers 87-88 mph, 2024: 0.4% of four-seamers 87 88-89 mph, 2015: 3.1% of four-seamers 88-89 mph, 2024: 0.9% of four-seamers 88 89-90 mph, 2015: 5.5% of four-seamers 89-90 mph, 2024: 2.2% of four-seamers 89 90-91 mph, 2015: 8.6% of four-seamers 90-91 mph, 2024: 4.5% of four-seamers 90 91-92 mph, 2015: 11.8% of four-seamers 91-92 mph, 2024: 8.2% of four-seamers 91 92-93 mph, 2015: 14.3% of four-seamers 92-93 mph, 2024: 12.2% of four-seamers 92 93-94 mph, 2015: 13.4% of four-seamers 93-94 mph, 2024: 15.0% of four-seamers 93 94-95 mph, 2015: 13.5% of four-seamers 94-95 mph, 2024: 16.1% of four-seamers 94 95-96 mph, 2015: 10.5% of four-seamers 95-96 mph, 2024: 15.1% of four-seamers 95 96-97 mph, 2015: 7.4% of four-seamers 96-97 mph, 2024: 11.8% of four-seamers 96 97-98 mph, 2015: 4.5% of four-seamers 97-98 mph, 2024: 7.2% of four-seamers 97 98-99 mph, 2015: 2.2% of four-seamers 98-99 mph, 2024: 3.5% of four-seamers 98 99-100 mph, 2015: 0.9% of four-seamers 99-100 mph, 2024: 1.5% of four-seamers 99 100-101 mph, 2015: 0.3% of four-seamers 100-101 mph, 2024: 0.6% of four-seamers 100 101-102 mph, 2015: 0.1% of four-seamers 101-102 mph, 2024: 0.3% of four-seamers 101 14.3 16.1 RELEASE SPEED, MPH
2015 2024

Each pair of columns is one 1-mph bin; heights are the share of that season's four-seamers, so both series sum to 100. The hairline marks 95 mph. Real Statcast distribution, binned straight off the pitch feed's release_speed column (see Methodology).

Every bin, in a table
Bin, mph 2015 share % 2024 share % Change
83-84 0.2 0.0 -0.2
84-85 0.3 0.1 -0.2
85-86 0.4 0.1 -0.3
86-87 0.9 0.2 -0.7
87-88 1.7 0.4 -1.3
88-89 3.1 0.9 -2.2
89-90 5.5 2.2 -3.3
90-91 8.6 4.5 -4.1
91-92 11.8 8.2 -3.6
92-93 14.3 12.2 -2.1
93-94 13.4 15.0 +1.6
94-95 13.5 16.1 +2.6
95-96 10.5 15.1 +4.6
96-97 7.4 11.8 +4.4
97-98 4.5 7.2 +2.7
98-99 2.2 3.5 +1.3
99-100 0.9 1.5 +0.6
100-101 0.3 0.6 +0.3
101-102 0.1 0.3 +0.2

The Whole Repertoire

VI · The Mix

The book still opens on a fastball: nearly six pitches in ten are four-seamers, sinkers or cutters. But the book is being rewritten one percentage point a season. Every fastball's share is drifting down, every bender's is drifting up, and the sweeper went from unclassified to 7.3 percent of all pitches in three seasons. Eight panels, one scale - the flat lines are the story as much as the moving ones.

Share of all pitches by family, 2024 (%)
Fastballs (FF SI FC) - 55.6% of all pitches Fastballs 55.6% FF SI FC Breaking (SL ST CU) - 28.2% of all pitches Breaking 28.2% SL ST CU Offspeed (CH FS) - 13.3% of all pitches Offspeed 13.3% CH FS
FF Four-Seam -3.8 since '15
31.7
SI Sinker -5.6 since '15
15.7
SL Slider +0.5 since '15
14.7
CH Changeup -0.4 since '15
10.2
FC Cutter +2.5 since '15
8.2
ST Sweeper +7.2 since '15
7.3
CU Curveball -1.3 since '15
6.2
FS Splitter +1.5 since '15
3.1
Fastballs (FF SI FC) Breaking (SL ST CU) Offspeed (CH FS)

All eight panels share one 0-40% scale, so a flat low line really is a flat low line; the faint hairline in each panel is 20%. The end figure is the 2024 share. The sweeper panel starts in 2023, when Statcast first split it from the slider. Real Statcast figures (see Methodology).

Every season's full mix, in a table
Year FF SI FC SL ST CU CH FS
2015 35.5 21.3 5.7 14.2 0.1 7.5 10.6 1.6
2019 35.9 16.0 6.6 16.2 1.0 8.2 10.7 1.6
2023 31.9 15.4 7.9 15.5 6.4 6.5 10.8 2.2
2024 31.7 15.7 8.2 14.7 7.3 6.2 10.2 3.1

Usage share of all pitches, percent. Codes are Statcast's own pitch_type classification; the sweeper (ST) is blank before 2023 because it lived inside the slider until then.

The Shape of Deception

VII · The Movement

Radar guns flatter velocity; the cameras also see shape. Every pitch here is placed by how far it moves versus a ball thrown without spin - ride up, run to the arm side, sweep away. The four-seam lives alone at the top because its backspin fights gravity; the sweeper lives alone at the far left because sixteen inches of sideways is the whole trick. A repertoire is really a set of distances between these dots.

Average movement by pitch type, inches vs a zero-spin pitch
-15 -10 -5 0 5 10 15 -10 -5 0 5 10 15 zero spin ← GLOVE SIDE ARM SIDE → HORIZONTAL BREAK, IN RISE → ← DROP Four-Seam (FF) - +7.7 in horizontal, +15.7 in vertical, 94.3 mph FF Four-Seam Sinker (SI) - +14.9 in horizontal, +7.5 in vertical, 93.3 mph SI Sinker Slider (SL) - -4.6 in horizontal, +1.7 in vertical, 85.8 mph SL Slider Changeup (CH) - +14.2 in horizontal, +5.3 in vertical, 85.5 mph CH Changeup Cutter (FC) - -2.5 in horizontal, +8.0 in vertical, 89.5 mph FC Cutter Sweeper (ST) - -13.9 in horizontal, +1.3 in vertical, 82.0 mph ST Sweeper Curveball (CU) - -9.2 in horizontal, -9.7 in vertical, 79.4 mph CU Curveball Splitter (FS) - +10.5 in horizontal, +2.9 in vertical, 86.5 mph FS Splitter
League-average movement per pitch type, catcher's view, mirrored for lefties so arm side always reads right. "Induced" break subtracts gravity: a curveball at -9 falls nine inches more than a spinless ball would.
Fastballs Breaking Offspeed
Every pitch's movement, in a table
Pitch Family Horiz, in Vert, in Velo, mph Spin, rpm
Four-Seam FF fastball +7.7 +15.7 94.3 2,298
Sinker SI fastball +14.9 +7.5 93.3 2,148
Slider SL breaking -4.6 +1.7 85.8 2,429
Changeup CH offspeed +14.2 +5.3 85.5 1,804
Cutter FC fastball -2.5 +8.0 89.5 2,395
Sweeper ST breaking -13.9 +1.3 82.0 2,562
Curveball CU breaking -9.2 -9.7 79.4 2,576
Splitter FS offspeed +10.5 +2.9 86.5 1,315

Real Statcast figures: the per-type means of the pitch feed's pfx_x / pfx_z movement columns, converted to inches and mirrored to arm-side-positive for left-handers (see Methodology).

The Bat Finds Less

VIII · The Slope

Put the two eras side by side and every line tilts the same way: batters swing through every single pitch type more than they did in 2015. Harder fastballs buy a couple points; the benders buy more; the splitter, thrown by almost nobody, misses nearly two bats in five. This is the arms race scored from the hitter's side of the plate.

Whiffs per swing by pitch type, 2015 vs 2024 (%)
15 20 25 30 35 40 2015 2024 Four-Seam 16.0 18.8 Four-Seam +2.8 Four-Seam: 16.0% in 2015, 18.8% in 2024 Sinker 11.9 11.6 Sinker -0.3 Sinker: 11.9% in 2015, 11.6% in 2024 Slider 32.5 32.2 Slider -0.3 Slider: 32.5% in 2015, 32.2% in 2024 Changeup 29.7 29.2 Changeup -0.5 Changeup: 29.7% in 2015, 29.2% in 2024 Curveball 30.1 29.5 Curveball -0.6 Curveball: 30.1% in 2015, 29.5% in 2024 Cutter 20.1 21.2 Cutter +1.1 Cutter: 20.1% in 2015, 21.2% in 2024 Sweeper 30.5 29.6 Sweeper -0.9 Sweeper: 30.5% in 2015, 29.6% in 2024 Splitter 30.4 32.6 Splitter +2.2 Splitter: 30.4% in 2015, 32.6% in 2024
Whiffs per swing: of all swings against the pitch, the share that touched nothing. *The sweeper's first classified season is 2023, so its slope covers three seasons, not eleven.
Fastballs Breaking Offspeed
Every slope, in a table
Pitch From Then % Now % Change
Splitter FS 2015 30.4 32.6 +2.2
Slider SL 2015 32.5 32.2 -0.3
Sweeper ST 2015 30.5 29.6 -0.9
Curveball CU 2015 30.1 29.5 -0.6
Changeup CH 2015 29.7 29.2 -0.5
Cutter FC 2015 20.1 21.2 +1.1
Four-Seam FF 2015 16.0 18.8 +2.8
Sinker SI 2015 11.9 11.6 -0.3

Real Statcast figures: the rates divide swinging strikes by all swings, per pitch type per season, straight off the pitch feed's description column (see Methodology).

What Each Pitch Does

IX · The Ledger

The closing ledger: eight pitches, one tradeoff, every number in one place. Sorted fastest to slowest, the pattern reads almost like a law: the hard pitches (amber) are the ones batters put in play, and the slow benders - sweeper, splitter, slider - are where the swings and misses (slate) live. Velocity buys strikes; shape buys whiffs. Every good arsenal is a bet placed somewhere on this line.

Pitch Usage Velocity, mph · Whiff per swing, % xwOBA
FF Four-Seam 31.7% 94.3 18.8 .339
SI Sinker 15.7% 93.3 11.6 .354
FC Cutter 8.2% 89.5 21.2 .340
FS Splitter 3.1% 86.5 32.6 .259
SL Slider 14.7% 85.8 32.2 .283
CH Changeup 10.2% 85.5 29.2 .292
ST Sweeper 7.3% 82.0 29.6 .263
CU Curveball 6.2% 79.4 29.5 .282

Velocity bars share one scale (floored at 74 mph so the spread reads); whiff bars share another. xwOBA is expected wOBA against - lower is nastier. Real Statcast figures; every value here aggregates directly from the pitch feed (see Methodology).

Part Two

The bat wins. Now what?

Eight readings on the other half of the event - the contact it allows, the luck around it, and the command and deception that decide how often the bat gets a chance at all.

Where the Runs Live

X · The Contact

A pitch is only half the event. When the bat wins, everything that happens next is decided by two numbers - how hard the ball was hit and at what angle. Map every batted ball by those two and the value collapses into one bright district: hit it 100-plus and lift it into the twenties. Statcast calls that a barrel. Nearly all of a season's damage is packed into that small hot corner; everything else is an out waiting to happen.

Mean xwOBA by exit velocity and launch angle, 2024 balls in play
5060708090100110120 -30 -10 0 10 30 50 105-110 mph, -20--10deg: xwOBA .249 on 443 balls 75-80 mph, 40-50deg: xwOBA .070 on 687 balls 85-90 mph, 30-40deg: xwOBA .036 on 1,688 balls 95-100 mph, 50-60deg: xwOBA .009 on 966 balls 105-110 mph, 0-10deg: xwOBA .583 on 2,170 balls 60-65 mph, -30--20deg: xwOBA .173 on 1,192 balls 70-75 mph, -20--10deg: xwOBA .061 on 669 balls 40-45 mph, -30--20deg: xwOBA .277 on 726 balls 55-60 mph, -10-0deg: xwOBA .094 on 123 balls 70-75 mph, 20-30deg: xwOBA .824 on 727 balls 110-115 mph, 10-20deg: xwOBA .958 on 562 balls 105-110 mph, 10-20deg: xwOBA .829 on 2,533 balls 85-90 mph, 40-50deg: xwOBA .012 on 1,388 balls 80-85 mph, -30--20deg: xwOBA .087 on 1,488 balls 75-80 mph, 50-60deg: xwOBA .023 on 1,624 balls 100-105 mph, 50-60deg: xwOBA .010 on 237 balls 100-105 mph, 10-20deg: xwOBA .721 on 3,655 balls 110-115 mph, 0-10deg: xwOBA .660 on 477 balls 75-80 mph, 10-20deg: xwOBA .658 on 1,078 balls 95-100 mph, 0-10deg: xwOBA .494 on 3,110 balls 80-85 mph, 20-30deg: xwOBA .341 on 1,328 balls 95-100 mph, 10-20deg: xwOBA .682 on 3,192 balls 85-90 mph, -30--20deg: xwOBA .074 on 1,406 balls 105-110 mph, 40-50deg: xwOBA .742 on 116 balls 100-105 mph, 20-30deg: xwOBA 1.032 on 3,311 balls 90-95 mph, -20--10deg: xwOBA .136 on 1,635 balls 90-95 mph, 20-30deg: xwOBA .217 on 2,613 balls 80-85 mph, 40-50deg: xwOBA .011 on 983 balls 85-90 mph, -20--10deg: xwOBA .094 on 1,204 balls 95-100 mph, 20-30deg: xwOBA .508 on 3,292 balls 75-80 mph, -20--10deg: xwOBA .063 on 751 balls 90-95 mph, 10-20deg: xwOBA .721 on 2,307 balls 60-65 mph, -10-0deg: xwOBA .094 on 222 balls 55-60 mph, -30--20deg: xwOBA .199 on 930 balls 90-95 mph, 0-10deg: xwOBA .451 on 2,171 balls 90-95 mph, 50-60deg: xwOBA .009 on 2,028 balls 95-100 mph, 40-50deg: xwOBA .091 on 1,380 balls 85-90 mph, 20-30deg: xwOBA .202 on 1,778 balls 85-90 mph, 0-10deg: xwOBA .389 on 1,602 balls 55-60 mph, 0-10deg: xwOBA .130 on 117 balls 60-65 mph, -20--10deg: xwOBA .062 on 303 balls 95-100 mph, -20--10deg: xwOBA .194 on 1,654 balls 80-85 mph, 50-60deg: xwOBA .013 on 2,267 balls 65-70 mph, 30-40deg: xwOBA .737 on 375 balls 95-100 mph, 30-40deg: xwOBA .506 on 2,618 balls 70-75 mph, -30--20deg: xwOBA .130 on 1,350 balls 70-75 mph, -10-0deg: xwOBA .077 on 818 balls 90-95 mph, -10-0deg: xwOBA .241 on 2,004 balls 80-85 mph, 10-20deg: xwOBA .739 on 1,357 balls 100-105 mph, 0-10deg: xwOBA .552 on 3,567 balls 65-70 mph, 50-60deg: xwOBA .020 on 794 balls 65-70 mph, -20--10deg: xwOBA .060 on 528 balls 90-95 mph, 30-40deg: xwOBA .124 on 2,296 balls 75-80 mph, 20-30deg: xwOBA .593 on 1,052 balls 105-110 mph, 20-30deg: xwOBA 1.595 on 1,904 balls 60-65 mph, 10-20deg: xwOBA .263 on 214 balls 55-60 mph, 10-20deg: xwOBA .170 on 128 balls 70-75 mph, 0-10deg: xwOBA .169 on 780 balls 75-80 mph, 30-40deg: xwOBA .096 on 922 balls 70-75 mph, 10-20deg: xwOBA .506 on 740 balls 45-50 mph, -30--20deg: xwOBA .219 on 388 balls 90-95 mph, 40-50deg: xwOBA .034 on 1,716 balls 70-75 mph, 30-40deg: xwOBA .402 on 597 balls 115-120 mph, 0-10deg: xwOBA .757 on 35 balls 80-85 mph, -10-0deg: xwOBA .136 on 1,076 balls 60-65 mph, 30-40deg: xwOBA .589 on 195 balls 95-100 mph, -10-0deg: xwOBA .289 on 2,669 balls 100-105 mph, 30-40deg: xwOBA 1.043 on 1,959 balls 100-105 mph, 40-50deg: xwOBA .288 on 603 balls 100-105 mph, -30--20deg: xwOBA .140 on 525 balls 50-55 mph, 30-40deg: xwOBA .191 on 56 balls 85-90 mph, -10-0deg: xwOBA .186 on 1,428 balls 100-105 mph, -20--10deg: xwOBA .225 on 1,173 balls 50-55 mph, -30--20deg: xwOBA .213 on 654 balls 95-100 mph, -30--20deg: xwOBA .119 on 806 balls 85-90 mph, 10-20deg: xwOBA .761 on 1,736 balls 85-90 mph, 50-60deg: xwOBA .013 on 2,508 balls 65-70 mph, 10-20deg: xwOBA .360 on 430 balls 65-70 mph, -30--20deg: xwOBA .156 on 1,354 balls 70-75 mph, 50-60deg: xwOBA .026 on 1,188 balls 65-70 mph, 0-10deg: xwOBA .157 on 442 balls 75-80 mph, -10-0deg: xwOBA .091 on 853 balls 65-70 mph, 20-30deg: xwOBA .803 on 416 balls 55-60 mph, 40-50deg: xwOBA .138 on 102 balls 110-115 mph, 20-30deg: xwOBA 1.892 on 355 balls 100-105 mph, -10-0deg: xwOBA .339 on 2,382 balls 105-110 mph, -10-0deg: xwOBA .378 on 1,200 balls 60-65 mph, 50-60deg: xwOBA .013 on 476 balls 55-60 mph, -20--10deg: xwOBA .075 on 133 balls 60-65 mph, 0-10deg: xwOBA .142 on 199 balls 90-95 mph, -30--20deg: xwOBA .086 on 1,215 balls 80-85 mph, 0-10deg: xwOBA .296 on 1,260 balls 75-80 mph, -30--20deg: xwOBA .103 on 1,398 balls 110-115 mph, -10-0deg: xwOBA .384 on 160 balls 70-75 mph, 40-50deg: xwOBA .214 on 452 balls 80-85 mph, -20--10deg: xwOBA .074 on 927 balls 45-50 mph, 20-30deg: xwOBA .146 on 50 balls 55-60 mph, 50-60deg: xwOBA .009 on 262 balls 60-65 mph, 20-30deg: xwOBA .556 on 229 balls 45-50 mph, 50-60deg: xwOBA .015 on 49 balls 50-55 mph, 20-30deg: xwOBA .182 on 81 balls 40-45 mph, 20-30deg: xwOBA .225 on 69 balls 80-85 mph, 30-40deg: xwOBA .027 on 1,215 balls 40-45 mph, 0-10deg: xwOBA .226 on 66 balls 75-80 mph, 0-10deg: xwOBA .225 on 1,072 balls 105-110 mph, 30-40deg: xwOBA 1.654 on 701 balls 50-55 mph, -20--10deg: xwOBA .097 on 65 balls 45-50 mph, 30-40deg: xwOBA .144 on 56 balls 40-45 mph, 50-60deg: xwOBA .059 on 127 balls 50-55 mph, 10-20deg: xwOBA .140 on 56 balls 105-110 mph, -30--20deg: xwOBA .162 on 221 balls 65-70 mph, -10-0deg: xwOBA .077 on 493 balls 40-45 mph, 30-40deg: xwOBA .197 on 70 balls 50-55 mph, 50-60deg: xwOBA .009 on 129 balls 55-60 mph, 20-30deg: xwOBA .304 on 108 balls 40-45 mph, -20--10deg: xwOBA .278 on 100 balls 65-70 mph, 40-50deg: xwOBA .312 on 313 balls 40-45 mph, 10-20deg: xwOBA .214 on 63 balls 60-65 mph, 40-50deg: xwOBA .228 on 159 balls 45-50 mph, -20--10deg: xwOBA .132 on 43 balls 55-60 mph, 30-40deg: xwOBA .332 on 106 balls 50-55 mph, -10-0deg: xwOBA .103 on 63 balls 40-45 mph, -10-0deg: xwOBA .234 on 84 balls 115-120 mph, 10-20deg: xwOBA 1.094 on 53 balls 110-115 mph, 30-40deg: xwOBA 1.933 on 99 balls 40-45 mph, 40-50deg: xwOBA .162 on 56 balls 50-55 mph, 40-50deg: xwOBA .088 on 53 balls 50-55 mph, 0-10deg: xwOBA .121 on 66 balls 45-50 mph, -10-0deg: xwOBA .126 on 42 balls 45-50 mph, 10-20deg: xwOBA .138 on 34 balls 110-115 mph, -20--10deg: xwOBA .287 on 36 balls 45-50 mph, 0-10deg: xwOBA .134 on 31 balls 45-50 mph, 40-50deg: xwOBA .081 on 29 balls 105-110 mph, 50-60deg: xwOBA .018 on 18 balls 115-120 mph, 20-30deg: xwOBA 1.958 on 21 balls EXIT VELOCITY, MPH → ↑ LAUNCH ANGLE, DEG
Each cell is the average expected wOBA of every 2024 ball in play that left the bat in that 5 mph by 10-degree box (cells with fewer than 15 balls are left blank). xwOBA near 2.0 is home-run territory; near zero is an automatic out.
xwOBA weak · .0002.000 · barrel
Expected value by exit-velocity band, in a table
Exit velocity Balls in play Mean xwOBA
40 to 45 mph 1,361 .237
45 to 50 mph 722 .171
50 to 55 mph 1,223 .163
55 to 60 mph 2,009 .163
60 to 65 mph 3,189 .193
65 to 70 mph 5,145 .239
70 to 75 mph 7,321 .239
75 to 80 mph 9,437 .214
80 to 85 mph 11,901 .189
85 to 90 mph 14,738 .197
90 to 95 mph 17,985 .244
95 to 100 mph 19,687 .408
100 to 105 mph 17,412 .654
105 to 110 mph 9,306 .886
110 to 115 mph 1,689 1.059
115 to 120 mph 109 1.152

Real Statcast: the count-weighted mean of estimated_woba_using_speedangle across launch angles within each exit-velocity band, 2024 balls in play.

The Value of Contact

XI · The Damage

Not all contact is created equal. Ground balls are the most common thing a bat does - forty-four percent of everything put in play - yet they are near the bottom in value. Line drives are only twenty-two percent of contact but are worth by far the most, an xwOBA of .698 against a grounder's .259. Here length is how often, color is how much: the two run nearly inverted. The most frequent swing outcome is one of the least productive, and the rare one is the one that scores.

Share of balls in play by batted-ball class, colored by xwOBA, 2024
0 10 20 30 40 50 Ground balls: 44.1% of contact, 86.5 mph mean exit velocity, xwOBA .259 Ground balls .259 xwOBA · 86.5 mph Line balls: 22.0% of contact, 93.3 mph mean exit velocity, xwOBA .698 Line balls .698 xwOBA · 93.3 mph Fly balls: 23.6% of contact, 89.9 mph mean exit velocity, xwOBA .427 Fly balls .427 xwOBA · 89.9 mph Popup balls: 10.2% of contact, 81.9 mph mean exit velocity, xwOBA .015 Popup balls .015 xwOBA · 81.9 mph SHARE OF BALLS IN PLAY, % →
Length is frequency, color is value: each bar is a class's share of 2024 balls in play, tinted by its mean expected wOBA. A ground ball is the likeliest outcome and among the least productive; a line drive is rare and the most productive.
xwOBA (value of the contact) lowhigh
Every batted-ball class, in a table
Class Share % Mean EV, mph xwOBA
Ground balls 44.1 86.5 .259
Line balls 22.0 93.3 .698
Fly balls 23.6 89.9 .427
Popup balls 10.2 81.9 .015

Real Statcast: 2024 balls in play grouped by launch-angle class, with each class's share of contact, mean exit velocity, and mean expected wOBA.

The Art of Weak Contact

XII · The Soft Touch

A strikeout is the loud way to win a pitch. The quiet way is to let the batter swing and still smother the ball - jam the barrel, steal the angle, and give up nothing but a soft grounder. These fourteen pitchers allowed the softest average contact in the game. A shorter bar is a gentler ball off the bat, and every one of them sits left of the league line: the whole field they face hits it below average.

Mean exit velocity allowed, fourteen softest-contact pitchers, mph
80 82 84 86 88 90 92 EXIT VELOCITY ALLOWED, MPH (axis starts at 80) HARD-HIT% Michael King (RHP, SD): 84.8 mph mean exit velocity allowed, 30.5% hard-hit over 453 batted balls Michael King RHP 84.8 30.5 Ryan Yarbrough (LHP, LAD): 84.8 mph mean exit velocity allowed, 29.5% hard-hit over 288 batted balls Ryan Yarbrough LHP 84.8 29.5 Tyler Rogers (RHP, SF): 85.0 mph mean exit velocity allowed, 31.1% hard-hit over 225 batted balls Tyler Rogers RHP 85.0 31.1 Justin Steele (LHP, CHC): 85.4 mph mean exit velocity allowed, 33.2% hard-hit over 379 batted balls Justin Steele LHP 85.4 33.2 Kyle Hendricks (RHP, CHC): 85.5 mph mean exit velocity allowed, 33.4% hard-hit over 434 batted balls Kyle Hendricks RHP 85.5 33.4 Brent Suter (LHP, CIN): 85.6 mph mean exit velocity allowed, 30.2% hard-hit over 205 batted balls Brent Suter LHP 85.6 30.2 Max Fried (LHP, ATL): 85.7 mph mean exit velocity allowed, 34.4% hard-hit over 479 batted balls Max Fried LHP 85.7 34.4 Nick Martinez (RHP, CIN): 85.8 mph mean exit velocity allowed, 30.6% hard-hit over 428 batted balls Nick Martinez RHP 85.8 30.6 Hunter Brown (RHP, HOU): 86.0 mph mean exit velocity allowed, 30.3% hard-hit over 468 batted balls Hunter Brown RHP 86.0 30.3 Ranger Suarez (LHP, PHI): 86.0 mph mean exit velocity allowed, 34.7% hard-hit over 429 batted balls Ranger Suarez LHP 86.0 34.7 Blake Snell (LHP, SF): 86.0 mph mean exit velocity allowed, 29.3% hard-hit over 225 batted balls Blake Snell LHP 86.0 29.3 Zack Wheeler (RHP, PHI): 86.1 mph mean exit velocity allowed, 33.6% hard-hit over 497 batted balls Zack Wheeler RHP 86.1 33.6 Chris Sale (LHP, ATL): 86.1 mph mean exit velocity allowed, 31.4% hard-hit over 424 batted balls Chris Sale LHP 86.1 31.4 Tyler Holton (LHP, DET): 86.2 mph mean exit velocity allowed, 32.8% hard-hit over 256 batted balls Tyler Holton LHP 86.2 32.8 league avg 88.5
Bars share one scale that starts at 80 mph, not zero - the real spread is narrow, and a zero baseline would hide it while a tighter zoom would exaggerate it. The hairline is the league-average batted-ball exit velocity, 88.5 mph; every leader sits to its left.
Mean exit velocity allowed - shorter is softer contact League average, 88.5 mph
The 24 softest-contact pitchers, in a table
Pitcher Hand EV allowed, mph Hard-hit % Batted balls
Michael King SD RHP 84.8 30.5 453
Ryan Yarbrough LAD LHP 84.8 29.5 288
Tyler Rogers SF RHP 85.0 31.1 225
Justin Steele CHC LHP 85.4 33.2 379
Kyle Hendricks CHC RHP 85.5 33.4 434
Brent Suter CIN LHP 85.6 30.2 205
Max Fried ATL LHP 85.7 34.4 479
Nick Martinez CIN RHP 85.8 30.6 428
Hunter Brown HOU RHP 86.0 30.3 468
Ranger Suarez PHI LHP 86.0 34.7 429
Blake Snell SF LHP 86.0 29.3 225
Zack Wheeler PHI RHP 86.1 33.6 497
Chris Sale ATL LHP 86.1 31.4 424
Tyler Holton DET LHP 86.2 32.8 256
Michael Wacha KC RHP 86.2 32.6 487
Luis Severino NYM RHP 86.4 35.6 526
Michael Soroka CWS RHP 86.4 35.2 216
Jalen Beeks COL LHP 86.5 33.5 224
Cristopher Sánchez PHI LHP 86.6 34.6 555
Hunter Greene CIN RHP 86.8 32.4 361
Dean Kremer BAL RHP 86.8 35.7 373
Tarik Skubal DET LHP 86.9 33.9 478
Freddy Peralta MIL RHP 86.9 37.0 446
Tanner Banks CWS LHP 87.0 34.1 205

Real Statcast: each pitcher's mean launch_speed (exit velocity) and the share of batted balls at 95-plus mph (hard-hit rate) allowed over their 2024 batted-ball events, minimum sample applied (see Methodology).

Deserved and Actual

XIII · The Luck

Two numbers describe every ball a pitcher allows into play: the one he earned - expected wOBA from the exit velocity and angle he gave up - and the one he actually wore on the scoreboard. Plot earned against actual and the diagonal is fairness itself. Above it a pitcher was hit harder than his contact deserved; below it the gloves and the bounces spared him. Reid Detmers gave up decent contact and a .491 came back anyway; Ryan Yarbrough surrendered the same quality and escaped at .282. Same craft, opposite luck.

Expected vs actual wOBA on contact, 2024 qualified pitchers
.300 .300 .350 .350 .400 .400 .450 .450 .500 .500 as deserved · y = x UNLUCKY ↑ hit harder than deserved softer than deserved ↓ LUCKY EXPECTED wOBA ON CONTACT (DESERVED) → ↑ ACTUAL wOBA ALLOWED (WHAT HAPPENED) Carson Spiers (RHP): deserved .394, actual .461, +.067 vs deserved on 297 batted balls Carlos Carrasco (RHP): deserved .386, actual .437, +.051 vs deserved on 317 batted balls Slade Cecconi (RHP): deserved .385, actual .434, +.049 vs deserved on 251 batted balls Justin Verlander (RHP): deserved .337, actual .385, +.048 vs deserved on 288 batted balls Declan Cronin (RHP): deserved .349, actual .396, +.047 vs deserved on 202 batted balls Cade Povich (LHP): deserved .350, actual .394, +.044 vs deserved on 246 batted balls Jalen Beeks (LHP): deserved .332, actual .375, +.043 vs deserved on 221 batted balls Tanner Banks (LHP): deserved .349, actual .389, +.040 vs deserved on 204 batted balls Garrett Crochet (LHP): deserved .380, actual .420, +.040 vs deserved on 346 batted balls MacKenzie Gore (LHP): deserved .380, actual .418, +.038 vs deserved on 468 batted balls Mitch Spence (RHP): deserved .363, actual .398, +.035 vs deserved on 474 batted balls Tyler Rogers (RHP): deserved .318, actual .353, +.035 vs deserved on 224 batted balls Aaron Civale (RHP): deserved .367, actual .401, +.034 vs deserved on 480 batted balls Nick Pivetta (RHP): deserved .385, actual .419, +.034 vs deserved on 383 batted balls Spencer Arrighetti (RHP): deserved .382, actual .416, +.034 vs deserved on 389 batted balls Casey Mize (RHP): deserved .383, actual .414, +.031 vs deserved on 340 batted balls Logan Allen (LHP): deserved .417, actual .447, +.030 vs deserved on 306 batted balls Hunter Brown (RHP): deserved .339, actual .369, +.030 vs deserved on 468 batted balls Chris Flexen (RHP): deserved .377, actual .407, +.030 vs deserved on 514 batted balls Jordan Montgomery (LHP): deserved .386, actual .416, +.030 vs deserved on 397 batted balls Joe Ryan (RHP): deserved .344, actual .373, +.029 vs deserved on 362 batted balls Taijuan Walker (RHP): deserved .437, actual .466, +.029 vs deserved on 282 batted balls Kyle Freeland (LHP): deserved .398, actual .427, +.029 vs deserved on 376 batted balls Nick Lodolo (LHP): deserved .348, actual .376, +.028 vs deserved on 316 batted balls Graham Ashcraft (RHP): deserved .382, actual .409, +.027 vs deserved on 256 batted balls Mitch Keller (RHP): deserved .376, actual .402, +.026 vs deserved on 536 batted balls Brandon Pfaadt (RHP): deserved .377, actual .403, +.026 vs deserved on 524 batted balls DJ Herz (LHP): deserved .348, actual .373, +.025 vs deserved on 235 batted balls Patrick Sandoval (LHP): deserved .381, actual .405, +.024 vs deserved on 233 batted balls Andrew Abbott (LHP): deserved .350, actual .374, +.024 vs deserved on 412 batted balls Justin Steele (LHP): deserved .314, actual .337, +.023 vs deserved on 374 batted balls Josh Winckowski (RHP): deserved .361, actual .382, +.021 vs deserved on 241 batted balls Nestor Cortes (LHP): deserved .360, actual .380, +.020 vs deserved on 502 batted balls Ross Stripling (RHP): deserved .369, actual .389, +.020 vs deserved on 308 batted balls Grayson Rodriguez (RHP): deserved .376, actual .396, +.020 vs deserved on 319 batted balls Matt Waldron (RHP): deserved .368, actual .388, +.020 vs deserved on 437 batted balls Cooper Criswell (RHP): deserved .355, actual .375, +.020 vs deserved on 312 batted balls Sean Hjelle (RHP): deserved .361, actual .381, +.020 vs deserved on 240 batted balls Ty Blach (LHP): deserved .430, actual .450, +.020 vs deserved on 266 batted balls Marcus Stroman (RHP): deserved .373, actual .392, +.019 vs deserved on 487 batted balls Tim Hill (LHP): deserved .304, actual .323, +.019 vs deserved on 237 batted balls Roddery Muñoz (RHP): deserved .445, actual .464, +.019 vs deserved on 262 batted balls Chris Bassitt (RHP): deserved .379, actual .397, +.018 vs deserved on 500 batted balls Jordan Hicks (RHP): deserved .376, actual .394, +.018 vs deserved on 327 batted balls Miles Mikolas (RHP): deserved .386, actual .403, +.017 vs deserved on 567 batted balls Tyler Glasnow (RHP): deserved .346, actual .361, +.015 vs deserved on 315 batted balls Jared Jones (RHP): deserved .388, actual .403, +.015 vs deserved on 327 batted balls Aaron Nola (RHP): deserved .373, actual .388, +.015 vs deserved on 566 batted balls Trevor Rogers (LHP): deserved .383, actual .398, +.015 vs deserved on 404 batted balls Cristopher Sánchez (LHP): deserved .349, actual .363, +.014 vs deserved on 552 batted balls Ryne Nelson (RHP): deserved .372, actual .386, +.014 vs deserved on 463 batted balls Joey Estes (RHP): deserved .369, actual .383, +.014 vs deserved on 413 batted balls Pablo López (RHP): deserved .380, actual .393, +.013 vs deserved on 520 batted balls Charlie Morton (RHP): deserved .388, actual .401, +.013 vs deserved on 447 batted balls Jonathan Cannon (RHP): deserved .365, actual .378, +.013 vs deserved on 383 batted balls Griffin Canning (RHP): deserved .374, actual .386, +.012 vs deserved on 535 batted balls Tanner Bibee (RHP): deserved .381, actual .393, +.012 vs deserved on 470 batted balls Cal Quantrill (RHP): deserved .381, actual .392, +.011 vs deserved on 462 batted balls Carlos Rodón (LHP): deserved .391, actual .402, +.011 vs deserved on 472 batted balls Kutter Crawford (RHP): deserved .364, actual .375, +.011 vs deserved on 522 batted balls Paul Blackburn (RHP): deserved .380, actual .391, +.011 vs deserved on 232 batted balls Triston McKenzie (RHP): deserved .409, actual .420, +.011 vs deserved on 214 batted balls Ben Lively (RHP): deserved .351, actual .362, +.011 vs deserved on 458 batted balls Paul Skenes (RHP): deserved .333, actual .344, +.011 vs deserved on 305 batted balls Patrick Corbin (LHP): deserved .415, actual .425, +.010 vs deserved on 563 batted balls Adrian Houser (RHP): deserved .368, actual .378, +.010 vs deserved on 228 batted balls Ranger Suarez (LHP): deserved .362, actual .371, +.009 vs deserved on 426 batted balls Gavin Williams (RHP): deserved .374, actual .383, +.009 vs deserved on 217 batted balls Nick Martinez (RHP): deserved .337, actual .346, +.009 vs deserved on 424 batted balls George Kirby (RHP): deserved .359, actual .366, +.007 vs deserved on 564 batted balls Yusei Kikuchi (LHP): deserved .393, actual .400, +.007 vs deserved on 480 batted balls Luis Severino (RHP): deserved .349, actual .356, +.007 vs deserved on 523 batted balls Ryan Feltner (RHP): deserved .373, actual .380, +.007 vs deserved on 491 batted balls Tyler Alexander (LHP): deserved .394, actual .401, +.007 vs deserved on 333 batted balls Clarke Schmidt (RHP): deserved .365, actual .372, +.007 vs deserved on 217 batted balls Albert Suárez (RHP): deserved .358, actual .365, +.007 vs deserved on 407 batted balls Yariel Rodríguez (RHP): deserved .351, actual .357, +.006 vs deserved on 238 batted balls Sonny Gray (RHP): deserved .405, actual .411, +.006 vs deserved on 422 batted balls Kyle Hendricks (RHP): deserved .369, actual .374, +.005 vs deserved on 434 batted balls Shota Imanaga (LHP): deserved .366, actual .371, +.005 vs deserved on 489 batted balls Andre Pallante (RHP): deserved .315, actual .319, +.004 vs deserved on 352 batted balls Zack Wheeler (RHP): deserved .328, actual .332, +.004 vs deserved on 496 batted balls Tylor Megill (RHP): deserved .393, actual .397, +.004 vs deserved on 205 batted balls Spencer Schwellenbach (RHP): deserved .366, actual .370, +.004 vs deserved on 341 batted balls Freddy Peralta (RHP): deserved .378, actual .381, +.003 vs deserved on 442 batted balls Dane Dunning (RHP): deserved .406, actual .409, +.003 vs deserved on 284 batted balls Zach Eflin (RHP): deserved .361, actual .363, +.002 vs deserved on 521 batted balls JP Sears (LHP): deserved .366, actual .368, +.002 vs deserved on 554 batted balls Ryan Pepiot (RHP): deserved .358, actual .360, +.002 vs deserved on 341 batted balls Jacob Barnes (RHP): deserved .404, actual .406, +.002 vs deserved on 202 batted balls Cole Ragans (LHP): deserved .358, actual .359, +.001 vs deserved on 460 batted balls Shawn Armstrong (RHP): deserved .419, actual .420, +.001 vs deserved on 200 batted balls Martín Pérez (LHP): deserved .407, actual .408, +.001 vs deserved on 427 batted balls Bailey Ober (RHP): deserved .357, actual .358, +.001 vs deserved on 468 batted balls Michael King (RHP): deserved .368, actual .368, +.000 vs deserved on 451 batted balls Chris Sale (LHP): deserved .357, actual .357, +.000 vs deserved on 422 batted balls Edward Cabrera (RHP): deserved .402, actual .402, +.000 vs deserved on 255 batted balls Joe Musgrove (RHP): deserved .398, actual .397, -.001 vs deserved on 275 batted balls Michael Soroka (RHP): deserved .384, actual .383, -.001 vs deserved on 214 batted balls Cole Irvin (LHP): deserved .412, actual .411, -.001 vs deserved on 378 batted balls Brayan Bello (RHP): deserved .381, actual .379, -.002 vs deserved on 471 batted balls Tarik Skubal (LHP): deserved .341, actual .339, -.002 vs deserved on 477 batted balls Frankie Montas (RHP): deserved .393, actual .391, -.002 vs deserved on 428 batted balls Hunter Strickland (RHP): deserved .327, actual .325, -.002 vs deserved on 209 batted balls Zack Littell (RHP): deserved .395, actual .392, -.003 vs deserved on 476 batted balls Jake Irvin (RHP): deserved .378, actual .375, -.003 vs deserved on 552 batted balls Andrew Heaney (LHP): deserved .397, actual .394, -.003 vs deserved on 475 batted balls Jared Shuster (LHP): deserved .365, actual .362, -.003 vs deserved on 231 batted balls Yoshinobu Yamamoto (RHP): deserved .382, actual .378, -.004 vs deserved on 238 batted balls José Ureña (RHP): deserved .350, actual .346, -.004 vs deserved on 348 batted balls Cody Bradford (LHP): deserved .358, actual .353, -.005 vs deserved on 224 batted balls Gavin Stone (RHP): deserved .363, actual .358, -.005 vs deserved on 420 batted balls Joe Ross (RHP): deserved .356, actual .351, -.005 vs deserved on 224 batted balls Mitchell Parker (LHP): deserved .384, actual .379, -.005 vs deserved on 464 batted balls Luis Castillo (RHP): deserved .386, actual .380, -.006 vs deserved on 489 batted balls Zac Gallen (RHP): deserved .376, actual .370, -.006 vs deserved on 406 batted balls James Paxton (LHP): deserved .360, actual .354, -.006 vs deserved on 310 batted balls Valente Bellozo (RHP): deserved .381, actual .375, -.006 vs deserved on 227 batted balls Randy Vásquez (RHP): deserved .407, actual .400, -.007 vs deserved on 331 batted balls Corbin Burnes (RHP): deserved .343, actual .336, -.007 vs deserved on 552 batted balls Brent Suter (LHP): deserved .368, actual .361, -.007 vs deserved on 205 batted balls Jack Kochanowicz (RHP): deserved .360, actual .353, -.007 vs deserved on 219 batted balls Carson Fulmer (RHP): deserved .390, actual .382, -.008 vs deserved on 249 batted balls Chris Paddack (RHP): deserved .411, actual .402, -.009 vs deserved on 283 batted balls Matthew Liberatore (LHP): deserved .377, actual .368, -.009 vs deserved on 249 batted balls Dakota Hudson (RHP): deserved .376, actual .367, -.009 vs deserved on 296 batted balls Simeon Woods Richardson (RHP): deserved .359, actual .350, -.009 vs deserved on 399 batted balls Tobias Myers (RHP): deserved .380, actual .371, -.009 vs deserved on 397 batted balls Yu Darvish (RHP): deserved .357, actual .347, -.010 vs deserved on 226 batted balls Kyle Harrison (LHP): deserved .404, actual .394, -.010 vs deserved on 364 batted balls Ryan Weathers (LHP): deserved .370, actual .360, -.010 vs deserved on 253 batted balls Javier Assad (RHP): deserved .387, actual .377, -.010 vs deserved on 440 batted balls Taj Bradley (RHP): deserved .399, actual .389, -.010 vs deserved on 369 batted balls Gerrit Cole (RHP): deserved .362, actual .352, -.010 vs deserved on 255 batted balls Austin Gomber (LHP): deserved .401, actual .390, -.011 vs deserved on 540 batted balls Colin Rea (RHP): deserved .396, actual .385, -.011 vs deserved on 523 batted balls Bryan Woo (RHP): deserved .318, actual .307, -.011 vs deserved on 354 batted balls Keider Montero (RHP): deserved .403, actual .392, -.011 vs deserved on 301 batted balls Reese Olson (RHP): deserved .347, actual .335, -.012 vs deserved on 326 batted balls Hunter Greene (RHP): deserved .313, actual .301, -.012 vs deserved on 358 batted balls Blake Snell (LHP): deserved .329, actual .317, -.012 vs deserved on 225 batted balls Framber Valdez (LHP): deserved .342, actual .329, -.013 vs deserved on 467 batted balls Michael Wacha (RHP): deserved .370, actual .357, -.013 vs deserved on 482 batted balls Tyler Anderson (LHP): deserved .359, actual .346, -.013 vs deserved on 542 batted balls Kyle Gibson (RHP): deserved .394, actual .380, -.014 vs deserved on 493 batted balls Alec Marsh (RHP): deserved .410, actual .395, -.015 vs deserved on 372 batted balls Derek Law (RHP): deserved .353, actual .337, -.016 vs deserved on 263 batted balls Lance Lynn (RHP): deserved .400, actual .383, -.017 vs deserved on 353 batted balls Jack Flaherty (RHP): deserved .398, actual .381, -.017 vs deserved on 396 batted balls Bailey Falter (LHP): deserved .380, actual .363, -.017 vs deserved on 438 batted balls Bowden Francis (RHP): deserved .334, actual .317, -.017 vs deserved on 284 batted balls Logan Gilbert (RHP): deserved .358, actual .340, -.018 vs deserved on 540 batted balls Erick Fedde (RHP): deserved .358, actual .340, -.018 vs deserved on 513 batted balls Dylan Cease (RHP): deserved .366, actual .348, -.018 vs deserved on 461 batted balls Brady Singer (RHP): deserved .401, actual .382, -.019 vs deserved on 518 batted balls Nathan Eovaldi (RHP): deserved .376, actual .356, -.020 vs deserved on 479 batted balls Jose Quintana (LHP): deserved .365, actual .345, -.020 vs deserved on 503 batted balls Hogan Harris (LHP): deserved .389, actual .368, -.021 vs deserved on 206 batted balls Victor Vodnik (RHP): deserved .385, actual .363, -.022 vs deserved on 215 batted balls Jon Gray (RHP): deserved .391, actual .369, -.022 vs deserved on 322 batted balls Seth Lugo (RHP): deserved .361, actual .338, -.023 vs deserved on 593 batted balls Luis Gil (RHP): deserved .354, actual .331, -.023 vs deserved on 379 batted balls José Soriano (RHP): deserved .354, actual .330, -.024 vs deserved on 314 batted balls Jameson Taillon (RHP): deserved .366, actual .341, -.025 vs deserved on 511 batted balls Ryan Thompson (RHP): deserved .366, actual .340, -.026 vs deserved on 201 batted balls Max Fried (LHP): deserved .356, actual .329, -.027 vs deserved on 479 batted balls Michael Tonkin (RHP): deserved .388, actual .361, -.027 vs deserved on 216 batted balls Dean Kremer (RHP): deserved .388, actual .361, -.027 vs deserved on 372 batted balls Roansy Contreras (RHP): deserved .390, actual .363, -.027 vs deserved on 205 batted balls Dylan Floro (RHP): deserved .349, actual .319, -.030 vs deserved on 211 batted balls Emerson Hancock (RHP): deserved .404, actual .374, -.030 vs deserved on 202 batted balls José Berríos (RHP): deserved .387, actual .356, -.031 vs deserved on 558 batted balls Pedro Avila (RHP): deserved .392, actual .359, -.033 vs deserved on 230 batted balls Merrill Kelly (RHP): deserved .413, actual .379, -.034 vs deserved on 213 batted balls Sean Manaea (LHP): deserved .363, actual .328, -.035 vs deserved on 480 batted balls Luis Ortiz (RHP): deserved .367, actual .331, -.036 vs deserved on 397 batted balls Michael Lorenzen (RHP): deserved .356, actual .320, -.036 vs deserved on 372 batted balls David Peterson (LHP): deserved .375, actual .338, -.037 vs deserved on 354 batted balls Kevin Gausman (RHP): deserved .401, actual .364, -.037 vs deserved on 519 batted balls Bryse Wilson (RHP): deserved .408, actual .370, -.038 vs deserved on 324 batted balls Logan Webb (RHP): deserved .386, actual .348, -.038 vs deserved on 609 batted balls Shane Baz (RHP): deserved .338, actual .299, -.039 vs deserved on 219 batted balls Tanner Houck (RHP): deserved .366, actual .323, -.043 vs deserved on 521 batted balls Ronel Blanco (RHP): deserved .370, actual .326, -.044 vs deserved on 434 batted balls Tyler Holton (LHP): deserved .308, actual .258, -.050 vs deserved on 254 batted balls Will Vest (RHP): deserved .369, actual .317, -.052 vs deserved on 204 batted balls Reid Detmers (LHP): deserved .395, actual .491, +.096 vs deserved on 242 batted balls Reid Detmers Walker Buehler (RHP): deserved .376, actual .457, +.081 vs deserved on 244 batted balls Walker Buehler Kenta Maeda (RHP): deserved .377, actual .429, +.052 vs deserved on 352 batted balls Kenta Maeda Bryce Miller (RHP): deserved .370, actual .314, -.056 vs deserved on 482 batted balls Bryce Miller Reynaldo López (RHP): deserved .394, actual .337, -.057 vs deserved on 350 batted balls Reynaldo López Ryan Yarbrough (LHP): deserved .341, actual .282, -.059 vs deserved on 284 batted balls Ryan Yarbrough
Each dot is one 2024 pitcher who allowed at least 200 balls in play. Distance from the diagonal is luck: the vertical gap between what the contact he gave up was worth and what actually scored. A season of that gap is mostly noise - it rarely repeats the next year.
Above line - hit harder than deserved (unlucky) Below line - softer than deserved (lucky) Within .015 of the line - a wash
The ten unluckiest and ten luckiest, in a table
Pitcher Hand xwOBA (deserved) wOBA (actual) Difference
Unluckiest - hit harder than deserved
Reid Detmers LHP .395 .491 +.096
Walker Buehler RHP .376 .457 +.081
Carson Spiers RHP .394 .461 +.067
Kenta Maeda RHP .377 .429 +.052
Carlos Carrasco RHP .386 .437 +.051
Slade Cecconi RHP .385 .434 +.049
Justin Verlander RHP .337 .385 +.048
Declan Cronin RHP .349 .396 +.047
Cade Povich LHP .350 .394 +.044
Jalen Beeks LHP .332 .375 +.043
Luckiest - softer than deserved
Ryan Yarbrough LHP .341 .282 -.059
Reynaldo López RHP .394 .337 -.057
Bryce Miller RHP .370 .314 -.056
Will Vest RHP .369 .317 -.052
Tyler Holton LHP .308 .258 -.050
Ronel Blanco RHP .370 .326 -.044
Tanner Houck RHP .366 .323 -.043
Shane Baz RHP .338 .299 -.039
Logan Webb RHP .386 .348 -.038
Bryse Wilson RHP .408 .370 -.038

Real Statcast: xwOBA is the count-weighted mean of estimated_woba_using_speedangle over each pitcher's 2024 balls in play; wOBA is the actual wOBA value of the same events. Difference is actual minus deserved (see Methodology).

Where the Swings Miss

XIV · The Zone

A swing is a bet placed a tenth of a second early, and the map of where those bets go wrong is not the strike zone at all. Bats find the barrel on pitches middle-middle; they wave through the ball down and to the edges - the chase pitch below the knees and off the plate away. Read this the way the catcher sees it: plate side is not flipped by batter hand, so a left-hander's away is a right-hander's in.

Whiff per swing by pitch location, catcher's view, 2024
1.01.52.02.53.03.54.0 -1.5-1.0-0.50.00.51.01.5 +0.13 ft side, 3.13 ft high: 18.0% whiff on 4,904 swings +0.88 ft side, 1.88 ft high: 28.9% whiff on 2,679 swings +0.13 ft side, 3.38 ft high: 26.1% whiff on 3,379 swings +0.38 ft side, 2.38 ft high: 10.7% whiff on 6,332 swings -0.38 ft side, 3.63 ft high: 35.9% whiff on 1,772 swings +0.38 ft side, 1.63 ft high: 24.3% whiff on 3,815 swings +0.88 ft side, 2.38 ft high: 16.4% whiff on 2,922 swings -0.13 ft side, 2.88 ft high: 12.9% whiff on 6,099 swings +0.63 ft side, 1.63 ft high: 32.9% whiff on 3,050 swings -0.38 ft side, 2.88 ft high: 12.6% whiff on 5,332 swings +0.88 ft side, 2.13 ft high: 20.8% whiff on 2,797 swings +0.63 ft side, 2.13 ft high: 14.3% whiff on 4,557 swings +0.13 ft side, 2.63 ft high: 11.1% whiff on 6,881 swings +0.38 ft side, 2.63 ft high: 11.5% whiff on 5,950 swings +0.38 ft side, 1.88 ft high: 15.9% whiff on 5,133 swings +0.13 ft side, 1.63 ft high: 21.7% whiff on 4,247 swings -0.13 ft side, 2.13 ft high: 10.0% whiff on 6,519 swings +1.13 ft side, 1.63 ft high: 51.4% whiff on 1,186 swings +0.63 ft side, 2.63 ft high: 13.6% whiff on 4,498 swings +0.63 ft side, 1.88 ft high: 21.6% whiff on 3,952 swings +0.38 ft side, 1.38 ft high: 38.3% whiff on 2,609 swings -0.13 ft side, 3.63 ft high: 34.0% whiff on 2,063 swings +0.38 ft side, 3.13 ft high: 17.5% whiff on 3,986 swings +0.88 ft side, 2.63 ft high: 15.0% whiff on 2,630 swings +1.13 ft side, 3.63 ft high: 36.1% whiff on 147 swings +0.13 ft side, 2.88 ft high: 14.1% whiff on 5,970 swings -0.13 ft side, 2.38 ft high: 8.9% whiff on 6,921 swings +0.13 ft side, 1.88 ft high: 14.8% whiff on 5,501 swings +0.13 ft side, 2.13 ft high: 10.7% whiff on 6,685 swings -0.13 ft side, 3.13 ft high: 17.1% whiff on 4,940 swings +0.38 ft side, 1.13 ft high: 52.7% whiff on 1,600 swings -0.13 ft side, 2.63 ft high: 10.0% whiff on 6,934 swings -0.63 ft side, 2.38 ft high: 8.9% whiff on 4,394 swings -0.38 ft side, 2.63 ft high: 9.7% whiff on 5,898 swings -0.13 ft side, 1.38 ft high: 34.4% whiff on 2,670 swings +0.38 ft side, 2.13 ft high: 11.1% whiff on 5,989 swings -1.13 ft side, 1.63 ft high: 47.3% whiff on 717 swings -0.63 ft side, 2.13 ft high: 11.8% whiff on 4,078 swings +0.38 ft side, 2.88 ft high: 14.6% whiff on 5,301 swings +0.13 ft side, 2.38 ft high: 9.6% whiff on 7,253 swings +1.13 ft side, 1.13 ft high: 78.3% whiff on 571 swings -1.13 ft side, 1.13 ft high: 70.9% whiff on 296 swings -0.38 ft side, 1.88 ft high: 13.9% whiff on 4,477 swings -0.88 ft side, 2.38 ft high: 11.5% whiff on 2,723 swings -0.38 ft side, 1.63 ft high: 21.4% whiff on 3,311 swings -0.38 ft side, 2.38 ft high: 8.2% whiff on 6,083 swings -0.38 ft side, 2.13 ft high: 9.5% whiff on 5,528 swings -0.63 ft side, 2.63 ft high: 9.9% whiff on 4,413 swings -0.63 ft side, 1.88 ft high: 17.2% whiff on 3,289 swings +1.38 ft side, 3.38 ft high: 19.6% whiff on 92 swings +0.63 ft side, 1.13 ft high: 59.2% whiff on 1,338 swings +1.13 ft side, 2.13 ft high: 31.0% whiff on 1,536 swings -0.88 ft side, 2.88 ft high: 13.5% whiff on 2,249 swings +0.63 ft side, 2.38 ft high: 12.0% whiff on 4,648 swings -0.63 ft side, 2.88 ft high: 14.0% whiff on 3,868 swings -1.13 ft side, 2.38 ft high: 18.7% whiff on 1,275 swings +1.13 ft side, 2.88 ft high: 19.3% whiff on 941 swings +0.63 ft side, 2.88 ft high: 15.4% whiff on 3,769 swings -0.13 ft side, 1.88 ft high: 13.1% whiff on 5,296 swings -0.88 ft side, 3.13 ft high: 19.4% whiff on 1,697 swings -0.88 ft side, 2.63 ft high: 11.0% whiff on 2,642 swings -0.13 ft side, 3.38 ft high: 24.9% whiff on 3,471 swings +0.63 ft side, 1.38 ft high: 43.8% whiff on 2,074 swings +1.13 ft side, 1.88 ft high: 41.0% whiff on 1,384 swings -0.63 ft side, 1.63 ft high: 25.7% whiff on 2,350 swings -0.38 ft side, 3.38 ft high: 26.9% whiff on 3,040 swings +0.63 ft side, 3.13 ft high: 19.2% whiff on 2,831 swings -0.13 ft side, 1.63 ft high: 21.0% whiff on 4,022 swings -0.38 ft side, 3.13 ft high: 19.0% whiff on 4,317 swings +1.13 ft side, 1.38 ft high: 69.0% whiff on 913 swings +0.88 ft side, 3.63 ft high: 33.9% whiff on 442 swings +1.38 ft side, 2.38 ft high: 36.6% whiff on 565 swings -1.13 ft side, 3.13 ft high: 20.7% whiff on 798 swings +0.63 ft side, 3.63 ft high: 35.0% whiff on 988 swings +0.88 ft side, 3.13 ft high: 19.2% whiff on 1,569 swings +0.38 ft side, 3.63 ft high: 34.0% whiff on 1,522 swings -0.88 ft side, 1.88 ft high: 24.2% whiff on 1,914 swings -1.13 ft side, 2.88 ft high: 13.3% whiff on 1,027 swings -0.88 ft side, 2.13 ft high: 14.7% whiff on 2,487 swings +0.13 ft side, 1.13 ft high: 49.5% whiff on 1,650 swings +1.13 ft side, 2.63 ft high: 21.2% whiff on 1,180 swings -0.38 ft side, 1.38 ft high: 35.0% whiff on 2,196 swings -0.38 ft side, 3.88 ft high: 48.3% whiff on 778 swings -0.88 ft side, 3.38 ft high: 23.4% whiff on 1,049 swings +0.88 ft side, 1.38 ft high: 54.6% whiff on 1,547 swings +0.88 ft side, 1.63 ft high: 41.0% whiff on 2,055 swings -0.63 ft side, 3.13 ft high: 18.5% whiff on 3,061 swings +0.13 ft side, 1.38 ft high: 32.0% whiff on 2,765 swings -0.88 ft side, 1.38 ft high: 44.3% whiff on 912 swings -1.38 ft side, 1.13 ft high: 83.6% whiff on 122 swings +1.13 ft side, 2.38 ft high: 25.8% whiff on 1,463 swings -1.13 ft side, 2.13 ft high: 22.6% whiff on 1,200 swings -1.13 ft side, 1.38 ft high: 60.3% whiff on 431 swings -1.13 ft side, 2.63 ft high: 14.5% whiff on 1,202 swings +0.13 ft side, 3.63 ft high: 33.4% whiff on 1,993 swings -0.13 ft side, 3.88 ft high: 47.1% whiff on 959 swings -0.63 ft side, 3.38 ft high: 26.8% whiff on 2,141 swings -0.63 ft side, 1.38 ft high: 38.5% whiff on 1,515 swings +0.63 ft side, 3.38 ft high: 26.8% whiff on 1,843 swings -0.63 ft side, 3.63 ft high: 36.7% whiff on 1,142 swings -0.88 ft side, 1.63 ft high: 31.5% whiff on 1,416 swings +0.88 ft side, 3.38 ft high: 27.8% whiff on 934 swings -1.38 ft side, 1.38 ft high: 68.7% whiff on 182 swings -0.63 ft side, 3.88 ft high: 47.1% whiff on 484 swings -0.38 ft side, 1.13 ft high: 51.3% whiff on 1,199 swings +0.38 ft side, 3.38 ft high: 24.6% whiff on 2,787 swings -0.63 ft side, 1.13 ft high: 55.1% whiff on 826 swings +1.38 ft side, 1.88 ft high: 56.5% whiff on 669 swings -0.13 ft side, 1.13 ft high: 48.5% whiff on 1,566 swings +0.88 ft side, 2.88 ft high: 15.9% whiff on 2,000 swings -1.38 ft side, 1.88 ft high: 47.4% whiff on 363 swings +1.38 ft side, 2.88 ft high: 29.3% whiff on 283 swings +1.38 ft side, 2.63 ft high: 27.2% whiff on 449 swings -1.38 ft side, 2.38 ft high: 26.2% whiff on 462 swings -1.13 ft side, 1.88 ft high: 32.8% whiff on 930 swings -1.38 ft side, 2.63 ft high: 25.6% whiff on 433 swings +0.88 ft side, 1.13 ft high: 71.3% whiff on 1,024 swings +1.13 ft side, 3.13 ft high: 20.5% whiff on 600 swings -0.88 ft side, 3.63 ft high: 33.5% whiff on 564 swings +0.13 ft side, 3.88 ft high: 45.8% whiff on 912 swings +1.38 ft side, 1.38 ft high: 79.6% whiff on 447 swings +1.38 ft side, 3.13 ft high: 27.6% whiff on 221 swings -1.38 ft side, 2.88 ft high: 20.4% whiff on 314 swings -1.13 ft side, 3.63 ft high: 33.1% whiff on 245 swings -1.38 ft side, 3.13 ft high: 18.0% whiff on 228 swings -1.38 ft side, 1.63 ft high: 58.0% whiff on 262 swings +1.38 ft side, 1.63 ft high: 67.9% whiff on 574 swings +1.38 ft side, 1.13 ft high: 85.9% whiff on 340 swings +1.38 ft side, 2.13 ft high: 43.9% whiff on 565 swings -1.38 ft side, 2.13 ft high: 36.1% whiff on 413 swings -0.88 ft side, 3.88 ft high: 44.0% whiff on 225 swings -1.13 ft side, 3.38 ft high: 24.0% whiff on 455 swings +0.38 ft side, 3.88 ft high: 43.0% whiff on 676 swings -1.38 ft side, 3.63 ft high: 31.0% whiff on 71 swings +0.88 ft side, 3.88 ft high: 33.3% whiff on 162 swings -0.88 ft side, 1.13 ft high: 63.2% whiff on 552 swings +0.63 ft side, 3.88 ft high: 39.4% whiff on 348 swings +1.13 ft side, 3.38 ft high: 23.3% whiff on 344 swings -1.38 ft side, 3.38 ft high: 25.5% whiff on 161 swings +1.13 ft side, 3.88 ft high: 47.2% whiff on 53 swings -1.13 ft side, 3.88 ft high: 40.7% whiff on 81 swings +1.38 ft side, 3.63 ft high: 36.5% whiff on 52 swings Nominal strike zone STRIKE ZONE ← PLATE SIDE, FT (CATCHER VIEW) → ↑ HEIGHT, FT
Each cell is a 0.25 ft square of the plate, colored by whiffs per swing among 2024 swings that ended there. The color scale is clamped at 40 percent: a few low-swing chase cells at the extreme edges run as high as 86 percent whiff and would otherwise blow out the ramp, so they all sit in the darkest step.
Whiff / swing 0% · contact40%+ · whiff
Whiff rate by height band, in a table
Height band Swings Whiff / swing
Below the zone under 2.0 ft 91,937 31.4%
Lower middle 2.0 to 2.8 ft 130,505 12.3%
Upper middle 2.8 to 3.5 ft 86,001 18.3%
Above the zone over 3.5 ft 15,679 37.7%

Real Statcast: the swing-weighted mean whiff rate across all location cells in each height band, 2024 swings. The middle bands sit lowest; below the zone runs highest, which is where the chase lives.

The Leverage of the Count

XV · The Count

Every plate appearance starts 0-0, and that first pitch is a quarter of all the pitches thrown - the busiest square on the board. From there the count does the hitter's thinking for him. Fall behind to two strikes and he has to protect the zone and chase, so the swing-and-miss rate spikes. Get ahead - 3-0, 3-1 - and he sits on one pitch in one spot and almost never misses it. The count is leverage, drawn as color.

Whiff per swing by ball-strike count, 2024 pitches
STRIKES → 012 BALLS ↓ 0123 0-0 count: 24.2% whiff per swing, 25.7% of all pitches thrown, 58,455 swings 0-0 24.2% 25.7% of pitches 0-1 count: 25.8% whiff per swing, 13.1% of all pitches thrown, 45,553 swings 0-1 25.8% 13.1% of pitches 0-2 count: 25.7% whiff per swing, 6.9% of all pitches thrown, 24,589 swings 0-2 25.7% 6.9% of pitches 1-0 count: 24.1% whiff per swing, 9.6% of all pitches thrown, 29,414 swings 1-0 24.1% 9.6% of pitches 1-1 count: 23.8% whiff per swing, 10.0% of all pitches thrown, 38,944 swings 1-1 23.8% 10.0% of pitches 1-2 count: 24.3% whiff per swing, 9.9% of all pitches thrown, 40,331 swings 1-2 24.3% 9.9% of pitches 2-0 count: 20.2% whiff per swing, 3.2% of all pitches thrown, 9,646 swings 2-0 20.2% 3.2% of pitches 2-1 count: 21.0% whiff per swing, 5.1% of all pitches thrown, 21,047 swings 2-1 21.0% 5.1% of pitches 2-2 count: 21.1% whiff per swing, 8.3% of all pitches thrown, 38,117 swings 2-2 21.1% 8.3% of pitches 3-0 count: 12.7% whiff per swing, 1.0% of all pitches thrown, 676 swings 3-0 12.7% 1.0% of pitches 3-1 count: 17.9% whiff per swing, 2.1% of all pitches thrown, 8,244 swings 3-1 17.9% 2.1% of pitches 3-2 count: 17.2% whiff per swing, 5.0% of all pitches thrown, 25,242 swings 3-2 17.2% 5.0% of pitches
Each square is one count. The big number is whiffs per swing; the small number is that count's share of all pitches thrown. Darker means hitters miss more - the two-strike column runs hot, the 3-0 corner runs cold.
Whiff per swing 13% · rarely miss26% · chase
Every count's whiff and usage, in a table
Count Whiff % Usage % Swings
0-0 24.2 25.7 58,455
0-1 25.8 13.1 45,553
0-2 25.7 6.9 24,589
1-0 24.1 9.6 29,414
1-1 23.8 10.0 38,944
1-2 24.3 9.9 40,331
2-0 20.2 3.2 9,646
2-1 21.0 5.1 21,047
2-2 21.1 8.3 38,117
3-0 12.7 1.0 676
3-1 17.9 2.1 8,244
3-2 17.2 5.0 25,242

Real Statcast: whiffs per swing and share of all pitches thrown, by ball-strike count, over the 2024 season's tracked pitches.

Every Arm Angle

XVI · The Arm Slot

There is no single right place to let go of the ball. Plot every qualified pitcher by where his hand releases it and the deliveries fan across the whole mound - from arms straight over the top past seven feet of height, down through three-quarters and sidearm, to submariners releasing near the knee. Righties and lefties mirror across the rubber: this is the raw catcher's view, not flipped, so each hand claims its own side.

Average release point by pitcher, catcher's view, feet
-4 -3 -2 -1 0 1 2 3 4 1 2 3 4 5 6 7 rubber center ← FIRST-BASE SIDE THIRD-BASE SIDE → RELEASE SIDE, FT RELEASE HEIGHT, FT ↑ Justin Verlander (RHP) - -1.5 ft side, 7.1 ft high, 6.0 ft extension Justin Verlander Ross Stripling (RHP) - -1.2 ft side, 6.9 ft high, 6.0 ft extension Chris Flexen (RHP) - -0.2 ft side, 6.8 ft high, 6.3 ft extension Nick Pivetta (RHP) - -1.5 ft side, 6.8 ft high, 6.8 ft extension José Alvarado (LHP) - +1.0 ft side, 6.7 ft high, 6.8 ft extension Blake Snell (LHP) - +2.0 ft side, 6.6 ft high, 6.8 ft extension Drew Smyly (LHP) - +1.5 ft side, 6.6 ft high, 5.8 ft extension Jordan Montgomery (LHP) - +1.5 ft side, 6.6 ft high, 6.7 ft extension Clay Holmes (RHP) - -0.8 ft side, 6.6 ft high, 6.0 ft extension Austin Gomber (LHP) - +2.2 ft side, 6.5 ft high, 6.7 ft extension Michael Wacha (RHP) - -1.6 ft side, 6.5 ft high, 6.8 ft extension Derek Law (RHP) - -1.0 ft side, 6.5 ft high, 6.5 ft extension Triston McKenzie (RHP) - -1.8 ft side, 6.5 ft high, 6.7 ft extension Taijuan Walker (RHP) - -1.9 ft side, 6.5 ft high, 5.9 ft extension Tyler Kinley (RHP) - -1.0 ft side, 6.5 ft high, 5.6 ft extension Matthew Liberatore (LHP) - +0.7 ft side, 6.4 ft high, 6.3 ft extension Kevin Ginkel (RHP) - -2.1 ft side, 6.4 ft high, 6.8 ft extension Sean Hjelle (RHP) - -1.5 ft side, 6.4 ft high, 6.6 ft extension Miles Mikolas (RHP) - -2.7 ft side, 6.4 ft high, 6.3 ft extension Simeon Woods Richardson (RHP) - -1.1 ft side, 6.4 ft high, 6.7 ft extension Tyler Anderson (LHP) - +1.4 ft side, 6.4 ft high, 6.1 ft extension Erik Miller (LHP) - +1.2 ft side, 6.4 ft high, 6.5 ft extension Aaron Civale (RHP) - -0.9 ft side, 6.4 ft high, 5.7 ft extension Joe Musgrove (RHP) - -1.4 ft side, 6.4 ft high, 6.0 ft extension Joey Wentz (LHP) - +1.1 ft side, 6.4 ft high, 6.5 ft extension Hayden Birdsong (RHP) - -1.2 ft side, 6.3 ft high, 6.5 ft extension Cole Ragans (LHP) - +1.1 ft side, 6.3 ft high, 6.2 ft extension Carlos Rodón (LHP) - +2.0 ft side, 6.3 ft high, 6.1 ft extension Cal Quantrill (RHP) - -1.4 ft side, 6.3 ft high, 6.5 ft extension Graham Ashcraft (RHP) - -0.5 ft side, 6.3 ft high, 5.5 ft extension Anthony Molina (RHP) - -1.7 ft side, 6.3 ft high, 6.2 ft extension Brent Suter (LHP) - +3.3 ft side, 6.3 ft high, 7.2 ft extension Brent Suter Trevor Richards (RHP) - -2.2 ft side, 6.3 ft high, 6.3 ft extension Hunter Brown (RHP) - -1.6 ft side, 6.3 ft high, 6.6 ft extension Justin Martinez (RHP) - -2.9 ft side, 6.3 ft high, 6.5 ft extension Patrick Corbin (LHP) - +2.5 ft side, 6.3 ft high, 6.7 ft extension Kyle Gibson (RHP) - -2.2 ft side, 6.2 ft high, 6.9 ft extension Tanner Banks (LHP) - +2.7 ft side, 6.2 ft high, 6.0 ft extension Nick Martinez (RHP) - -1.6 ft side, 6.2 ft high, 5.8 ft extension Albert Suárez (RHP) - -1.4 ft side, 6.2 ft high, 6.7 ft extension Cody Bradford (LHP) - +0.6 ft side, 6.2 ft high, 7.1 ft extension Mitch Spence (RHP) - -2.7 ft side, 6.2 ft high, 6.2 ft extension Cristopher Sánchez (LHP) - +1.9 ft side, 6.2 ft high, 7.0 ft extension Tanner Bibee (RHP) - -2.3 ft side, 6.2 ft high, 6.6 ft extension Chris Paddack (RHP) - -2.5 ft side, 6.2 ft high, 6.9 ft extension Tarik Skubal (LHP) - +1.7 ft side, 6.2 ft high, 6.3 ft extension Nick Mears (RHP) - -1.5 ft side, 6.2 ft high, 6.8 ft extension David Festa (RHP) - -2.1 ft side, 6.2 ft high, 6.9 ft extension Hunter Gaddis (RHP) - -2.7 ft side, 6.2 ft high, 6.9 ft extension Edward Cabrera (RHP) - -1.3 ft side, 6.2 ft high, 6.7 ft extension Zack Littell (RHP) - -0.6 ft side, 6.1 ft high, 6.2 ft extension Reid Detmers (LHP) - +1.4 ft side, 6.1 ft high, 6.1 ft extension Jason Adam (RHP) - -1.2 ft side, 6.1 ft high, 6.5 ft extension Jameson Taillon (RHP) - -1.3 ft side, 6.1 ft high, 6.6 ft extension David Peterson (LHP) - +2.3 ft side, 6.1 ft high, 7.1 ft extension Justin Steele (LHP) - +2.2 ft side, 6.1 ft high, 6.3 ft extension Dakota Hudson (RHP) - -2.3 ft side, 6.1 ft high, 6.2 ft extension Ronel Blanco (RHP) - -1.0 ft side, 6.1 ft high, 6.8 ft extension Taj Bradley (RHP) - -1.5 ft side, 6.1 ft high, 6.5 ft extension Valente Bellozo (RHP) - -1.1 ft side, 6.1 ft high, 6.0 ft extension Aroldis Chapman (LHP) - +0.4 ft side, 6.1 ft high, 7.4 ft extension Garrett Crochet (LHP) - +2.5 ft side, 6.1 ft high, 7.0 ft extension Dylan Cease (RHP) - -1.2 ft side, 6.1 ft high, 6.3 ft extension Peter Lambert (RHP) - -1.8 ft side, 6.1 ft high, 6.4 ft extension Mike Baumann (RHP) - -1.7 ft side, 6.1 ft high, 6.7 ft extension Michael Soroka (RHP) - -2.7 ft side, 6.1 ft high, 6.0 ft extension Cole Irvin (LHP) - +1.1 ft side, 6.1 ft high, 6.3 ft extension Héctor Neris (RHP) - -1.5 ft side, 6.1 ft high, 6.2 ft extension Ryne Nelson (RHP) - -1.6 ft side, 6.1 ft high, 6.8 ft extension Patrick Sandoval (LHP) - +1.0 ft side, 6.1 ft high, 6.2 ft extension Mason Miller (RHP) - -2.1 ft side, 6.1 ft high, 6.8 ft extension Tyler Glasnow (RHP) - -1.6 ft side, 6.1 ft high, 7.4 ft extension James Paxton (LHP) - +2.2 ft side, 6.1 ft high, 6.5 ft extension Paul Blackburn (RHP) - -2.1 ft side, 6.0 ft high, 6.2 ft extension Dean Kremer (RHP) - -1.9 ft side, 6.0 ft high, 6.2 ft extension Jeff Hoffman (RHP) - -2.7 ft side, 6.0 ft high, 6.5 ft extension Mitchell Parker (LHP) - +1.8 ft side, 6.0 ft high, 6.8 ft extension Alex Faedo (RHP) - -2.1 ft side, 6.0 ft high, 6.1 ft extension Josh Winckowski (RHP) - -1.7 ft side, 6.0 ft high, 6.5 ft extension Bobby Miller (RHP) - -1.2 ft side, 6.0 ft high, 6.9 ft extension Fernando Cruz (RHP) - -1.1 ft side, 6.0 ft high, 6.8 ft extension Dylan Floro (RHP) - -3.4 ft side, 6.0 ft high, 6.5 ft extension Reese Olson (RHP) - -2.7 ft side, 6.0 ft high, 5.9 ft extension Kutter Crawford (RHP) - -1.2 ft side, 6.0 ft high, 6.1 ft extension José Soriano (RHP) - -1.5 ft side, 6.0 ft high, 6.6 ft extension Andre Pallante (RHP) - -1.8 ft side, 6.0 ft high, 6.6 ft extension Javier Assad (RHP) - -1.4 ft side, 6.0 ft high, 6.6 ft extension Framber Valdez (LHP) - +0.7 ft side, 6.0 ft high, 5.9 ft extension Kyle Hendricks (RHP) - -2.6 ft side, 6.0 ft high, 5.6 ft extension Gerrit Cole (RHP) - -2.3 ft side, 6.0 ft high, 6.2 ft extension Jalen Beeks (LHP) - +0.8 ft side, 6.0 ft high, 6.5 ft extension Bailey Ober (RHP) - -1.4 ft side, 6.0 ft high, 7.2 ft extension Beau Brieske (RHP) - -1.5 ft side, 6.0 ft high, 6.1 ft extension Jesús Luzardo (LHP) - +2.3 ft side, 6.0 ft high, 5.7 ft extension Yuki Matsui (LHP) - +2.1 ft side, 6.0 ft high, 5.9 ft extension Hunter Greene (RHP) - -2.1 ft side, 6.0 ft high, 6.4 ft extension Corbin Burnes (RHP) - -0.9 ft side, 6.0 ft high, 6.5 ft extension Ryan Pepiot (RHP) - -1.1 ft side, 6.0 ft high, 6.7 ft extension Max Fried (LHP) - +1.3 ft side, 6.0 ft high, 6.5 ft extension Randy Vásquez (RHP) - -2.0 ft side, 5.9 ft high, 6.2 ft extension Grant Holmes (RHP) - -2.2 ft side, 5.9 ft high, 5.9 ft extension Frankie Montas (RHP) - -1.1 ft side, 5.9 ft high, 6.0 ft extension Roansy Contreras (RHP) - -1.1 ft side, 5.9 ft high, 6.4 ft extension Hayden Wesneski (RHP) - -1.3 ft side, 5.9 ft high, 7.0 ft extension Génesis Cabrera (LHP) - +1.9 ft side, 5.9 ft high, 6.0 ft extension Bowden Francis (RHP) - -2.1 ft side, 5.9 ft high, 6.8 ft extension Keegan Akin (LHP) - +2.2 ft side, 5.9 ft high, 5.8 ft extension Luis Severino (RHP) - -2.0 ft side, 5.9 ft high, 6.4 ft extension Griffin Canning (RHP) - -1.6 ft side, 5.9 ft high, 5.9 ft extension Alex Vesia (LHP) - +0.5 ft side, 5.9 ft high, 6.4 ft extension David Bednar (RHP) - -1.9 ft side, 5.9 ft high, 6.6 ft extension Carlos Carrasco (RHP) - -1.3 ft side, 5.9 ft high, 6.6 ft extension Tyler Holton (LHP) - +1.6 ft side, 5.9 ft high, 6.4 ft extension Hogan Harris (LHP) - +2.4 ft side, 5.9 ft high, 6.7 ft extension Tobias Myers (RHP) - -1.0 ft side, 5.9 ft high, 6.7 ft extension Hunter Strickland (RHP) - -3.1 ft side, 5.9 ft high, 6.0 ft extension José Leclerc (RHP) - -1.8 ft side, 5.9 ft high, 5.6 ft extension Jared Koenig (LHP) - +2.8 ft side, 5.9 ft high, 6.2 ft extension Adrian Houser (RHP) - -1.4 ft side, 5.9 ft high, 6.8 ft extension George Kirby (RHP) - -1.8 ft side, 5.9 ft high, 6.6 ft extension Andrew Abbott (LHP) - +1.7 ft side, 5.9 ft high, 6.6 ft extension Joey Estes (RHP) - -2.1 ft side, 5.9 ft high, 6.0 ft extension Gavin Williams (RHP) - -2.9 ft side, 5.9 ft high, 7.2 ft extension Zac Gallen (RHP) - -2.8 ft side, 5.9 ft high, 6.6 ft extension MacKenzie Gore (LHP) - +1.9 ft side, 5.9 ft high, 7.0 ft extension Osvaldo Bido (RHP) - -2.3 ft side, 5.8 ft high, 6.3 ft extension Ranger Suarez (LHP) - +1.8 ft side, 5.8 ft high, 6.4 ft extension Keider Montero (RHP) - -2.5 ft side, 5.8 ft high, 6.3 ft extension Reynaldo López (RHP) - -1.8 ft side, 5.8 ft high, 6.5 ft extension Logan Gilbert (RHP) - -1.1 ft side, 5.8 ft high, 7.6 ft extension Erick Fedde (RHP) - -1.5 ft side, 5.8 ft high, 6.7 ft extension David Robertson (RHP) - -2.7 ft side, 5.8 ft high, 6.6 ft extension Jeremiah Estrada (RHP) - -0.6 ft side, 5.8 ft high, 6.8 ft extension Adrian Morejon (LHP) - +2.3 ft side, 5.8 ft high, 6.4 ft extension Cade Povich (LHP) - +1.9 ft side, 5.8 ft high, 6.3 ft extension Mark Leiter Jr. (RHP) - -1.4 ft side, 5.8 ft high, 6.7 ft extension Shane Baz (RHP) - -1.5 ft side, 5.8 ft high, 6.6 ft extension Shawn Armstrong (RHP) - -1.6 ft side, 5.8 ft high, 6.6 ft extension Jonathan Cannon (RHP) - -2.3 ft side, 5.8 ft high, 6.2 ft extension Landon Knack (RHP) - -0.9 ft side, 5.8 ft high, 5.8 ft extension Yariel Rodríguez (RHP) - -1.7 ft side, 5.8 ft high, 6.5 ft extension DJ Herz (LHP) - +2.0 ft side, 5.8 ft high, 6.7 ft extension Bryse Wilson (RHP) - -2.9 ft side, 5.8 ft high, 6.5 ft extension Tylor Megill (RHP) - -1.9 ft side, 5.8 ft high, 7.4 ft extension Zach Eflin (RHP) - -2.3 ft side, 5.8 ft high, 6.6 ft extension Michael Lorenzen (RHP) - -1.5 ft side, 5.8 ft high, 5.9 ft extension Jose Quintana (LHP) - +2.2 ft side, 5.8 ft high, 6.5 ft extension Bailey Falter (LHP) - +1.2 ft side, 5.8 ft high, 7.3 ft extension Ryan Fernandez (RHP) - -2.2 ft side, 5.8 ft high, 6.4 ft extension Pedro Avila (RHP) - -1.2 ft side, 5.8 ft high, 6.3 ft extension Andrew Kittredge (RHP) - -1.8 ft side, 5.8 ft high, 6.7 ft extension Mitch Keller (RHP) - -2.0 ft side, 5.8 ft high, 6.5 ft extension Cole Sands (RHP) - -2.6 ft side, 5.8 ft high, 5.7 ft extension Bryan Abreu (RHP) - -2.2 ft side, 5.7 ft high, 6.5 ft extension Chase Anderson (RHP) - -1.4 ft side, 5.7 ft high, 5.8 ft extension Cade Smith (RHP) - -2.6 ft side, 5.7 ft high, 7.3 ft extension Dennis Santana (RHP) - -2.3 ft side, 5.7 ft high, 6.1 ft extension Ty Blach (LHP) - +3.1 ft side, 5.7 ft high, 5.2 ft extension Martín Pérez (LHP) - +1.1 ft side, 5.7 ft high, 5.9 ft extension Kyle Finnegan (RHP) - -1.9 ft side, 5.7 ft high, 6.6 ft extension Jake Irvin (RHP) - -2.2 ft side, 5.7 ft high, 7.0 ft extension Kyle Freeland (LHP) - +2.5 ft side, 5.7 ft high, 6.6 ft extension Nestor Cortes (LHP) - +1.2 ft side, 5.7 ft high, 5.8 ft extension Tim Herrin (LHP) - +2.2 ft side, 5.7 ft high, 6.6 ft extension Michael Kopech (RHP) - -2.3 ft side, 5.7 ft high, 6.9 ft extension Josh Hader (LHP) - +3.1 ft side, 5.7 ft high, 6.7 ft extension Trevor Rogers (LHP) - +2.5 ft side, 5.7 ft high, 6.7 ft extension Luke Weaver (RHP) - -1.7 ft side, 5.7 ft high, 6.0 ft extension Ryan Weathers (LHP) - +2.9 ft side, 5.7 ft high, 5.8 ft extension Jacob Barnes (RHP) - -1.2 ft side, 5.7 ft high, 6.8 ft extension Roddery Muñoz (RHP) - -1.6 ft side, 5.7 ft high, 6.1 ft extension Buck Farmer (RHP) - -1.2 ft side, 5.7 ft high, 6.1 ft extension Joe Ross (RHP) - -2.2 ft side, 5.7 ft high, 6.8 ft extension Kenta Maeda (RHP) - -2.1 ft side, 5.7 ft high, 6.1 ft extension Kevin Gausman (RHP) - -2.5 ft side, 5.7 ft high, 6.6 ft extension Taylor Rogers (LHP) - +1.9 ft side, 5.7 ft high, 5.7 ft extension José Ureña (RHP) - -3.0 ft side, 5.7 ft high, 6.3 ft extension Luis Gil (RHP) - -2.9 ft side, 5.7 ft high, 6.7 ft extension Paul Skenes (RHP) - -2.3 ft side, 5.7 ft high, 6.4 ft extension Carson Fulmer (RHP) - -2.5 ft side, 5.7 ft high, 6.4 ft extension Alec Marsh (RHP) - -1.9 ft side, 5.7 ft high, 6.2 ft extension Joe Jiménez (RHP) - -2.5 ft side, 5.7 ft high, 7.3 ft extension Orion Kerkering (RHP) - -1.5 ft side, 5.6 ft high, 6.3 ft extension Bryce Jarvis (RHP) - -2.3 ft side, 5.6 ft high, 6.0 ft extension Casey Mize (RHP) - -1.7 ft side, 5.6 ft high, 7.0 ft extension Slade Cecconi (RHP) - -1.9 ft side, 5.6 ft high, 6.6 ft extension Clarke Schmidt (RHP) - -1.5 ft side, 5.6 ft high, 6.2 ft extension Tyler Alexander (LHP) - +1.5 ft side, 5.6 ft high, 6.2 ft extension Jordan Hicks (RHP) - -1.8 ft side, 5.6 ft high, 6.6 ft extension José Berríos (RHP) - -2.0 ft side, 5.6 ft high, 6.4 ft extension Gavin Stone (RHP) - -1.9 ft side, 5.6 ft high, 6.6 ft extension Yu Darvish (RHP) - -2.0 ft side, 5.6 ft high, 6.6 ft extension Jon Gray (RHP) - -1.7 ft side, 5.6 ft high, 6.6 ft extension Tanner Houck (RHP) - -2.3 ft side, 5.6 ft high, 6.0 ft extension Grayson Rodriguez (RHP) - -2.4 ft side, 5.6 ft high, 7.3 ft extension Pablo López (RHP) - -1.7 ft side, 5.6 ft high, 7.1 ft extension Lance Lynn (RHP) - -3.1 ft side, 5.6 ft high, 6.4 ft extension Colin Rea (RHP) - -2.0 ft side, 5.6 ft high, 6.6 ft extension Emerson Hancock (RHP) - -1.8 ft side, 5.6 ft high, 6.4 ft extension Bryce Miller (RHP) - -1.4 ft side, 5.6 ft high, 6.3 ft extension Jared Shuster (LHP) - +1.4 ft side, 5.6 ft high, 6.5 ft extension A.J. Puk (LHP) - +3.1 ft side, 5.6 ft high, 7.1 ft extension Will Vest (RHP) - -2.4 ft side, 5.6 ft high, 6.2 ft extension Jared Jones (RHP) - -1.4 ft side, 5.5 ft high, 6.8 ft extension Walker Buehler (RHP) - -1.2 ft side, 5.5 ft high, 6.5 ft extension Ryan Feltner (RHP) - -1.3 ft side, 5.5 ft high, 6.4 ft extension Chris Bassitt (RHP) - -1.7 ft side, 5.5 ft high, 6.4 ft extension Nick Lodolo (LHP) - +3.6 ft side, 5.5 ft high, 6.2 ft extension Yoshinobu Yamamoto (RHP) - -1.2 ft side, 5.5 ft high, 6.6 ft extension Sonny Gray (RHP) - -0.8 ft side, 5.5 ft high, 6.6 ft extension Brandon Pfaadt (RHP) - -2.0 ft side, 5.5 ft high, 6.7 ft extension Nathan Eovaldi (RHP) - -2.4 ft side, 5.5 ft high, 6.6 ft extension Griffin Jax (RHP) - -0.7 ft side, 5.5 ft high, 6.4 ft extension Michael King (RHP) - -3.1 ft side, 5.5 ft high, 6.1 ft extension Nate Pearson (RHP) - -1.8 ft side, 5.5 ft high, 6.9 ft extension Seth Lugo (RHP) - -1.3 ft side, 5.5 ft high, 6.0 ft extension Merrill Kelly (RHP) - -1.8 ft side, 5.5 ft high, 6.1 ft extension Matt Waldron (RHP) - -1.3 ft side, 5.5 ft high, 6.6 ft extension Camilo Doval (RHP) - -1.6 ft side, 5.5 ft high, 6.3 ft extension Yennier Cano (RHP) - -2.2 ft side, 5.5 ft high, 6.1 ft extension Charlie Morton (RHP) - -2.6 ft side, 5.5 ft high, 6.2 ft extension Enyel De Los Santos (RHP) - -2.0 ft side, 5.5 ft high, 6.2 ft extension Seranthony Domínguez (RHP) - -1.8 ft side, 5.4 ft high, 6.6 ft extension Sean Manaea (LHP) - +2.9 ft side, 5.4 ft high, 7.1 ft extension Spencer Schwellenbach (RHP) - -2.6 ft side, 5.4 ft high, 6.8 ft extension Yusei Kikuchi (LHP) - +2.5 ft side, 5.4 ft high, 6.9 ft extension Shota Imanaga (LHP) - +2.6 ft side, 5.4 ft high, 6.3 ft extension Dane Dunning (RHP) - -2.3 ft side, 5.4 ft high, 7.0 ft extension Adam Ottavino (RHP) - -2.7 ft side, 5.4 ft high, 7.0 ft extension Jack Flaherty (RHP) - -2.5 ft side, 5.4 ft high, 6.6 ft extension Logan Allen (LHP) - +1.8 ft side, 5.4 ft high, 6.4 ft extension Phil Maton (RHP) - -1.2 ft side, 5.3 ft high, 7.1 ft extension Carson Spiers (RHP) - -1.6 ft side, 5.3 ft high, 6.6 ft extension José Buttó (RHP) - -2.5 ft side, 5.3 ft high, 6.2 ft extension Garrett Cleavinger (LHP) - +1.0 ft side, 5.3 ft high, 6.0 ft extension Freddy Peralta (RHP) - -2.8 ft side, 5.3 ft high, 6.7 ft extension Victor Vodnik (RHP) - -2.2 ft side, 5.3 ft high, 6.8 ft extension Scott Barlow (RHP) - -1.9 ft side, 5.3 ft high, 6.9 ft extension Declan Cronin (RHP) - -1.9 ft side, 5.3 ft high, 5.9 ft extension Kirby Yates (RHP) - -2.4 ft side, 5.3 ft high, 6.1 ft extension Brady Singer (RHP) - -1.4 ft side, 5.3 ft high, 7.0 ft extension Tanner Scott (LHP) - +2.5 ft side, 5.2 ft high, 6.4 ft extension Zack Wheeler (RHP) - -2.1 ft side, 5.2 ft high, 7.2 ft extension Ben Lively (RHP) - -1.4 ft side, 5.2 ft high, 6.9 ft extension Marcus Stroman (RHP) - -1.0 ft side, 5.2 ft high, 5.7 ft extension Michael Tonkin (RHP) - -3.8 ft side, 5.2 ft high, 6.2 ft extension Michael Tonkin Trent Thornton (RHP) - -2.3 ft side, 5.2 ft high, 6.2 ft extension Brayan Bello (RHP) - -1.8 ft side, 5.2 ft high, 6.3 ft extension Ryan Walker (RHP) - -3.4 ft side, 5.2 ft high, 6.1 ft extension Jesse Chavez (RHP) - -1.6 ft side, 5.1 ft high, 6.3 ft extension Chris Sale (LHP) - +3.1 ft side, 5.1 ft high, 6.4 ft extension Spencer Arrighetti (RHP) - -1.7 ft side, 5.1 ft high, 7.1 ft extension Bryan Woo (RHP) - -1.5 ft side, 5.0 ft high, 6.6 ft extension Andrew Heaney (LHP) - +3.0 ft side, 5.0 ft high, 6.4 ft extension Luis Castillo (RHP) - -2.3 ft side, 5.0 ft high, 5.4 ft extension Aaron Nola (RHP) - -1.8 ft side, 5.0 ft high, 6.9 ft extension Ryan Yarbrough (LHP) - +3.2 ft side, 5.0 ft high, 6.3 ft extension Trevor Williams (RHP) - -2.3 ft side, 5.0 ft high, 6.8 ft extension Logan Webb (RHP) - -1.5 ft side, 5.0 ft high, 7.0 ft extension Cooper Criswell (RHP) - -1.8 ft side, 5.0 ft high, 6.8 ft extension Luis Ortiz (RHP) - -1.8 ft side, 5.0 ft high, 6.8 ft extension Kyle Harrison (LHP) - +1.9 ft side, 4.8 ft high, 6.7 ft extension Greg Weissert (RHP) - -3.5 ft side, 4.8 ft high, 6.1 ft extension Tayler Scott (RHP) - -3.6 ft side, 4.8 ft high, 5.8 ft extension Joe Ryan (RHP) - -2.5 ft side, 4.8 ft high, 6.8 ft extension JP Sears (LHP) - +1.4 ft side, 4.6 ft high, 6.4 ft extension Nick Sandlin (RHP) - -3.0 ft side, 4.5 ft high, 6.6 ft extension Justin Lawrence (RHP) - -2.7 ft side, 4.4 ft high, 6.3 ft extension Hoby Milner (LHP) - +4.2 ft side, 4.3 ft high, 6.8 ft extension Hoby Milner Kevin Kelly (RHP) - -1.8 ft side, 3.7 ft high, 7.3 ft extension Tyler Rogers (RHP) - -3.8 ft side, 1.1 ft high, 6.1 ft extension Tyler Rogers
One dot per qualified pitcher, placed at his season-average release point. Catcher's view, raw and unmirrored: right-handers (amber) and left-handers (cool) settle onto opposite sides of the rubber the way a hitter actually sees them. Hover any dot for the pitcher, hand, side, height, and extension.
Right-handed Left-handed
The most extreme arm slots, in a table
Pitcher Hand Height, ft Side, ft Extension, ft
Justin Verlander RHP 7.10 -1.5 6.0
Ross Stripling RHP 6.86 -1.2 6.0
Chris Flexen RHP 6.84 -0.2 6.3
Nick Pivetta RHP 6.81 -1.5 6.8
José Alvarado LHP 6.65 +1.0 6.8
Blake Snell LHP 6.64 +2.0 6.8
JP Sears LHP 4.64 +1.4 6.4
Nick Sandlin RHP 4.49 -3.0 6.6
Justin Lawrence RHP 4.36 -2.7 6.3
Hoby Milner LHP 4.30 +4.2 6.8
Kevin Kelly RHP 3.72 -1.8 7.3
Tyler Rogers RHP 1.10 -3.8 6.1

Real Statcast: the per-pitcher means of release_pos_x, release_pos_z, and release_extension. The six highest and six lowest release heights, so the full vertical span of the slot - over-the-top to submarine - reads at a glance.

The Extra Foot

XVII · The Deception

A radar gun clocks the ball as it leaves the hand; the hitter clocks it as it arrives. Release the same 96 a foot closer to the plate and it lands like 98 - the batter simply has less time to react. That is "effective velocity", and it rewards a long stride on top of raw arm speed. Plot every four-seamer by how far its owner strides (extension) against the perceived-velo bonus it earns, and the cloud tilts up and to the right: the extra foot is free speed.

Perceived-velocity gain vs release extension, four-seam fastballs
5.0 5.5 6.0 6.5 7.0 7.5 8.0 -2.0 -1.0 0.0 +1.0 +2.0 +3.0 no bonus · perceived = actual RELEASE EXTENSION, FT → ↑ PERCEIVED-VELO GAIN, MPH Alexis Díaz (RHP) - 93.9 actual, 96.5 perceived, +2.6 mph on 7.7 ft extension Logan Gilbert (RHP) - 96.6 actual, 99.0 perceived, +2.4 mph on 7.6 ft extension Tyler Glasnow (RHP) - 96.3 actual, 98.6 perceived, +2.3 mph on 7.5 ft extension Joey Cantillo (LHP) - 92.2 actual, 94.4 perceived, +2.2 mph on 7.5 ft extension Porter Hodge (RHP) - 95.5 actual, 97.5 perceived, +2.0 mph on 7.3 ft extension Aroldis Chapman (LHP) - 97.8 actual, 99.7 perceived, +1.9 mph on 7.3 ft extension Bryan Hudson (LHP) - 91.3 actual, 93.2 perceived, +1.9 mph on 7.4 ft extension Brent Suter (LHP) - 85.8 actual, 87.6 perceived, +1.8 mph on 7.3 ft extension Cade Smith (RHP) - 96.0 actual, 97.8 perceived, +1.8 mph on 7.4 ft extension Luke Little (LHP) - 95.8 actual, 97.6 perceived, +1.8 mph on 7.2 ft extension Edwin Díaz (RHP) - 97.5 actual, 99.3 perceived, +1.8 mph on 7.4 ft extension Tylor Megill (RHP) - 95.7 actual, 97.5 perceived, +1.8 mph on 7.4 ft extension Bailey Falter (LHP) - 91.9 actual, 93.7 perceived, +1.8 mph on 7.3 ft extension Bailey Ober (RHP) - 91.7 actual, 93.5 perceived, +1.8 mph on 7.3 ft extension Tyson Miller (RHP) - 89.6 actual, 91.3 perceived, +1.7 mph on 7.3 ft extension Kyle Leahy (RHP) - 95.5 actual, 97.2 perceived, +1.7 mph on 7.2 ft extension Pablo López (RHP) - 95.0 actual, 96.6 perceived, +1.6 mph on 7.1 ft extension Zack Wheeler (RHP) - 95.3 actual, 96.9 perceived, +1.6 mph on 7.2 ft extension Joe Jiménez (RHP) - 94.5 actual, 96.1 perceived, +1.6 mph on 7.2 ft extension Gavin Williams (RHP) - 96.6 actual, 98.2 perceived, +1.6 mph on 7.2 ft extension Grayson Rodriguez (RHP) - 96.1 actual, 97.6 perceived, +1.5 mph on 7.3 ft extension Brady Singer (RHP) - 91.7 actual, 93.2 perceived, +1.5 mph on 7.0 ft extension Jake Irvin (RHP) - 93.9 actual, 95.4 perceived, +1.5 mph on 7.1 ft extension Hayden Wesneski (RHP) - 94.6 actual, 96.1 perceived, +1.5 mph on 7.0 ft extension David Peterson (LHP) - 93.1 actual, 94.6 perceived, +1.5 mph on 7.1 ft extension Colin Poche (LHP) - 91.2 actual, 92.6 perceived, +1.4 mph on 7.2 ft extension Garrett Crochet (LHP) - 97.1 actual, 98.4 perceived, +1.3 mph on 7.1 ft extension Casey Mize (RHP) - 95.5 actual, 96.8 perceived, +1.3 mph on 7.1 ft extension Spencer Arrighetti (RHP) - 94.1 actual, 95.4 perceived, +1.3 mph on 7.2 ft extension Victor Vodnik (RHP) - 98.0 actual, 99.2 perceived, +1.2 mph on 6.8 ft extension Nick Mears (RHP) - 96.7 actual, 97.9 perceived, +1.2 mph on 6.9 ft extension Cody Bradford (LHP) - 89.8 actual, 91.0 perceived, +1.2 mph on 7.1 ft extension Jordan Leasure (RHP) - 96.1 actual, 97.3 perceived, +1.2 mph on 7.0 ft extension Kyle Gibson (RHP) - 91.4 actual, 92.6 perceived, +1.2 mph on 7.0 ft extension Louis Varland (RHP) - 96.3 actual, 97.5 perceived, +1.2 mph on 7.0 ft extension Trevor Williams (RHP) - 88.9 actual, 90.1 perceived, +1.2 mph on 6.8 ft extension David Festa (RHP) - 94.7 actual, 95.9 perceived, +1.2 mph on 7.0 ft extension Shelby Miller (RHP) - 93.5 actual, 94.6 perceived, +1.1 mph on 7.0 ft extension Bobby Miller (RHP) - 97.6 actual, 98.7 perceived, +1.1 mph on 6.9 ft extension Aaron Nola (RHP) - 92.5 actual, 93.6 perceived, +1.1 mph on 7.0 ft extension MacKenzie Gore (LHP) - 96.0 actual, 97.1 perceived, +1.1 mph on 7.0 ft extension Sean Manaea (LHP) - 92.2 actual, 93.3 perceived, +1.1 mph on 7.1 ft extension Ben Lively (RHP) - 89.9 actual, 91.0 perceived, +1.1 mph on 6.9 ft extension Jalen Beeks (LHP) - 94.5 actual, 95.5 perceived, +1.0 mph on 6.7 ft extension A.J. Puk (LHP) - 95.6 actual, 96.6 perceived, +1.0 mph on 7.1 ft extension Kevin Ginkel (RHP) - 96.0 actual, 97.0 perceived, +1.0 mph on 6.9 ft extension Hunter Gaddis (RHP) - 95.4 actual, 96.4 perceived, +1.0 mph on 6.9 ft extension Jared Jones (RHP) - 97.3 actual, 98.3 perceived, +1.0 mph on 6.8 ft extension DL Hall (LHP) - 93.3 actual, 94.3 perceived, +1.0 mph on 6.9 ft extension Brandon Pfaadt (RHP) - 93.8 actual, 94.8 perceived, +1.0 mph on 6.7 ft extension Chris Paddack (RHP) - 93.3 actual, 94.3 perceived, +1.0 mph on 7.0 ft extension Jacob Barnes (RHP) - 95.4 actual, 96.4 perceived, +1.0 mph on 6.8 ft extension Kyle Nicolas (RHP) - 97.4 actual, 98.4 perceived, +1.0 mph on 6.9 ft extension Spencer Schwellenbach (RHP) - 96.1 actual, 97.1 perceived, +1.0 mph on 6.7 ft extension Nate Pearson (RHP) - 97.7 actual, 98.6 perceived, +0.9 mph on 6.9 ft extension Yusei Kikuchi (LHP) - 95.5 actual, 96.4 perceived, +0.9 mph on 7.0 ft extension Triston McKenzie (RHP) - 91.1 actual, 92.0 perceived, +0.9 mph on 6.8 ft extension Ryne Nelson (RHP) - 95.2 actual, 96.1 perceived, +0.9 mph on 6.8 ft extension Michael Wacha (RHP) - 93.6 actual, 94.5 perceived, +0.9 mph on 6.8 ft extension Sonny Gray (RHP) - 92.4 actual, 93.3 perceived, +0.9 mph on 6.6 ft extension Mitchell Parker (LHP) - 92.5 actual, 93.4 perceived, +0.9 mph on 6.8 ft extension Christian Scott (RHP) - 94.2 actual, 95.1 perceived, +0.9 mph on 7.0 ft extension Kyle Freeland (LHP) - 91.6 actual, 92.4 perceived, +0.8 mph on 6.7 ft extension Michael Kopech (RHP) - 98.7 actual, 99.5 perceived, +0.8 mph on 6.9 ft extension Andre Pallante (RHP) - 94.5 actual, 95.3 perceived, +0.8 mph on 6.6 ft extension Luis Ortiz (RHP) - 95.9 actual, 96.7 perceived, +0.8 mph on 6.8 ft extension Nick Pivetta (RHP) - 93.9 actual, 94.7 perceived, +0.8 mph on 6.8 ft extension Austin Gomber (LHP) - 90.4 actual, 91.2 perceived, +0.8 mph on 6.7 ft extension Joe Ryan (RHP) - 94.0 actual, 94.8 perceived, +0.8 mph on 6.8 ft extension Ben Brown (RHP) - 96.4 actual, 97.2 perceived, +0.8 mph on 6.8 ft extension Max Fried (LHP) - 93.9 actual, 94.7 perceived, +0.8 mph on 6.6 ft extension Jack Flaherty (RHP) - 93.3 actual, 94.1 perceived, +0.8 mph on 6.6 ft extension Ronel Blanco (RHP) - 93.4 actual, 94.2 perceived, +0.8 mph on 6.9 ft extension Bowden Francis (RHP) - 92.9 actual, 93.7 perceived, +0.8 mph on 6.8 ft extension Blake Snell (LHP) - 95.9 actual, 96.7 perceived, +0.8 mph on 6.8 ft extension Justin Anderson (RHP) - 96.0 actual, 96.8 perceived, +0.8 mph on 6.8 ft extension Jordan Montgomery (LHP) - 92.1 actual, 92.9 perceived, +0.8 mph on 6.7 ft extension Jameson Taillon (RHP) - 92.3 actual, 93.1 perceived, +0.8 mph on 6.7 ft extension Carlos Hernández (RHP) - 97.9 actual, 98.7 perceived, +0.8 mph on 6.8 ft extension Jeremiah Estrada (RHP) - 97.2 actual, 97.9 perceived, +0.7 mph on 6.8 ft extension Burch Smith (RHP) - 94.9 actual, 95.6 perceived, +0.7 mph on 6.8 ft extension Andrés Muñoz (RHP) - 98.4 actual, 99.1 perceived, +0.7 mph on 6.7 ft extension Tanner Bibee (RHP) - 94.6 actual, 95.3 perceived, +0.7 mph on 6.6 ft extension Fernando Cruz (RHP) - 94.7 actual, 95.4 perceived, +0.7 mph on 6.8 ft extension Kyle Finnegan (RHP) - 97.2 actual, 97.9 perceived, +0.7 mph on 6.6 ft extension Ryan Feltner (RHP) - 94.6 actual, 95.3 perceived, +0.7 mph on 6.4 ft extension Colin Rea (RHP) - 93.0 actual, 93.7 perceived, +0.7 mph on 6.6 ft extension Carlos Carrasco (RHP) - 91.7 actual, 92.4 perceived, +0.7 mph on 6.6 ft extension Craig Kimbrel (RHP) - 93.9 actual, 94.6 perceived, +0.7 mph on 6.8 ft extension Carson Spiers (RHP) - 92.4 actual, 93.1 perceived, +0.7 mph on 6.6 ft extension Simeon Woods Richardson (RHP) - 93.1 actual, 93.8 perceived, +0.7 mph on 6.7 ft extension Tobias Myers (RHP) - 92.9 actual, 93.6 perceived, +0.7 mph on 6.7 ft extension Randy Rodríguez (RHP) - 97.6 actual, 98.3 perceived, +0.7 mph on 6.7 ft extension DJ Herz (LHP) - 93.5 actual, 94.2 perceived, +0.7 mph on 6.7 ft extension Andrew Nardi (LHP) - 94.0 actual, 94.6 perceived, +0.6 mph on 6.8 ft extension Mike Baumann (RHP) - 96.5 actual, 97.1 perceived, +0.6 mph on 6.7 ft extension Freddy Peralta (RHP) - 94.3 actual, 94.9 perceived, +0.6 mph on 6.7 ft extension Cal Quantrill (RHP) - 94.1 actual, 94.7 perceived, +0.6 mph on 6.5 ft extension Kyle Harrison (LHP) - 92.6 actual, 93.2 perceived, +0.6 mph on 6.7 ft extension Trevor Megill (RHP) - 98.8 actual, 99.4 perceived, +0.6 mph on 6.7 ft extension Mason Miller (RHP) - 100.9 actual, 101.5 perceived, +0.6 mph on 6.8 ft extension David Bednar (RHP) - 97.2 actual, 97.8 perceived, +0.6 mph on 6.7 ft extension James Paxton (LHP) - 93.2 actual, 93.8 perceived, +0.6 mph on 6.5 ft extension Ryan Pepiot (RHP) - 94.9 actual, 95.5 perceived, +0.6 mph on 6.8 ft extension Matt Waldron (RHP) - 90.7 actual, 91.3 perceived, +0.6 mph on 6.7 ft extension Andrew Abbott (LHP) - 92.8 actual, 93.4 perceived, +0.6 mph on 6.6 ft extension Luis Gil (RHP) - 96.6 actual, 97.2 perceived, +0.6 mph on 6.7 ft extension Yariel Rodríguez (RHP) - 93.9 actual, 94.5 perceived, +0.6 mph on 6.6 ft extension Albert Suárez (RHP) - 94.8 actual, 95.4 perceived, +0.6 mph on 6.7 ft extension Erik Swanson (RHP) - 93.9 actual, 94.5 perceived, +0.6 mph on 6.8 ft extension Jack Leiter (RHP) - 96.4 actual, 97.0 perceived, +0.6 mph on 6.9 ft extension Yoshinobu Yamamoto (RHP) - 95.5 actual, 96.0 perceived, +0.5 mph on 6.6 ft extension Zac Gallen (RHP) - 93.7 actual, 94.2 perceived, +0.5 mph on 6.6 ft extension Mitch Keller (RHP) - 94.5 actual, 95.0 perceived, +0.5 mph on 6.5 ft extension Kyle Muller (LHP) - 92.6 actual, 93.1 perceived, +0.5 mph on 6.6 ft extension Shawn Armstrong (RHP) - 93.3 actual, 93.8 perceived, +0.5 mph on 6.6 ft extension Emilio Pagán (RHP) - 94.6 actual, 95.1 perceived, +0.5 mph on 6.7 ft extension Nick Sandlin (RHP) - 92.6 actual, 93.1 perceived, +0.5 mph on 6.6 ft extension Robert Garcia (LHP) - 94.5 actual, 95.0 perceived, +0.5 mph on 6.6 ft extension Seranthony Domínguez (RHP) - 97.7 actual, 98.2 perceived, +0.5 mph on 6.6 ft extension Ryan Helsley (RHP) - 99.6 actual, 100.1 perceived, +0.5 mph on 6.6 ft extension Peter Lambert (RHP) - 94.5 actual, 95.0 perceived, +0.5 mph on 6.4 ft extension Jordan Weems (RHP) - 96.0 actual, 96.5 perceived, +0.5 mph on 6.6 ft extension Gavin Stone (RHP) - 94.9 actual, 95.4 perceived, +0.5 mph on 6.6 ft extension Joe Boyle (RHP) - 97.7 actual, 98.2 perceived, +0.5 mph on 6.6 ft extension Edward Cabrera (RHP) - 96.2 actual, 96.7 perceived, +0.5 mph on 6.7 ft extension Walker Buehler (RHP) - 95.0 actual, 95.5 perceived, +0.5 mph on 6.5 ft extension Bryan Woo (RHP) - 94.8 actual, 95.3 perceived, +0.5 mph on 6.6 ft extension Robert Suarez (RHP) - 99.1 actual, 99.5 perceived, +0.4 mph on 6.7 ft extension Justin Steele (LHP) - 91.6 actual, 92.0 perceived, +0.4 mph on 6.4 ft extension Chris Stratton (RHP) - 91.8 actual, 92.2 perceived, +0.4 mph on 6.5 ft extension Erik Miller (LHP) - 96.9 actual, 97.3 perceived, +0.4 mph on 6.6 ft extension George Kirby (RHP) - 96.0 actual, 96.4 perceived, +0.4 mph on 6.5 ft extension Jason Adam (RHP) - 95.5 actual, 95.9 perceived, +0.4 mph on 6.7 ft extension Hunter Brown (RHP) - 96.0 actual, 96.4 perceived, +0.4 mph on 6.6 ft extension Bryan Abreu (RHP) - 96.7 actual, 97.1 perceived, +0.4 mph on 6.6 ft extension John Brebbia (RHP) - 93.8 actual, 94.2 perceived, +0.4 mph on 6.6 ft extension Jon Gray (RHP) - 94.9 actual, 95.3 perceived, +0.4 mph on 6.6 ft extension Javier Assad (RHP) - 91.5 actual, 91.9 perceived, +0.4 mph on 6.5 ft extension Reynaldo López (RHP) - 95.5 actual, 95.9 perceived, +0.4 mph on 6.5 ft extension Slade Cecconi (RHP) - 94.4 actual, 94.8 perceived, +0.4 mph on 6.6 ft extension Hogan Harris (LHP) - 92.9 actual, 93.3 perceived, +0.4 mph on 6.7 ft extension Carmen Mlodzinski (RHP) - 96.2 actual, 96.6 perceived, +0.4 mph on 6.5 ft extension Evan Phillips (RHP) - 96.2 actual, 96.5 perceived, +0.3 mph on 6.5 ft extension Nathan Eovaldi (RHP) - 95.4 actual, 95.7 perceived, +0.3 mph on 6.6 ft extension Griffin Jax (RHP) - 97.1 actual, 97.4 perceived, +0.3 mph on 6.4 ft extension Pedro Avila (RHP) - 93.4 actual, 93.7 perceived, +0.3 mph on 6.3 ft extension Caleb Ferguson (LHP) - 93.8 actual, 94.1 perceived, +0.3 mph on 6.5 ft extension Lance Lynn (RHP) - 92.3 actual, 92.6 perceived, +0.3 mph on 6.4 ft extension Trevor Rogers (LHP) - 91.9 actual, 92.2 perceived, +0.3 mph on 6.7 ft extension Chris Sale (LHP) - 94.8 actual, 95.1 perceived, +0.3 mph on 6.6 ft extension Kevin Gausman (RHP) - 94.0 actual, 94.3 perceived, +0.3 mph on 6.6 ft extension Jacob Latz (LHP) - 94.9 actual, 95.2 perceived, +0.3 mph on 6.6 ft extension Max Meyer (RHP) - 94.1 actual, 94.4 perceived, +0.3 mph on 6.4 ft extension Roansy Contreras (RHP) - 94.7 actual, 95.0 perceived, +0.3 mph on 6.5 ft extension Jared Shuster (LHP) - 92.5 actual, 92.8 perceived, +0.3 mph on 6.4 ft extension Nick Nastrini (RHP) - 93.7 actual, 94.0 perceived, +0.3 mph on 6.5 ft extension Hayden Birdsong (RHP) - 95.8 actual, 96.1 perceived, +0.3 mph on 6.5 ft extension José Quijada (LHP) - 93.9 actual, 94.2 perceived, +0.3 mph on 6.5 ft extension Eduardo Rodriguez (LHP) - 92.0 actual, 92.3 perceived, +0.3 mph on 6.3 ft extension Zebby Matthews (RHP) - 94.9 actual, 95.2 perceived, +0.3 mph on 6.5 ft extension Daniel Hudson (RHP) - 95.1 actual, 95.3 perceived, +0.2 mph on 6.4 ft extension Ryan Pressly (RHP) - 93.8 actual, 94.0 perceived, +0.2 mph on 6.3 ft extension Jose Quintana (LHP) - 90.7 actual, 90.9 perceived, +0.2 mph on 6.5 ft extension Jeff Hoffman (RHP) - 96.7 actual, 96.9 perceived, +0.2 mph on 6.6 ft extension Hunter Greene (RHP) - 97.6 actual, 97.8 perceived, +0.2 mph on 6.5 ft extension Hunter Harvey (RHP) - 97.8 actual, 98.0 perceived, +0.2 mph on 6.4 ft extension Emerson Hancock (RHP) - 93.4 actual, 93.6 perceived, +0.2 mph on 6.4 ft extension Ryan Fernandez (RHP) - 95.5 actual, 95.7 perceived, +0.2 mph on 6.5 ft extension Paul Sewald (RHP) - 91.4 actual, 91.6 perceived, +0.2 mph on 6.5 ft extension Paul Skenes (RHP) - 98.8 actual, 99.0 perceived, +0.2 mph on 6.4 ft extension Keider Montero (RHP) - 94.7 actual, 94.9 perceived, +0.2 mph on 6.4 ft extension Shane Baz (RHP) - 95.6 actual, 95.8 perceived, +0.2 mph on 6.6 ft extension Alex Vesia (LHP) - 93.4 actual, 93.5 perceived, +0.1 mph on 6.4 ft extension José Berríos (RHP) - 94.1 actual, 94.2 perceived, +0.1 mph on 6.4 ft extension Tarik Skubal (LHP) - 96.9 actual, 97.0 perceived, +0.1 mph on 6.4 ft extension Miles Mikolas (RHP) - 93.2 actual, 93.3 perceived, +0.1 mph on 6.3 ft extension Anthony Molina (RHP) - 94.8 actual, 94.9 perceived, +0.1 mph on 6.2 ft extension Matthew Liberatore (LHP) - 94.7 actual, 94.8 perceived, +0.1 mph on 6.3 ft extension Logan Allen (LHP) - 91.2 actual, 91.3 perceived, +0.1 mph on 6.4 ft extension JP Sears (LHP) - 91.9 actual, 92.0 perceived, +0.1 mph on 6.4 ft extension Pete Fairbanks (RHP) - 97.3 actual, 97.4 perceived, +0.1 mph on 6.5 ft extension Jordan Wicks (LHP) - 92.5 actual, 92.6 perceived, +0.1 mph on 6.3 ft extension Ranger Suarez (LHP) - 91.9 actual, 92.0 perceived, +0.1 mph on 6.3 ft extension Chad Green (RHP) - 95.5 actual, 95.6 perceived, +0.1 mph on 6.5 ft extension Spencer Turnbull (RHP) - 92.0 actual, 92.1 perceived, +0.1 mph on 6.2 ft extension Joey Wentz (LHP) - 93.7 actual, 93.8 perceived, +0.1 mph on 6.5 ft extension Shawn Dubin (RHP) - 95.0 actual, 95.1 perceived, +0.1 mph on 6.5 ft extension Orion Kerkering (RHP) - 97.6 actual, 97.7 perceived, +0.1 mph on 6.4 ft extension Caleb Thielbar (LHP) - 93.2 actual, 93.3 perceived, +0.1 mph on 6.3 ft extension Tanner Gordon (RHP) - 92.1 actual, 92.2 perceived, +0.1 mph on 6.3 ft extension Tanner Scott (LHP) - 97.0 actual, 97.0 perceived, 0.0 mph on 6.4 ft extension Trevor Richards (RHP) - 92.3 actual, 92.3 perceived, 0.0 mph on 6.4 ft extension Luis Severino (RHP) - 96.2 actual, 96.2 perceived, 0.0 mph on 6.3 ft extension Carlos Estévez (RHP) - 96.8 actual, 96.8 perceived, 0.0 mph on 6.4 ft extension Chris Flexen (RHP) - 91.3 actual, 91.3 perceived, 0.0 mph on 6.3 ft extension Cole Irvin (LHP) - 91.8 actual, 91.8 perceived, 0.0 mph on 6.4 ft extension Carson Fulmer (RHP) - 93.1 actual, 93.1 perceived, 0.0 mph on 6.3 ft extension Jhoan Duran (RHP) - 100.5 actual, 100.5 perceived, 0.0 mph on 6.4 ft extension Taj Bradley (RHP) - 96.4 actual, 96.4 perceived, 0.0 mph on 6.5 ft extension Luis Medina (RHP) - 95.9 actual, 95.9 perceived, 0.0 mph on 6.3 ft extension Cade Povich (LHP) - 92.4 actual, 92.4 perceived, 0.0 mph on 6.4 ft extension Tanner Rainey (RHP) - 94.0 actual, 93.9 perceived, -0.1 mph on 6.3 ft extension Zack Littell (RHP) - 92.4 actual, 92.3 perceived, -0.1 mph on 6.3 ft extension Seth Lugo (RHP) - 92.2 actual, 92.1 perceived, -0.1 mph on 6.1 ft extension Dylan Cease (RHP) - 96.9 actual, 96.8 perceived, -0.1 mph on 6.3 ft extension Bryce Miller (RHP) - 95.2 actual, 95.1 perceived, -0.1 mph on 6.3 ft extension Andrew Heaney (LHP) - 91.6 actual, 91.5 perceived, -0.1 mph on 6.5 ft extension Alec Marsh (RHP) - 94.2 actual, 94.1 perceived, -0.1 mph on 6.2 ft extension José Buttó (RHP) - 94.2 actual, 94.1 perceived, -0.1 mph on 6.2 ft extension Xzavion Curry (RHP) - 92.1 actual, 92.0 perceived, -0.1 mph on 6.2 ft extension Randy Vásquez (RHP) - 94.3 actual, 94.2 perceived, -0.1 mph on 6.2 ft extension Osvaldo Bido (RHP) - 94.8 actual, 94.7 perceived, -0.1 mph on 6.3 ft extension Will Vest (RHP) - 96.1 actual, 95.9 perceived, -0.2 mph on 6.2 ft extension Shota Imanaga (LHP) - 91.7 actual, 91.5 perceived, -0.2 mph on 6.3 ft extension Charlie Morton (RHP) - 94.1 actual, 93.9 perceived, -0.2 mph on 6.2 ft extension Gerrit Cole (RHP) - 95.9 actual, 95.7 perceived, -0.2 mph on 6.3 ft extension Brent Honeywell (RHP) - 94.8 actual, 94.6 perceived, -0.2 mph on 6.1 ft extension Joe Musgrove (RHP) - 93.0 actual, 92.7 perceived, -0.3 mph on 6.0 ft extension Frankie Montas (RHP) - 95.6 actual, 95.3 perceived, -0.3 mph on 6.0 ft extension Kenta Maeda (RHP) - 90.8 actual, 90.5 perceived, -0.3 mph on 6.1 ft extension Jacob Webb (RHP) - 93.5 actual, 93.2 perceived, -0.3 mph on 6.3 ft extension Tyler Alexander (LHP) - 89.6 actual, 89.3 perceived, -0.3 mph on 6.2 ft extension Dean Kremer (RHP) - 93.4 actual, 93.1 perceived, -0.3 mph on 6.2 ft extension Beau Brieske (RHP) - 95.9 actual, 95.6 perceived, -0.3 mph on 6.1 ft extension Robbie Ray (LHP) - 94.1 actual, 93.8 perceived, -0.3 mph on 6.2 ft extension Enyel De Los Santos (RHP) - 95.5 actual, 95.1 perceived, -0.4 mph on 6.2 ft extension Michael King (RHP) - 93.7 actual, 93.3 perceived, -0.4 mph on 6.1 ft extension Cole Ragans (LHP) - 95.4 actual, 95.0 perceived, -0.4 mph on 6.1 ft extension Héctor Neris (RHP) - 92.9 actual, 92.5 perceived, -0.4 mph on 6.1 ft extension Griffin Canning (RHP) - 93.4 actual, 93.0 perceived, -0.4 mph on 6.1 ft extension Justin Wilson (LHP) - 95.5 actual, 95.1 perceived, -0.4 mph on 6.1 ft extension Reid Detmers (LHP) - 93.8 actual, 93.4 perceived, -0.4 mph on 6.1 ft extension Tyler Anderson (LHP) - 89.4 actual, 89.0 perceived, -0.4 mph on 6.1 ft extension Valente Bellozo (RHP) - 89.2 actual, 88.8 perceived, -0.4 mph on 6.0 ft extension Tony Santillan (RHP) - 97.2 actual, 96.8 perceived, -0.4 mph on 6.1 ft extension Rafael Montero (RHP) - 95.4 actual, 94.9 perceived, -0.5 mph on 6.2 ft extension Carlos Rodón (LHP) - 95.4 actual, 94.9 perceived, -0.5 mph on 6.1 ft extension Michael Tonkin (RHP) - 93.2 actual, 92.7 perceived, -0.5 mph on 6.2 ft extension Matt Strahm (LHP) - 93.4 actual, 92.9 perceived, -0.5 mph on 6.2 ft extension Alex Faedo (RHP) - 94.0 actual, 93.5 perceived, -0.5 mph on 6.1 ft extension Matt Moore (LHP) - 92.7 actual, 92.2 perceived, -0.5 mph on 6.1 ft extension Grant Holmes (RHP) - 94.6 actual, 94.1 perceived, -0.5 mph on 6.0 ft extension Ross Stripling (RHP) - 91.7 actual, 91.1 perceived, -0.6 mph on 6.1 ft extension Kutter Crawford (RHP) - 92.6 actual, 92.0 perceived, -0.6 mph on 6.1 ft extension Michael Soroka (RHP) - 93.5 actual, 92.9 perceived, -0.6 mph on 6.0 ft extension Bryce Jarvis (RHP) - 95.7 actual, 95.1 perceived, -0.6 mph on 6.0 ft extension Tanner Banks (LHP) - 93.6 actual, 93.0 perceived, -0.6 mph on 6.0 ft extension Nick Lodolo (LHP) - 94.2 actual, 93.6 perceived, -0.6 mph on 6.2 ft extension Roddery Muñoz (RHP) - 95.4 actual, 94.8 perceived, -0.6 mph on 6.1 ft extension Tyler Ferguson (RHP) - 95.9 actual, 95.3 perceived, -0.6 mph on 6.0 ft extension Joey Estes (RHP) - 92.4 actual, 91.8 perceived, -0.6 mph on 6.0 ft extension Ryne Stanek (RHP) - 97.8 actual, 97.1 perceived, -0.7 mph on 6.0 ft extension Landon Knack (RHP) - 93.5 actual, 92.8 perceived, -0.7 mph on 5.9 ft extension Yuki Matsui (LHP) - 92.2 actual, 91.4 perceived, -0.8 mph on 5.9 ft extension Nestor Cortes (LHP) - 92.1 actual, 91.3 perceived, -0.8 mph on 5.9 ft extension José Suarez (LHP) - 93.0 actual, 92.2 perceived, -0.8 mph on 6.0 ft extension Kirby Yates (RHP) - 93.2 actual, 92.4 perceived, -0.8 mph on 6.0 ft extension Tyler Kinley (RHP) - 95.8 actual, 95.0 perceived, -0.8 mph on 5.5 ft extension Nick Martinez (RHP) - 92.6 actual, 91.8 perceived, -0.8 mph on 5.8 ft extension Reese Olson (RHP) - 94.2 actual, 93.4 perceived, -0.8 mph on 5.9 ft extension Hunter Strickland (RHP) - 94.2 actual, 93.4 perceived, -0.8 mph on 6.0 ft extension Luke Weaver (RHP) - 95.7 actual, 94.8 perceived, -0.9 mph on 6.0 ft extension Michael Lorenzen (RHP) - 93.8 actual, 92.9 perceived, -0.9 mph on 5.8 ft extension Keegan Akin (LHP) - 93.9 actual, 92.9 perceived, -1.0 mph on 5.8 ft extension Jorge Alcala (RHP) - 98.1 actual, 97.1 perceived, -1.0 mph on 5.9 ft extension Justin Verlander (RHP) - 93.5 actual, 92.5 perceived, -1.0 mph on 5.9 ft extension Ryan Weathers (LHP) - 95.9 actual, 94.8 perceived, -1.1 mph on 5.8 ft extension Cole Sands (RHP) - 95.7 actual, 94.6 perceived, -1.1 mph on 5.7 ft extension Calvin Faucher (RHP) - 96.0 actual, 94.9 perceived, -1.1 mph on 5.7 ft extension José Leclerc (RHP) - 95.3 actual, 94.0 perceived, -1.3 mph on 5.6 ft extension Tayler Scott (RHP) - 92.7 actual, 91.4 perceived, -1.3 mph on 5.8 ft extension Jesús Luzardo (LHP) - 95.2 actual, 93.7 perceived, -1.5 mph on 5.7 ft extension Luis Castillo (RHP) - 95.6 actual, 93.9 perceived, -1.7 mph on 5.3 ft extension Justin Wrobleski (LHP) - 95.1 actual, 93.4 perceived, -1.7 mph on 5.3 ft extension Alexis Díaz +2.6 Logan Gilbert +2.4 Tyler Glasnow +2.3 Joey Cantillo +2.2 Porter Hodge +2.0
Each dot is one pitcher's four-seam: its actual release speed against the "effective" speed the hitter has to defend, given how far in front of the rubber the ball is let go. Points above the zero line play faster than the gun says; below it, slower.
One pitcher's four-seam · higher = the ball plays faster than the radar reads
The fifteen biggest perceived-velo gainers, in a table
Pitcher Hand Actual, mph Perceived, mph Gain, +mph Extension, ft
Alexis Díaz RHP 93.9 96.5 +2.6 7.7
Logan Gilbert RHP 96.6 99.0 +2.4 7.6
Tyler Glasnow RHP 96.3 98.6 +2.3 7.5
Joey Cantillo LHP 92.2 94.4 +2.2 7.5
Porter Hodge RHP 95.5 97.5 +2.0 7.3
Aroldis Chapman LHP 97.8 99.7 +1.9 7.3
Bryan Hudson LHP 91.3 93.2 +1.9 7.4
Brent Suter LHP 85.8 87.6 +1.8 7.3
Cade Smith RHP 96.0 97.8 +1.8 7.4
Luke Little LHP 95.8 97.6 +1.8 7.2
Edwin Díaz RHP 97.5 99.3 +1.8 7.4
Tylor Megill RHP 95.7 97.5 +1.8 7.4
Bailey Falter LHP 91.9 93.7 +1.8 7.3
Bailey Ober RHP 91.7 93.5 +1.8 7.3
Tyson Miller RHP 89.6 91.3 +1.7 7.3

Real Statcast: per-pitcher means of release_speed and effective_speed on four-seam fastballs, with extension from release_extension. Gain is perceived minus actual (see Methodology).

Methodology

Notes on the Data

The figures on this page derive from MLB Statcast · Baseball Savant (2024 regular season), the optical-and-radar tracking installed in all thirty major-league parks since 2015. One tracked pitch is one row of the Statcast Search export; a full season runs on the order of 711,714 pitches, each carrying release speed, spin rate, movement, release point and the plate location where it finished.

What's real, what's a stand-in

This build is badged Curated, and the split is precise. The physical readings are real, aggregated straight from the pitch feed with no modeling: the park strikeouts and four-seam velocity/spin, the leaderboard's velocity and whiff rates, the scatter's xwOBA, the velocity histogram, the movement map, the whiff slopes and the whole-repertoire mix. The ingest is 2,868,564 tracked pitches across the 4 regular seasons 2015, 2019, 2023, 2024, pulled a day at a time from Baseball Savant's Statcast Search CSV export. The player names, ballparks and pitch taxonomy are real, and so are the numbers attached to them.

Two indices are modeled, and they part ways here. Run value per 100 is real: it is joined from Baseball Savant's pitch-arsenal-stats leaderboard (the run_value column, summed over each pitcher's arsenal) on the MLBAM id. Stuff+, though, is a Curated stand-in. Savant's proprietary pitch-quality model is not exposed in any public export - the leaderboard's stuff columns come back empty - so the Stuff+ shown here is a transparent proxy computed from the real velocity and whiff inputs, centered on the league-average 100. It tracks nastiness, but it is not the Savant model and must not be quoted as it. The swap-point and the exact fetch loop live in the repo's HANDOFF.md; components read only derived.json.

On the map

Ballpark coordinates are curator-authored stadium centroids, placed with a US Albers projection (which insets Alaska and Hawaii - both empty here, as no club plays there; Toronto sits just above the border). A bubble is sized by area, radius as the square root of the home staff's strikeouts, so a bubble twice as wide is four times the value. The staff behind a park is the home club, which pitches in the top of each inning.

On movement and whiffs

The movement map plots induced break - the pitch feed's pfx_x / pfx_z columns, gravity subtracted, in inches - with horizontal break mirrored for left-handers so "arm side" always reads to the right. A whiff is a swing that touches nothing: swinging strikes divided by all swings, from the feed's per-pitch description. The velocity histogram bins four-seamers only, 1 mph per bin, each season's bins summing to 100.

On contact, command and the count

The second half of the page reads the batted ball and the delivery, and all of it is real, aggregated from the 2024 feed with no modeling. A batted ball is a pitch put in play (hit_into_play) carrying a tracked exit velocity and launch angle; the barrel map bins those two and colors each cell by the feed's estimated_woba_using_speedangle (cells under 15 balls left blank). The batted-ball classes use the standard launch-angle cut points - ground under 10 degrees, line 10 to 25, fly 25 to 50, popup above 50. The luck plane pairs that expected wOBA against the actual woba_value the same contact produced; the gap is one season of variance and rarely repeats. Contact, arm-slot and deception boards qualify a pitcher at 200 balls in play or 1,000 pitches; exit velocity, release point (release_pos_x/z, catcher's view, not mirrored) and perceived velocity (effective_speed minus release speed on four-seamers) are per-pitcher means. The location heatmap is whiffs per swing by plate_x / plate_z, its color scale clamped at 40 percent so a few low-swing chase cells do not blow out the ramp; the count grid is whiff-per-swing and pitch share across the twelve ball-strike counts.

What you're not seeing

Statcast begins in 2015, so nothing earlier exists here; the PitchFX era is normalized differently and is not shown. The over-time charts sample the anchor seasons 2015, 2019, 2023, 2024 rather than every year in between, so the arms-race and mix lines connect real season points but do not draw the seasons they skip. Pitch-type labels are the system's own classification and shift under your feet - most visibly in 2023, when the sweeper was split out from the slider, which is why it only appears in the later seasons. The leaderboard, scatter and compare read the 2024 season and require at least 1,000 tracked pitches to qualify; park and staff totals are regular-season only, and a single elite reliever can swing a bullpen's whole line. Stuff and results are read at the pitcher level; a pitch that looks nasty in a vacuum can still be the wrong pitch in the wrong count. The cameras see everything about the ball and nothing about the plan.


Generated 2026-07-10 15:39 UTC

Source: MLB Statcast · Baseball Savant