ggsoccer fornece funções para plotar dados de eventos de futebol em R/ggplot2.
#ggsoccer está disponível via CRAN:
# install.packages("ggsoccer")
#Alternativamente, você pode baixar a versão de desenvolvimento do github assim:
# install.packages("remotes")
# remotes::install_github("torvaney/ggsoccer")
O exemplo a seguir usa ggsoccer para resolver um problema realista: traçar um conjunto de passes para um campo de futebol.
library(ggplot2)
library(ggsoccer)
ggplot() +
annotate_pitch() +
theme_pitch()
Como o ggsoccer é implementado como camadas ggplot, os gráficos podem ser personalizados com funções e camadas padrão do ggplot.
Aqui está um exemplo diferente, traçando tomadas em um campo verde .
Por padrão, o ggsoccer exibirá todo o campo. Para exibir uma subseção
do tom, defina os limites do gráfico como faria com qualquer outro
gráfico ggplot2. Aqui, usamos os argumentos xlime
ylim para coord_flip.
coord_flipinverte a orientação dos pontos, portanto,
devemos também inverter o eixo y para garantir que a orientação
permaneça correta (ou seja, as fotos do lado esquerdo aparecem à
esquerda e as fotos do lado direito aparecem à direita).
Você pode fazer isso com scale_y_reverseou invertendo a
ordem dos limites no argumento coord_flipde
ylim.
Se você não corrigir (ou seja, inverter) a orientação do eixo y, os arcos da caixa de penalidade aparecerão dentro da caixa!
O padrão do ggsoccer é o sistema de coordenadas 100x100 da Opta. No entanto, diferentes fornecedores de dados podem utilizar coordenadas alternativas.
ggsoccer fornece suporte para alguns provedores de dados prontos para uso, bem como uma interface para qualquer sistema de coordenadas personalizado:
Opta
Bomba de estatísticas
Wyscout
shots <- data.frame(x = c(90, 85, 82, 78, 83, 74, 94, 91),
y = c(43, 40, 52, 56, 44, 71, 60, 54))
ggplot(shots) +
annotate_pitch(colour = "white",
fill = "springgreen4",
limits = FALSE) +
geom_point(aes(x = x, y = y),
colour = "yellow",
size = 4) +
theme_pitch() +
theme(panel.background = element_rect(fill = "springgreen4")) +
coord_flip(xlim = c(49, 101)) +
scale_y_reverse() +
ggtitle("Simple shotmap",
"ggsoccer example")
Para plotar dados para um conjunto de dados não fornecido, o ggsoccer requer uma especificação de campo. Esta é uma lista contendo as dimensões de passo necessárias, como esta:
# ggsoccer enables you to rescale coordinates from one data provider to another, too
to_statsbomb <- rescale_coordinates(from = pitch_opta, to = pitch_statsbomb)
passes_rescaled <- data.frame(x = to_statsbomb$x(pass_data$x),
y = to_statsbomb$y(pass_data$y),
x2 = to_statsbomb$x(pass_data$x2),
y2 = to_statsbomb$y(pass_data$y2))
ggplot(passes_rescaled) +
annotate_pitch(dimensions = pitch_statsbomb) +
geom_segment(aes(x = x, y = y, xend = x2, yend = y2),
colour = "coral",
arrow = arrow(length = unit(0.25, "cm"),
type = "closed")) +
theme_pitch() +
direction_label(x_label = 60) +
ggtitle("Simple passmap",
"Statsbomb co-ordinates")
pitch_custom <- list(
length = 150,
width = 100,
penalty_box_length = 25,
penalty_box_width = 60,
six_yard_box_length = 8,
six_yard_box_width = 26,
penalty_spot_distance = 16,
goal_width = 12,
origin_x = 0,
origin_y = 0
)
ggplot() +
annotate_pitch(dimensions = pitch_custom) +
theme_pitch()
ggsoccer permite que você personalize suas marcações de gols
fornecendo uma função ao goalsargumento de
annotate_pitch:
ggplot() +
annotate_pitch(fill = "steelblue4", colour = "white", goals = goals_line) +
theme_pitch() +
theme(panel.background = element_rect(fill = "steelblue4"))
Este argumento assume uma função (ou fórmula unilateral). Você pode
usar as funções fornecidas ou criar sua própria função de marcação de
gols. O goalsargumento também suporta o uso de fórmulas
unilaterais como funções lambda (consulte Recursos rlang::as_function).
ggplot() +
annotate_pitch(goals = goals_strip, fill = "lightgray") +
theme_pitch()
Veja help(goals_box)a lista completa de funções
disponíveis.
A ideia de ter múltiplas marcações de gols foi tirada e adaptada do pacote fc.rstats .
Você também pode alterar o estilo das marcações de afinação com
linewidth, alphae linetype:
goals_custom <- function(colour, fill, dimensions, ...) {
goals_strip(colour, fill, dimensions, lineend = "square", linewidth = 3.5)
}
ggplot() +
annotate_pitch(
goals = goals_custom,
fill = "lightgray"
) +
theme_pitch()
Existem outros pacotes que oferecem opções alternativas de plotagem de pitch. Dependendo do seu caso de uso, você também pode querer verificar isso:
ggplot() +
annotate_pitch(
colour = "white",
linewidth = 1.5,
linetype = "12",
alpha = 0.2,
goals = goals_line
) +
theme_pitch() +
theme(panel.background = element_rect(fill = "lightgreen"))