• Steven Ponce
  • About
  • Data Visualizations
  • Projects
  • Resume
  • Email

On this page

  • Steps to Create this Graphic
    • 1. Load Packages & Setup
    • 2. Read in the Data
    • 3. Examine the Data
    • 4. Tidy Data
    • 5. Visualization Parameters
    • 6. Plot
    • 7. Save
    • 8. Session Info
    • 9. GitHub Repository

Bob’s Burgers Viewership from Seasons 1 to 14

  • Show All Code
  • Hide All Code

  • View Source

Highlighting the highest viewed episode per season, based on Wikipedia viewership data.

Bob's Burgers
Standalone
2024
Author

Steven Ponce

Published

October 28, 2024

Figure 1: Bob’s Burgers Viewership by Season: A dot plot highlighting the highest viewed episode for each season from 1 to 14. Season 1’s ‘Human Flesh’ episode had the highest viewership with 9.38 million viewers.

Steps to Create this Graphic

1. Load Packages & Setup

Show code
```{r}
#| label: load
#| warning: false

## 1. LOAD PACKAGES & SETUP ----
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
  tidyverse,         # Easily Install and Load the 'Tidyverse'
  ggtext,            # Improved Text Rendering Support for 'ggplot2'
  showtext,          # Using Fonts More Easily in R Graphs
  janitor,           # Simple Tools for Examining and Cleaning Dirty Data
  skimr,             # Compact and Flexible Summaries of Data
  scales,            # Scale Functions for Visualization
  glue,              # Interpreted String Literals
  ggrepel,           # Automatically Position Non-Overlapping Text Labels with'ggplot2' 
  ggbeeswarm,        # Categorical Scatter (Violin Point) Plots
  bobsburgersR       # Bob's Burgers Datasets for Data Visualization
)    

### |- figure size ----
camcorder::gg_record(
  dir    = here::here("temp_plots"),
  device = "png",
  width  =  8,
  height =  8,
  units  = "in",
  dpi    = 320
)

### |- resolution ----
showtext_opts(dpi = 320, regular.wt = 300, bold.wt = 800)
```

2. Read in the Data

Show code
```{r}
#| label: read
#| include: true
#| eval: true
#| results: 'hide'
#| warning: false

bobsburgersR::imdb_wikipedia_data
```

3. Examine the Data

Show code
```{r}
#| label: examine
#| include: true
#| eval: true
#| results: 'hide'
#| warning: false

glimpse(imdb_wikipedia_data)
skim(imdb_wikipedia_data)
```

4. Tidy Data

Show code
```{r}
#| label: tidy
#| warning: false

## |- highlight  data ----

highlight_data <- imdb_wikipedia_data |>
  group_by(season) |>
  filter(wikipedia_viewers == max(wikipedia_viewers, na.rm = TRUE)) |>
  slice(1) |>
  ungroup() |>
  mutate(
    label = paste0("Ep: ", episode, " - ", imdb_title, "\nViewers: ", wikipedia_viewers, " M")
  )
```

5. Visualization Parameters

Show code
```{r}
#| label: params
#| include: true
#| warning: false

### |- plot aesthetics ----
bkg_col      <- "#f5f5f2"     
title_col    <- "gray20"           
subtitle_col <- "gray20"     
caption_col  <- "gray30"   
text_col     <- "gray20"    
col_palette <- c("#b358a6", "#762a83", "#4d004b", "grey50") 

### |-  titles and caption ----

# icons
tt <- str_glue("Source: {{bobsburgersR}}")
li <- str_glue("<span style='font-family:fa6-brands'>&#xf08c;</span>")
gh <- str_glue("<span style='font-family:fa6-brands'>&#xf09b;</span>")

# text
title_text    <- str_glue("Bob's Burgers Viewership from Seasons 1 to 14")
subtitle_text <- str_glue("Highlighting the highest viewed episode per season, based on Wikipedia viewership data.")
caption_text  <- str_glue("{li} stevenponce &bull; {gh} poncest &bull; #rstats #ggplot2 &bull; {tt}")

### |-  fonts ----
font_add("fa6-brands", here::here("fonts/6.4.2/Font Awesome 6 Brands-Regular-400.otf"))
font_add_google("Oswald", regular.wt = 400, family = "title")
font_add_google("Merriweather Sans", regular.wt = 400, family = "subtitle")
font_add_google("Merriweather Sans", regular.wt = 400, family = "text")
font_add_google("Noto Sans", regular.wt = 400, family = "caption")
showtext_auto(enable = TRUE)

### |-  plot theme ----
theme_set(theme_minimal(base_size = 14, base_family = "text"))                

theme_update(
  plot.title.position   = "plot",
  plot.caption.position = "plot",
  legend.position       = 'plot',
  plot.background       = element_rect(fill = bkg_col, color = bkg_col),
  panel.background      = element_rect(fill = bkg_col, color = bkg_col),
  plot.margin           = margin(t = 10, r = 20, b = 10, l = 20),
  axis.title.x          = element_text(margin = margin(10, 0, 0, 0), size = rel(1.1), 
                                       color = text_col, family = "text", face = "bold", hjust = 0.5),
  axis.title.y          = element_text(margin = margin(0, 10, 0, 0), size = rel(1.1), 
                                       color = text_col, family = "text", face = "bold", hjust = 0.5),
  axis.text             = element_text(size = rel(0.8), color = text_col, family = "text"),
  panel.grid.major.y    = element_line(color = "#e0e0e0", linewidth = 0.6, linetype = 'dotted'),
  panel.grid.major.x    = element_line(color = "#d3d3d3", linewidth = 0.6, linetype = 'dotted'),
  panel.grid.minor      = element_blank()
)
```

6. Plot

Show code
```{r}
#| label: plot
#| warning: false

p <- ggplot(imdb_wikipedia_data, 
            aes(x = wikipedia_viewers, y = factor(season, levels = rev(unique(season))))) +

  # Geoms
  ggbeeswarm::geom_beeswarm(cex = 1, color = col_palette[2], size = 2, 
                            alpha = 0.5, shape = 21, na.rm = TRUE) +
  ggbeeswarm::geom_beeswarm(
    data = highlight_data,
    aes(color = factor(ifelse(season == 1, "highlight", "normal"))),
    cex = 1, size = 2.1, alpha = 0.75, shape = 19, na.rm = TRUE
  ) +
  geom_segment(
    data = highlight_data,
    aes(
      x = wikipedia_viewers, xend = wikipedia_viewers + 0.5,
      y = as.numeric(factor(season, levels = rev(unique(season)))), yend = as.numeric(factor(season, levels = rev(unique(season))))
    ),
    color = col_palette[4], size = 0.2, linetype = "dotted"
  ) +
  geom_text(
    data = highlight_data, aes(
      x = wikipedia_viewers + 0.6, y = factor(season, levels = rev(unique(season))),
      label = label, lineheight = 1, color = factor(ifelse(season == 1, "highlight", "normal"))
    ),
    size = 3, hjust = 0
  ) +

  # Scales
  scale_x_continuous(
    breaks = seq(0, 10, by = 2),
    limits = c(1, 12)
  ) +
  scale_y_discrete() +
  scale_color_manual(values = c("highlight" = col_palette[3], "normal" = col_palette[4])) +
  coord_cartesian(clip = "off") +

  # Labs

  labs(
    x = "US Viewers (in millions)",
    y = "Season",
    title = title_text,
    subtitle = subtitle_text,
    caption = caption_text
  ) +
  
  # Theme
  theme(
    plot.margin  = margin(10, 20, 10, 20),
    plot.title   = element_markdown(
      size       = rel(1.6),
      family     = "title",
      face       = "bold",
      color      = title_col,
      lineheight = 1.1,
      margin     = margin(t = 10, b = 5)
    ),
    plot.subtitle = element_markdown(
      size       = rel(0.85),
      family     = "subtitle",
      color      = subtitle_col,
      lineheight = 1.1,
      margin     = margin(t = 5, b = 15)
    ),
    plot.caption = element_markdown(
      size       = rel(0.65),
      family     = "caption",
      color      = caption_col,
      lineheight = 1.1,
      hjust      = 0.5,
      halign     = 0.5,
      margin     = margin(t = 5, b = 5)
    ),
  )
```

7. Save

Show code
```{r}
#| label: save
#| warning: false

### |-  plot image ----  

# Save the plot as PNG
ggsave(
  filename = here::here("projects/standalone_visualizations/sa_2024-10-28.png"), 
  plot = p,
  width = 8, height = 8, units = "in", dpi = 320
)

### |-  plot thumbnail----  
magick::image_read(here::here("projects/standalone_visualizations/sa_2024-10-28.png")) |> 
  magick::image_resize(geometry = "400") |> 
  magick::image_write(here::here("projects/standalone_visualizations/thumbnails/sa_2024-10-28.png"))
```

8. Session Info

TipExpand for Session Info
R version 4.4.1 (2024-06-14 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 22631)

Matrix products: default


locale:
[1] LC_COLLATE=English_United States.utf8 
[2] LC_CTYPE=English_United States.utf8   
[3] LC_MONETARY=English_United States.utf8
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.utf8    

time zone: America/New_York
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
 [1] bobsburgersR_0.0.0.9000 ggbeeswarm_0.7.2        ggrepel_0.9.6          
 [4] glue_1.8.0              scales_1.3.0            skimr_2.1.5            
 [7] janitor_2.2.0           showtext_0.9-7          showtextdb_3.0         
[10] sysfonts_0.8.9          ggtext_0.1.2            lubridate_1.9.3        
[13] forcats_1.0.0           stringr_1.5.1           dplyr_1.1.4            
[16] purrr_1.0.2             readr_2.1.5             tidyr_1.3.1            
[19] tibble_3.2.1            ggplot2_3.5.1           tidyverse_2.0.0        
[22] pacman_0.5.1           

loaded via a namespace (and not attached):
 [1] gtable_0.3.6      beeswarm_0.4.0    xfun_0.49         htmlwidgets_1.6.4
 [5] tzdb_0.5.0        vctrs_0.6.5       tools_4.4.0       generics_0.1.3   
 [9] curl_6.0.0        gifski_1.32.0-1   fansi_1.0.6       pkgconfig_2.0.3  
[13] lifecycle_1.0.4   farver_2.1.2      compiler_4.4.0    textshaping_0.4.0
[17] munsell_0.5.1     repr_1.1.7        codetools_0.2-20  snakecase_0.11.1 
[21] vipor_0.4.7       htmltools_0.5.8.1 yaml_2.3.10       pillar_1.9.0     
[25] camcorder_0.1.0   magick_2.8.5      commonmark_1.9.2  tidyselect_1.2.1 
[29] digest_0.6.37     stringi_1.8.4     rsvg_2.6.1        rprojroot_2.0.4  
[33] fastmap_1.2.0     grid_4.4.0        here_1.0.1        colorspace_2.1-1 
[37] cli_3.6.4         magrittr_2.0.3    base64enc_0.1-3   utf8_1.2.4       
[41] withr_3.0.2       timechange_0.3.0  rmarkdown_2.29    ragg_1.3.3       
[45] hms_1.1.3         evaluate_1.0.1    knitr_1.49        markdown_1.13    
[49] rlang_1.1.6       gridtext_0.1.5    Rcpp_1.0.13-1     xml2_1.3.6       
[53] renv_1.0.3        svglite_2.1.3     rstudioapi_0.17.1 jsonlite_1.8.9   
[57] R6_2.5.1          systemfonts_1.1.0

9. GitHub Repository

TipExpand for GitHub Repo

Access the GitHub repository here

Back to top
Source Code
---
title: "Bob's Burgers Viewership from Seasons 1 to 14"
subtitle: "Highlighting the highest viewed episode per season, based on Wikipedia viewership data."
author: "Steven Ponce"
date: "2024-10-28"
categories: ["Bob's Burgers", "Standalone", "2024"]
image: "thumbnails/sa_2024-10-28.png"
format:
  html:
    toc: true
    toc-depth: 5
    code-link: true
    code-fold: true
    code-tools: true
    code-summary: "Show code"
    self-contained: true
editor_options: 
  
  chunk_output_type: inline
execute: 
  
  error: false
  message: false
  warning: false
  eval: true
# share:
#   permalink: "https://stevenponce.netlify.app/projects.html"
#   linkedin: true
#   twitter: true
#   email: true
---

![Bob's Burgers Viewership by Season: A dot plot highlighting the highest viewed episode for each season from 1 to 14. Season 1's 'Human Flesh' episode had the highest viewership with 9.38 million viewers.](sa_2024-10-28){#fig-1}

### <mark> __Steps to Create this Graphic__ </mark>

#### 1. Load Packages & Setup 

```{r}
#| label: load
#| warning: false

## 1. LOAD PACKAGES & SETUP ----
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
  tidyverse,         # Easily Install and Load the 'Tidyverse'
  ggtext,            # Improved Text Rendering Support for 'ggplot2'
  showtext,          # Using Fonts More Easily in R Graphs
  janitor,           # Simple Tools for Examining and Cleaning Dirty Data
  skimr,             # Compact and Flexible Summaries of Data
  scales,            # Scale Functions for Visualization
  glue,              # Interpreted String Literals
  ggrepel,           # Automatically Position Non-Overlapping Text Labels with'ggplot2' 
  ggbeeswarm,        # Categorical Scatter (Violin Point) Plots
  bobsburgersR       # Bob's Burgers Datasets for Data Visualization
)    

### |- figure size ----
camcorder::gg_record(
  dir    = here::here("temp_plots"),
  device = "png",
  width  =  8,
  height =  8,
  units  = "in",
  dpi    = 320
)

### |- resolution ----
showtext_opts(dpi = 320, regular.wt = 300, bold.wt = 800)
```

#### 2. Read in the Data 

```{r}
#| label: read
#| include: true
#| eval: true
#| results: 'hide'
#| warning: false

bobsburgersR::imdb_wikipedia_data
```

#### 3. Examine the Data

```{r}
#| label: examine
#| include: true
#| eval: true
#| results: 'hide'
#| warning: false

glimpse(imdb_wikipedia_data)
skim(imdb_wikipedia_data)
```

#### 4. Tidy Data 

```{r}
#| label: tidy
#| warning: false

## |- highlight  data ----

highlight_data <- imdb_wikipedia_data |>
  group_by(season) |>
  filter(wikipedia_viewers == max(wikipedia_viewers, na.rm = TRUE)) |>
  slice(1) |>
  ungroup() |>
  mutate(
    label = paste0("Ep: ", episode, " - ", imdb_title, "\nViewers: ", wikipedia_viewers, " M")
  )
```


#### 5. Visualization Parameters 

```{r}
#| label: params
#| include: true
#| warning: false

### |- plot aesthetics ----
bkg_col      <- "#f5f5f2"     
title_col    <- "gray20"           
subtitle_col <- "gray20"     
caption_col  <- "gray30"   
text_col     <- "gray20"    
col_palette <- c("#b358a6", "#762a83", "#4d004b", "grey50") 

### |-  titles and caption ----

# icons
tt <- str_glue("Source: {{bobsburgersR}}")
li <- str_glue("<span style='font-family:fa6-brands'>&#xf08c;</span>")
gh <- str_glue("<span style='font-family:fa6-brands'>&#xf09b;</span>")

# text
title_text    <- str_glue("Bob's Burgers Viewership from Seasons 1 to 14")
subtitle_text <- str_glue("Highlighting the highest viewed episode per season, based on Wikipedia viewership data.")
caption_text  <- str_glue("{li} stevenponce &bull; {gh} poncest &bull; #rstats #ggplot2 &bull; {tt}")

### |-  fonts ----
font_add("fa6-brands", here::here("fonts/6.4.2/Font Awesome 6 Brands-Regular-400.otf"))
font_add_google("Oswald", regular.wt = 400, family = "title")
font_add_google("Merriweather Sans", regular.wt = 400, family = "subtitle")
font_add_google("Merriweather Sans", regular.wt = 400, family = "text")
font_add_google("Noto Sans", regular.wt = 400, family = "caption")
showtext_auto(enable = TRUE)

### |-  plot theme ----
theme_set(theme_minimal(base_size = 14, base_family = "text"))                

theme_update(
  plot.title.position   = "plot",
  plot.caption.position = "plot",
  legend.position       = 'plot',
  plot.background       = element_rect(fill = bkg_col, color = bkg_col),
  panel.background      = element_rect(fill = bkg_col, color = bkg_col),
  plot.margin           = margin(t = 10, r = 20, b = 10, l = 20),
  axis.title.x          = element_text(margin = margin(10, 0, 0, 0), size = rel(1.1), 
                                       color = text_col, family = "text", face = "bold", hjust = 0.5),
  axis.title.y          = element_text(margin = margin(0, 10, 0, 0), size = rel(1.1), 
                                       color = text_col, family = "text", face = "bold", hjust = 0.5),
  axis.text             = element_text(size = rel(0.8), color = text_col, family = "text"),
  panel.grid.major.y    = element_line(color = "#e0e0e0", linewidth = 0.6, linetype = 'dotted'),
  panel.grid.major.x    = element_line(color = "#d3d3d3", linewidth = 0.6, linetype = 'dotted'),
  panel.grid.minor      = element_blank()
)
```


#### 6. Plot 

```{r}
#| label: plot
#| warning: false

p <- ggplot(imdb_wikipedia_data, 
            aes(x = wikipedia_viewers, y = factor(season, levels = rev(unique(season))))) +

  # Geoms
  ggbeeswarm::geom_beeswarm(cex = 1, color = col_palette[2], size = 2, 
                            alpha = 0.5, shape = 21, na.rm = TRUE) +
  ggbeeswarm::geom_beeswarm(
    data = highlight_data,
    aes(color = factor(ifelse(season == 1, "highlight", "normal"))),
    cex = 1, size = 2.1, alpha = 0.75, shape = 19, na.rm = TRUE
  ) +
  geom_segment(
    data = highlight_data,
    aes(
      x = wikipedia_viewers, xend = wikipedia_viewers + 0.5,
      y = as.numeric(factor(season, levels = rev(unique(season)))), yend = as.numeric(factor(season, levels = rev(unique(season))))
    ),
    color = col_palette[4], size = 0.2, linetype = "dotted"
  ) +
  geom_text(
    data = highlight_data, aes(
      x = wikipedia_viewers + 0.6, y = factor(season, levels = rev(unique(season))),
      label = label, lineheight = 1, color = factor(ifelse(season == 1, "highlight", "normal"))
    ),
    size = 3, hjust = 0
  ) +

  # Scales
  scale_x_continuous(
    breaks = seq(0, 10, by = 2),
    limits = c(1, 12)
  ) +
  scale_y_discrete() +
  scale_color_manual(values = c("highlight" = col_palette[3], "normal" = col_palette[4])) +
  coord_cartesian(clip = "off") +

  # Labs

  labs(
    x = "US Viewers (in millions)",
    y = "Season",
    title = title_text,
    subtitle = subtitle_text,
    caption = caption_text
  ) +
  
  # Theme
  theme(
    plot.margin  = margin(10, 20, 10, 20),
    plot.title   = element_markdown(
      size       = rel(1.6),
      family     = "title",
      face       = "bold",
      color      = title_col,
      lineheight = 1.1,
      margin     = margin(t = 10, b = 5)
    ),
    plot.subtitle = element_markdown(
      size       = rel(0.85),
      family     = "subtitle",
      color      = subtitle_col,
      lineheight = 1.1,
      margin     = margin(t = 5, b = 15)
    ),
    plot.caption = element_markdown(
      size       = rel(0.65),
      family     = "caption",
      color      = caption_col,
      lineheight = 1.1,
      hjust      = 0.5,
      halign     = 0.5,
      margin     = margin(t = 5, b = 5)
    ),
  )
```



#### 7. Save

```{r}
#| label: save
#| warning: false

### |-  plot image ----  

# Save the plot as PNG
ggsave(
  filename = here::here("projects/standalone_visualizations/sa_2024-10-28.png"), 
  plot = p,
  width = 8, height = 8, units = "in", dpi = 320
)

### |-  plot thumbnail----  
magick::image_read(here::here("projects/standalone_visualizations/sa_2024-10-28.png")) |> 
  magick::image_resize(geometry = "400") |> 
  magick::image_write(here::here("projects/standalone_visualizations/thumbnails/sa_2024-10-28.png"))
```



#### 8. Session Info

::: {.callout-tip collapse="true"}
##### Expand for Session Info

```{r, echo = FALSE}
#| eval: true
#| warning: false

sessionInfo()
```
:::

#### 9. GitHub Repository

::: {.callout-tip collapse="true"}

##### Expand for GitHub Repo
 
[Access the GitHub repository here](https://github.com/poncest/personal-website/)
:::

© 2024 Steven Ponce

Source Issues