Visão geral

ggsoccer fornece funções para plotar dados de eventos de futebol em R/ggplot2.

Instalação

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

Implementação.

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!

Provedores de dados

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

Stats Bomb

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

Dados personalizados

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

Metas

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 .

Personalização adicional

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

Outras opções

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

Python

Existem algumas opções de plotagem de pitch para matplotlib também: