TidyTuesday Week 13: Pokemon

This week we are exploring Pokémon! This dataset is sourced from {pokemon} (CRAN | github), an R package which provides Pokémon information in both English and Brazilian Portuguese. I will only be looking at Gen 1 Pokémon.

TidyTuesday
Data Visualization
R Programming
2025
Author

Peter Gray

Published

March 30, 2025

(a) Thumbnail 1
(b) Thumbnail 2
Figure 1: Tidy Tuesday Week 13: Charts

1. R code

Show code
# Load the packages in ----------------------------------------------------

if(!require(tidyverse)){install.packages("tidyverse"); library(tidyverse)}
if(!require(patchwork)){install.packages("patchwork"); library(patchwork)}
if(!require(ggplot2)){install.packages("ggplot2"); library(ggplot2)}
if(!require(ggwordcloud)){install.packages("ggwordcloud"); library(ggwordcloud)}
if(!require(ggpmisc)){install.packages("ggpmisc"); library(ggpmisc)}
if(!require(ggimage)){install.packages("ggimage"); library(ggimage)}
if(!require(ggtext)){install.packages("ggtext"); library(ggimage)}
if(!require(rlist)){install.packages("rlist"); library(rlist)}
# I stick all my styling into a CUsotm PAckage to tidy up my code and keep it consistent over the time
if(!require(CustomGGPlot2Theme)){devtools::install("CustomGGPlot2Theme"); library(CustomGGPlot2Theme)}

# get the wd - force of habit
wd <- getwd()
#pulling images off internet was taking a lot of time and casing a time out error
options(timeout = 1000) 



font <- "noto_mono"

pokemon_df <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-04-01/pokemon_df.csv')

# I only care about first gen - Older Millenial

first_gen <- pokemon_df %>% 
  filter(generation_id == 1) %>% 
  #for later
  rename("special attack" = special_attack)

# going to loop through attack, defence, special attack, speed

columns <- c("attack", "defense", "special attack", "speed")
n = 3

#empty list of plots
list_of_plots <- list()

for(n in 1: length(columns)) {
  
  data <- first_gen %>%
    group_by(type_1) %>%
    slice_max(order_by = .data[[columns[n]]], n = 1, with_ties = FALSE) %>%
    ungroup() %>%
    arrange(.data[[columns[n]]])  # Correct dynamic column referencing
  
  #Make labels with a picture of the Pokemon and then the name of the pokemon underneath
  # Generate labels after sorting
  labels <- paste0(
    "<img src='", data$url_image, "' width='45' height='35' /><br>",
    "<span style='font-size:16px;'>", # Add font size styling here
    sapply(strwrap(str_to_title(data$pokemon), width = 20, simplify = FALSE), 
           function(x) paste(x, collapse = "<br>")),
    "</span>"
  )
  
  
  
  chart <- data %>%
    ggplot(aes(x = reorder(pokemon, .data[[columns[n]]]), 
               y = .data[[columns[n]]], 
               fill = str_to_title(type_1))) +
    geom_bar(stat = "identity") +
    geom_text(aes(label = .data[[columns[n]]]),  
              hjust = -0.5,
              position = position_dodge(width = 0.25),
              size = 6,  
              family = font) +
    coord_flip() +
    labs(x = "Pokémon", 
         y = paste0(str_to_title(columns[n]), " Score"), 
         subtitle = str_to_title(columns[n]),
         fill = "Pokémon Type") +  
    Custom_Style() +
    theme(axis.text.y = element_markdown(), 
          legend.text = element_text(size = 15),
          axis.text = element_text(size = 12)) +
    scale_x_discrete(labels = labels)  
  
  list_of_plots <- list.append(list_of_plots, chart)
  
}

#single plot to look good for social media
single_chart <- list_of_plots[[1]]

single_chart <- single_chart +
  labs(
    title = 'Visualisation of various Pokémon stats by their Attack',
    subtitle = "TidyTuesday: Week 13, 2025",
    theme = Custom_Style()
  ) +
  theme(
    plot.subtitle = element_text(size = 16)
  )


patchwork <- wrap_plots(list_of_plots) +
  plot_layout(guides = "collect") +
  plot_annotation(
    title = str_wrap('Visualisation of various Pokémon stats by their type', 80),
    subtitle = "TidyTuesday: Week 13, 2025",
    theme = Custom_Style()
  ) &
  theme(
    plot.title = element_text(size = 24),
    plot.subtitle = element_text(size = 16)
  )
Back to top