Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plotting baseball pitches as qualitative variable by color

I was thinking of doing this in R but am new to it and would appreciate any help

I have a dataset (pitches) of baseball pitches identified by 'pitchNumber' and 'outcome' e.g S = swinging strike, B = ball, H= hit etc.

e.g. 1 B ; 2 H ; 3 S ; 4 S ; 5 X ; 6 H; etc.

All I want to do is have a graph that plots them in a line cf BHSSXB but replacing the letter with a small bar colored to represent the letter, with a legend, and optionally having the pitch number above the color . Somewhat like a sparkline.

Any suggestion on how to implement this much appreciated

like image 718
pssguy Avatar asked Feb 13 '26 06:02

pssguy


2 Answers

And the same graph using ggplot.

Data courtesy of @GavinSimpson.

ggplot(baseball, aes(x=pitchNumber, y=1, ymin=0, ymax=1, colour=outcome)) + 
    geom_point() + 
    geom_linerange() +
    ylab(NULL) +
    xlab(NULL) + 
    scale_y_continuous(breaks=c(0, 1)) +
    opts(
        panel.background=theme_blank(),
        panel.grid.minor=theme_blank(),
        axis.text.y = theme_blank()
    )

enter image description here

like image 109
Andrie Avatar answered Feb 16 '26 17:02

Andrie


Here is a base graphics idea from which to work. First some dummy data:

set.seed(1)
baseball <- data.frame(pitchNumber = seq_len(50),
                       outcome = factor(sample(c("B","H","S","S","X","H"), 
                                               50, replace = TRUE)))
> head(baseball)
  pitchNumber outcome
1           1       H
2           2       S
3           3       S
4           4       H
5           5       H
6           6       H

Next we define the colours we want:

## better colours - like ggplot for the cool kids
##cols <- c("red","green","blue","yellow")
cols <- head(hcl(seq(from = 0, to = 360,
                    length.out = nlevels(with(baseball, outcome)) + 1), 
                 l = 65, c = 100), -1)

then plot the pitchNumber as a height 1 histogram-like bar (type = "h"), suppressing the normal axes, and we add on points to the tops of the bars to help visualisation:

with(baseball, plot(pitchNumber, y = rep(1, length(pitchNumber)), type = "h", 
                    ylim = c(0, 1.2), col = cols[outcome],
                    ylab = "", xlab = "Pitch", axes = FALSE, lwd = 2))
with(baseball, points(pitchNumber, y = rep(1, length(pitchNumber)), pch = 16, 
                      col = cols[outcome]))

Add on the x-axis and the plot frame, plus a legend:

axis(side = 1)
box()
## note: this assumes that the levels are in alphabetical order B,H,S,X...
legend("topleft", legend = c("Ball","Hit","Swinging Strike","X??"), lty = 1,
       pch = 16, col = cols, bty = "n", ncol = 2, lwd = 2)

Gives this:

baseball sparkline

like image 41
Gavin Simpson Avatar answered Feb 16 '26 16:02

Gavin Simpson



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!