The Count and the Pitch Decision


In last week’s post, I explored transitions in the count and saw how the probabilities of these transitions have changed over the last 20 seasons in MLB. Specifically, we saw two clear trends. It is increasingly likely to get a strike on a 0 or 1 strike count, and it is increasingly less likely to put a ball in play with 0 or 1 strike.

Here we are going to look at how the count affects the pitch decision. Last week, I happened to see a tweet by Tom Tango who mentioned a quote by the HOF pitcher Greg Maddux on the choice of pitch on an 0-2 count. Maddux questioned the conventional wisdom of throwing a breaking ball out of the zone in this situation — he called it one of the most ridiculous things he has seen in the game. He argued that the batter rarely swings at this pitch, and so this really is a wasted pitch. Maddux said that his goal in pitching on a 0-2 count was to take the batter out immediately by going right at the batter.

The pitcher has to make two decisions on any pitch — he has to decide what pitch to throw (we’ll focus on two choices — a fastball or an off-speed pitch) and he has to decide on the pitch’s location. We’ll explore patterns of both choices for a group of 20 starters from the 2019 season. We’ll see that both decisions are significantly affected by the current count. We’ll see if modern starting pitchers agree with Greg Maddux on the choice of pitch on an 0-2 count.

Choice of Pitch

Although there are many pitch types, essentially there are two types of pitches — a fastball and an off-speed pitch. I’m focusing on a group of 20 starters from the 2019 season. Looking at the entire group, I’ve graphed the percentage of fastballs for each of the 12 possible counts. Generally, we see that for neutral counts, one sees about 50-60% fastballs. In contrast, for counts where the pitcher is ahead, the fastball percentage is under 50%, and for counts where the pitcher is behind, one is more likely to see a fastball with a percentage of 90% for a 3-0 count.

Of course, there is much variability in the fastball use among our group of pitchers. Below, I’ve plotted the percentage of fastballs for each of the three count types for all pitchers in my group. Although we see some interesting patterns, we see that pitchers are most likely to choose fastballs in behind counts, followed by neutral counts and ahead counts. In other words, pitchers are generally more likely to throw off-speed pitches when they are ahead in the count.

Pitch Location

Perhaps the bigger decision for the pitcher is the choice of location. When one starts to look at location graphs, one realizes there are two relevant inputs — the side of the batter and the pitch type. I created a Shiny app where one chooses the pitcher and the count and the app produces a density estimate of the pitch location for both batter sides (R or L) and both pitch types (Fastball or Off-Speed). Here is one graph for Justin Verlander on a 0-0 count. It appears that Verlander throws his fastball inside (to the left side for right-handed batters and to the right side for left-handed batters) and he tends to throw his off-speed pitch low in the zone.

Let’s contrast these pictures with Verlander’s pitch locations on a 0-2 count. Verlander clearly adjusts his pitch selection to the count. He throws his fastball high in the zone, although many of these pitches appear to be strikes. His off-speed pitches are generally low and out of the zone in the same location for both batter sides.

Comparing Counts

These graphs are helpful for understanding pitch location, but they don’t focus on the basic goal of comparing locations across counts. So I created a second Shiny app where one chooses the pitcher, the batter side and the pitch type, and then one can compare the locations across a group of counts of interest. Here is a snapshot of the entire app, where I am exploring the location of fastballs of Madison Bumgarner against right-handed hitters for the counts 0-0, 0-1, 1-0, 0-2. We see that Bumgarner throws in the middle of the zone for 0-0 and 1-0 counts, throws inside on a 0-1 count, and high in the zone on a 0-2 count.

Let’s look at Bumgarner’s locations on off-speed pitches against righties for the same counts. As one might expect, he throws in the middle of the zone for 0-0 and 0-1 counts, but clearly throws out of the zone on an 0-2 count.

General Take-Aways

One advantage of creating this Shiny app is that one can quickly explore the locations of the pitches for many pitchers across groups of counts. Here are some general patterns I found when I focused on locations of pitches on 0-0 and 0-2 counts against right-handed batters.

  • Fastballs on 0-2 counts tended to be higher in the zone for a majority of pitchers (13 out of 20), although only 5 pitchers were more likely to throw out of the zone. Particular pitchers had different patterns — one pitcher threw more outside pitches, one threw lower pitches, and one (that we’ll see below) actually threw both inside and outside on a 0-2 pitch.
  • Off-Speed Pitches on 0-2 counts for 19 out the 20 pitchers tended to be low and out of the zone. A couple of pitchers also threw outside on a 0-2, and one pitcher had similar locations on 0-0 and 0-2 counts.

Here are some interesting observations. Patrick Corbin clearly throws his off-speed pitch on an 0-2 count out of the zone to right-handed hitters.

Jack Flaherty has this interesting pattern of locating his fastball towards the edges of the zone on an 0-2 count against right-handed hitters.

What’s the Best Location?

Although we are learning about how pitchers adjust their pitch locations by the count, we haven’t explored which is the best location strategy. For a future post, it would be interesting to explore pitch outcomes on different counts across pitchers. We could look at swinging strike rates, quality of balls put in play, etc. This might address Greg Maddux’s comment that there is nothing to be gained by wasting a pitch on a 0-2 pitch.

R Functions

These pitch location graphs are constructed by use of the functions location_count() and location_count_compare() in the CalledStrike package. For example, suppose you have Statcast data for a particular season stored in the data frame sc and you are interested in looking at the location of Aaron Nola’s fastballs against right-handed hitters in the counts 0-0, 0-1, 1-0. Aaron Nola’s MLBAM id number is 605400. Then you would type

location_count_compare(sc, 605400, "Aaron Nola", 
           "R", "Fastball", c("0-0", "0-1", "1-0"))

If you inspect the code of, say the location_count() function, you’ll see that I’m using the geom_density_2d_filled() function from the ggplot2 package to produce the filled contours of the density estimates.

Take the Shiny App for a Test Drive

I’ve incorporated the location_count_compare() function into a Shiny app into my CalledStrike package. Once the package is installed, then one loads the CalledStrike package and runs this app by simply typing


All of the Statcast data for my group of twenty pitchers for the 2019 season is included with the package. So you have the opportunity to see the locations of fastballs or off-speed pitches against right or left-handed hitters for any pitcher on any count. Also since the code is pretty straightforward, you can welcome to modify my code to create a different version of this Shiny app.

By the way, a general introduction to the CalledStrike package including these new pitch location functions can be found here.

Looking Forward

One takeaway from this analysis is that pitchers really don’t waste fastballs on 0-2 counts but there is a general tendency to throw off-speed pitches on 0-2 counts low and out of the zone. From personal observation, I am not sure if I’d call these pitches wasted, since batters do swing on some of these pitches. Since the count is such an important aspect in baseball, I think players and teams should be aware of tendencies of pitchers and hitters in different counts. MLBAM and Baseball Savant currently offer a wide variety of statistics and visuals for pitching data, but these count-specific displays are currently not available. But it is only a matter of time until these type of graphs and summaries are available to the public. In the meantime, it is great that we have the opportunity to create them using the available Statcast data.

4 responses

  1. Hi Jim,

    I love this.
    Silly question, the figures for location_count_compare function are from the catcher’s perspective, yes?

    1. Alex, correct — the pictures are from the catcher’s perspective. Jim

  2. Jim,

    Would this work happen to be posted on your GitHub? I can’t the code you used to build the Shiny app to visualize this. Thanks for your help.


    1. Matt:

      I just posted another illustration of using one of the Shiny apps. Hope you are able to install the package and get it running.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: