The Clean Shot

The Clean Shot

Tutoriales R

Cómo se hace gráfica jugadores con el ratio en usg% más alto por equipo

+ Data frames necesarios. Publicada en el post de El flautista de Hamelin

Avatar de Ivo Villanueva
Ivo Villanueva
sep 12, 2025
∙ De pago

📌 Plan de extraer el Play-by-Play del Eurobasket: abortado.

Ha hecho aguas. Otro año no me pasa.

Resulta que FIBA solo deja en su web los datos de los últimos tres días. ¿Qué alguien de FIBA leyó mis gritos de triunfo en X y decidió borrarlo todo? No quiero ponerme conspiranoico... pero como dice el dicho:
“Eu non creo nas meigas, pero habelas, hainas.”

Así que nada. El año que viene, lo extraigo desde el primer día.


Como compensación, voy a explicar cómo hice la tabla de
“Jugadores con el Ratio más alto… etc”, que es de mis favoritas.

📦 1. Librerías necesarias

library(tidyverse)   # Manipulación de datos + ggplot2
library(ggimage)     # Insertar imágenes en gráficos
library(ggtext)      # Texto enriquecido en títulos y captions
library(scales)      # Formato de ejes (percent_format)
library(cropcircles) # Recortar fotos en círculos
library(prismatic)   # Ajustar colores (oscurecer/iluminar)
library(shadowtext)  # Texto con sombra en los gráficos

📝 2. Caption personalizado con iconos y créditos

twitter <- "<span style='color:#000000;font-family: \"Font Awesome 6 Brands\"'>&#xE61A;</span>"
tweetelcheff <- "<span style='font-weight:bold;'>*@elcheff*</span>"
insta <- "<span style='color:#E1306C;font-family: \"Font Awesome 6 Brands\"'>&#xE055;</span>"
instaelcheff <- "<span style='font-weight:bold;'>*@sport_iv0*</span>"
github <- "<span style='color:#000000;font-family: \"Font Awesome 6 Brands\"'>&#xF092;</span>"
githubelcheff <- "<span style='font-weight:bold;'>*IvoVillanueva*</span>"

caption <- glue::glue(
  "<br>**Datos**: *@ACBCOM* • **Gráfico**: *Ivo Villanueva* • 
  {twitter} {tweetelcheff} • {insta} {instaelcheff} • {github} {githubelcheff}"
)

🏀 3. Datos base: colores de clubes y jugadores españoles

# Colores de cada club ACB
clubs <- read.csv("https://raw.githubusercontent.com/IvoVillanueva/logos_cuadrados_acb/refs/heads/main/acb_df.csv") %>%
  select(abb , color) %>%
  mutate(color = case_when(abb == "RMB" ~ "white", TRUE ~ color))

# Jugadores españoles identificados
espanoles <- read_csv("https://raw.githubusercontent.com/IvoVillanueva/data/refs/heads/main/elflautista/espanoles.csv") %>%
  rename(jugador = jug) %>%
  distinct()

📊 4. Cálculo del USG% a partir de los boxscores de la temporada 24/25

df <- read_csv("https://raw.githubusercontent.com/IvoVillanueva/data/refs/heads/main/elflautista/boxscores_2425.csv"), show_col_types = FALSE) %>%
  group_by(id_match, abb ) %>%
  mutate(
    fga = x2pt_tried + x3pt_tried,
    team_minutes = sum(time_played, na.rm = TRUE),
    team_fga = sum(fga, na.rm = TRUE),
    team_fta = sum(x1pt_tried, na.rm = TRUE),
    team_tov = sum(turnovers, na.rm = TRUE)
  ) %>%
  ungroup() %>%
  mutate(
    usg = 100 * (fga + 0.44 * x1pt_tried + turnovers) * (team_minutes / 5) /
      (pmax(time_played, 2) * (team_fga + 0.44 * team_fta + team_tov))
  )

✨ Este Substack se alimenta del cariño de quienes lo leen.


Si disfrutas con mis gráficas y análisis, considera suscribirte: es la mejor manera de mantener vivo este proyecto.

Continúa leyendo con una prueba gratuita de 7 días

Suscríbete a The Clean Shot para seguir leyendo este post y obtener 7 días de acceso gratis al archivo completo de posts.

¿Ya eres suscriptor de pago? Iniciar sesión
© 2025 The Clean Shot
Privacidad ∙ Términos ∙ Aviso de recolección
Crea tu SubstackDescargar la app
Substack es el hogar de la gran cultura