Visualizando... la Liga (o cómo añadir imágenes a un ggplot)

Ahora que ha terminado la Liga, es buen momento para echar la vista atrás y visualizar algunas de las estadísticas que nos deja. En concreto, vamos a analizar la relación “Goles a favor” - “Puntos conseguidos”.

Las estadísticas están sacadas de la web de La Liga, y los gráficos se harán usando R.

En una primera representación con ggplot, las etiquetas no se verían correctamente:

ggplot(data = estadisticas, aes(GF, Pt, label = equipo)) +
    geom_point() + 
    geom_smooth(method = "lm", se = FALSE) +
    geom_text() + 
    xlab("Goles a favor") +
    ylab("Puntos") + 
    theme_classic()

El gráfico mejora notablemente usando el paquete ggrepel para que las etiquetas se repelan:

ggplot(data = estadisticas, aes(GF, Pt, label = equipo)) +
    geom_point() +  
    geom_smooth(method = "lm", se = FALSE) + 
    geom_text_repel() + 
    xlab("Goles a favor") +
    ylab("Puntos") + 
    theme_classic()

Por último, vamos a hacer el mismo gráfico usando los escudos de los equipos.

Para añadir una imagen a un gráfico, usaremos los paquetes ggplot2, png, dplyr, y grid.

Leemos el escudo:

escudo1 <- readPNG("escudos/barcelona.png")

Representamos el gráfico:

ggplot(estadisticas, aes(GF, Pt, label = equipo)) +
   geom_point() +  
   geom_smooth(method = "lm", se = FALSE) +
   xlab("Goles a favor") +
   ylab("Puntos") +
   theme_classic() +
   annotation_custom(rasterGrob(escudo1),
                     xmin = estadisticas$GF[1] - 4,
                     xmax = estadisticas$GF[1] + 4,
                     ymin = estadisticas$Pt[1] - 4,
                     ymax = estadisticas$Pt[1] + 4)

Y para hacerlo con todos los escudos, usaremos un bucle y una función propia:

# Leemos los escudos 

for(i in 1:20){
    assign(paste0("escudo", i), readPNG(paste0("Escudos/", estadisticas$equipo[i], ".png")))
}

# Función propia

etiqueta_escudo <- function(n_equipo, puntox, puntoy, altura = 4) {
    nombre <- paste0("escudo", n_equipo) %&gt;% as.name %&gt;% eval
    return(annotation_custom(rasterGrob(nombre, interpolate = FALSE),
                    xmin = puntox[i] - altura,
                    xmax = puntox[i] + altura,
                    ymin = puntoy[i] - altura,
                    ymax = puntoy[i] + altura))
}

Después, partimos de un gráfico base:

grafico <- ggplot(estadisticas, aes(GF, Pt, label = equipo)) + 
    geom_point() +  
    geom_smooth(method = "lm", se = FALSE) + 
    xlab("Goles a favor") + 
    ylab("Puntos") + 
    theme_classic()

y añadimos un simple:

for (i in 20:1) {
  grafico <- grafico + etiqueta_escudo(i, estadisticas$GF, estadisticas$Pt)
}

(El ciclo for va de 20 a 1 para que, en caso de superposición, los equipos con más puntos se muestren “encima” de los equipos con menos puntos)

Obtenemos así el siguiente gráfico: