Построение бейсбольных полей как качественная переменная по цвету - PullRequest
2 голосов
/ 19 апреля 2011

Я думал о том, чтобы сделать это в R, но я новичок в этом и был бы признателен за любую помощь

У меня есть набор данных (шагов) шагов бейсбола, идентифицированных как «pitchNumber» и «исход», например, S = размахивая, B = мяч, H = удар и т.д.

например. 1 Б; 2 Н; 3 S; 4 S; 5 х; 6 Н; и т.д.

Все, что я хочу сделать, это иметь график, который отображает их в виде линии, см. BHSSXB но заменив букву маленькой полосой, окрашенной для обозначения буквы, с легендой и, возможно, имеющей номер шага над цветом. Что-то вроде спарклайна.

Любое предложение о том, как реализовать это высоко ценится

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

И тот же график с использованием ggplot.

Предоставлено @ 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

3 голосов
/ 21 апреля 2011

Это ответ на ваш последний комментарий к ответу @ Gavin. Я собираюсь использовать данные, предоставленные @Gavin, и график ggplot2, созданный @Andrie. ggplot() поддерживает концепцию огранки переменной или переменных. Здесь вы хотите получить граненый кувшин и предел подачи 50 в строке. Мы создадим новую переменную, которая соответствует каждой строке, которую мы хотим построить отдельно. Эквивалентный код в базовой графике повлечет за собой корректировку mfrow или mfcol в par() и вызов отдельных участков для каждой группы данных.

#150 pitches represents a somewhat typical 9 inning game. 
#Thanks to Gavin for sample data.
longGame <- rbind(baseball, baseball, baseball)
#Starter goes 95 pitches, middle relief throws 35, closer comes in for 20 and the glory
longGame$pitcher <- c(rep("S", 95), rep("M", 35), rep("C",20))
#Adjust pitchNumber accordingly
longGame$pitchNumber <- c(1:95, 1:35, 1:20)
#We want to show 50 pitches at a time, so will combine the pitcher name 
#with which set of pitches this is
longGame$facet <- with(longGame, paste(pitcher, ceiling(pitchNumber / 50), sep = ""))
#Create the x-axis in increments of 1-50, by pitcher
longGame <- ddply(longGame, "facet", transform, pitchFacet = rep(1:50, 5)[1:length(facet)])
#Convert facet to factor in the right order
longGame$facet <- factor(longGame$facet, levels = c("S1", "S2", "M1", "C1"))

#Thanks to Andrie for ggplot2 function. I change the x-axis and add a facet_wrap
ggplot(longGame, aes(x=pitchFacet, y=1, ymin=0, ymax=1, colour=outcome)) + 
    geom_point() + 
    geom_linerange() +
    facet_wrap(~facet, ncol = 1) +
    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

3 голосов
/ 19 апреля 2011

Вот базовая графическая идея для работы.Сначала некоторые фиктивные данные:

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

Затем мы определяем цвета, которые мы хотим:

## 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)

, затем строим pitchNumber как высоту 1 гистограмма bar (type = "h"), подавляя нормальные оси, и мы добавляем точки к вершинам стержней, чтобы помочь визуализации:

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]))

Добавьте ось X и рамку графика, а также легенду:

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)

Даёт это:

baseball sparkline

...