This project will graphically depict trends, patterns, and analysis of Animal Shelter data derived from the TidyTuesday initiative. The dataset includes information about animals taken in and released from the shelter; there are variables such as intake type, outcome type, animal type, breed, age, and more. The primary goal of this project is to identify key factors that influence an animals outcome.
This project examines factors influencing animal outcomes and adoption timelines at the Long Beach Animal Shelter. The dataset—sourced from TidyTuesday—contains 29,787 records and 22 fields, capturing intake and outcome events for various species in Long Beach, California.
The first goal investigates how intake conditions, species grouping, and age at intake relate to final outcomes. The raw data are cleaned and transformed by parsing the dob field into a numeric age_at_intake, standardizing intake_condition values, and collapsing animal_type. Visual analyses reveal which intake conditions are associated with more favorable outcomes, how outcome patterns differ across species groups, and whether age correlates with specific dispositions. These insights may help shelter staff identify high‐risk subgroups and allocate medical or foster resources more effectively.
The second goal examines how both the number of adoptions and the speed of adoption have changed from 2017 through 2024. We filter to records where outcome_type == "adoption", compute days_to_adoption as the difference between outcome_date and intake_date, and derive intake_year. Vsualizations combine median adoption timelines with annual adoption counts to show how volumes and wait times have shifted year over year. This dual view reveals not just whether animals are moving through the shelter more quickly, but also whether adoption demand has increased or decreased, offering actionable insights for capacity planning, resource allocation, and ongoing performance benchmarking.
Introduction
The Long Beach Animal Shelter dataset (TidyTuesday week 2025-03-04) captures 29,787 intake and outcome records from 2021–2025, sourced from the City of Long Beach Animal Care Services open data portal. It includes 22 fields such as intake_date, outcome_date, intake_condition, animal_type, outcome_type, dob, and geolocation, providing a rich mix of categorical, date, and numeric variables.
This project visualizes which intake scenarios and animal characteristics predict different outcomes, and how quickly animals find homes over time. By looking at a variety of visualizations, we hope to provide insight into how intake conditions and animal types affect the animal’s outcome and then examine year-by-year shifts in both the number of adoptions and the speed with which animals find homes. This information could deliver actionable insights for shelter staff on resource allocation and policy planning.
Data Cleaning
Before diving into our analyses, we perform several key data‐wrangling steps to ensure consistency and create the variables we need. First, we standardize the intake_condition text by trimming extra whitespace, replacing slashes with spaces, and converting to lowercase. Next, we collapse the many values of animal_type into a three-level factor—Dog, Cat, and Other—so we can directly compare these groups. We also calculate each animal’s age at intake (in years) from its date of birth, flagging missing values as “Unknown.” Finally, we derive days_to_adoption by subtracting intake_date from outcome_date, which sets us up to explore adoption timelines.
Analysis of Data
To establish the rationale for combining animal_type into Dog, Cat, and Other, horizontal bar chart of the various values of animal_type are shown with color highlighting the grouping.
Question 1: How do intake conditions and animal types affect the animal’s outcome?
Introduction:
Animal shelters frequently intake a wide range of animals with different conditions. From scenarios such as healthy surrenders, injured or ill, or stray pickups. Understanding how these intake conditions affect the final outcomes across the three categorized animal types (dogs, cats, and others) is crucial. This analysis provides insights into which species may be underrepresented or disproportionately affected, helping shelter management and policymakers make informed decisions to improve animal care and resource allocation.
Approach:
We will examine how intake_condition and species_group influence the likelihood of different outcomes for animals in the Long Beach shelter system. To simplify interpretation, the original animal_type variable has been recoded into a more general species_group category consisting of dogs, cats, and other species. This distinction allows us to focus on how outcomes differ not only by individual condition but also across species that historically experience different adoption rates and shelter outcomes.
The outcome variable, originally containing 19 unique outcome_type values, has been consolidated into a new outcome_category with three meaningful groups: adopted, death, and non-death. This categorization captures critical differences in outcomes while reducing complexity. Through this approach, we aim to uncover patterns that reveal which species and intake conditions are associated with better or worse outcomes, providing actionable insights for shelter management and animal welfare efforts.
Analysis:
Discussion:
The shelter outcome data reveals a clear disparity in how different species fare once admitted. Dogs and cats make up the majority of the shelter population, they are significantly more likely to be adopted compared to other species. This disproportionate rate of adoptions suggests that dogs and cats dominate intake numbers and benefit from greater public interest and adoption opportunities.
Conversely, animals categorized outside of dogs and cats, such as rabbits, birds, reptiles, and other small animals—experience far fewer adoptions and notably higher death rates. Despite representing a smaller share of shelter intakes, these species face worse outcomes, highlighting an underrepresented group that is more vulnerable within the shelter system.
Furthermore, intake conditions play a critical role in shaping these outcomes. As seen in the “Paths Begin at Intake:..” plot, animals arriving in favorable conditions, such as mild or moderate illness or injury, often translate into higher adoption rates. Meanwhile, when arriving in moderate or severe conditions, face greater barriers to positive outcomes. These patterns emphasize the need for more targeted intervention and outreach to improve the fate of non-dog and non-cat species within the shelter environment.
Question 2: How Have Adoption Volumes and Timelines Evolved (2017–2024) Across Dogs, Cats, and Other Species?
Introduction:
Understanding how both the volume of adoptions and the speed at which animals leave the shelter have shifted from 2017 through 2024 is important for effective capacity planning and resource management. Looking at these trends out by Dogs, Cats, and Other species groups also lets us assess the impact of recent outreach and medical initiatives and inform future program investments.
Approach:
The first plot shows, for each species group, how adoption volumes and delay distributions have shifted annually from 2017 through 2024. The grey bars (right‐axis scale) represent the total count of adoptions each year (scaled to the 95th percentile), while the blue violins (left‐axis scale) depict the full distribution of days-to-adoption, with dark points marking the median.
The second visualization consists of bubble chart plots, for each species group, the year‐to‐year relationship between the speed of adoptions (median days to adoption on the y-axis) and the volume of adoptions (bubble size). By faceting Dogs, Cats, and Other vertically, you can see how median wait times and total placements have moved in tandem from 2017 through 2024.
Analysis:
Discussion:
The plots show a clear pandemic‐era dip in adoptions, followed by a strong post‐2020 rebound. Dog adoptions surged from roughly 100 in 2020 to over 600 by 2023–24, with cats exhibiting a similar rebound and “Other” species peaking around 200 placements.
Despite these volume swings, median wait times held steady or improved compared to pre-pandemic levels, representing a true dual gain for the shelter: higher throughput and faster turnover. Dogs remain the quickest to re-home, cats exhibit a broader distribution with some long-stay outliers, and “Other” species continue to show the greatest year-to-year variability. The broader distribution for cats is not surprising as more adoptions suggest a broader variety of time to adoption–it is impressive that dogs did not show the same increase even though their adoption numbers increased as well.
These improvements speak to the shelter’s focus on improving outcomes for their animals. It is a reflection of staff, volunteer, and supporter dedication to the lives of pets and their owners.
Citations
AI was used for assistance in this project. It was used for code clarification, exception explanations, and discussions on how lubridate, scales, and other packages operate. Code snippets were used only when unable to resolve an issue independently. All text is written exclusively by the team.
Source Code
---title: "Graphically Pawsitive Vibes"subtitle: "INFO 526 - Summer 2025 - Final Project"author: - name: "Isle of Dogs" affiliations: - name: "School of Information, University of Arizona"description: "This project will graphically depict trends, patterns, and analysis of Animal Shelter data derived from the TidyTuesday initiative. The dataset includes information about animals taken in and released from the shelter; there are variables such as intake type, outcome type, animal type, breed, age, and more. The primary goal of this project is to identify key factors that influence an animals outcome."format: html: code-tools: true code-overflow: wrap embed-resources: trueeditor: visualexecute: warning: false echo: false---```{r}#| label: load-pkgs#| message: false#| echo: falseif (!require("pacman")) install.packages("pacman")pacman::p_load(tidyverse, tidytuesdayR, formattable, dlookr, ggplot2, scales, lubridate, RColorBrewer)```# Graphically Pawsitive Vibes### Data LoadingLoad the Longbeach dataset from TidyTuesday```{r}#| label: data-loadinglongbeach <-tt_load("2025-03-04")longbeach = longbeach$longbeach# get dimensionscat("Rows:", nrow(longbeach), "\nColumns:", ncol(longbeach), "\n\n")# list the column namescols <-colnames(longbeach)for (i inseq_along(cols)) {cat(sprintf("%2d. %s\n", i, cols[i]))}```## AbstractThis project examines factors influencing animal outcomes and adoption timelines at the Long Beach Animal Shelter. The dataset—sourced from TidyTuesday—contains 29,787 records and 22 fields, capturing intake and outcome events for various species in Long Beach, California.The first goal investigates how intake conditions, species grouping, and age at intake relate to final outcomes. The raw data are cleaned and transformed by parsing the `dob` field into a numeric `age_at_intake`, standardizing `intake_condition` values, and collapsing `animal_type`. Visual analyses reveal which intake conditions are associated with more favorable outcomes, how outcome patterns differ across species groups, and whether age correlates with specific dispositions. These insights may help shelter staff identify high‐risk subgroups and allocate medical or foster resources more effectively.The second goal examines how both the number of adoptions and the speed of adoption have changed from 2017 through 2024. We filter to records where `outcome_type == "adoption"`, compute `days_to_adoption` as the difference between `outcome_date` and `intake_date`, and derive `intake_year`. Vsualizations combine median adoption timelines with annual adoption counts to show how volumes and wait times have shifted year over year. This dual view reveals not just whether animals are moving through the shelter more quickly, but also whether adoption demand has increased or decreased, offering actionable insights for capacity planning, resource allocation, and ongoing performance benchmarking.## IntroductionThe Long Beach Animal Shelter dataset (TidyTuesday week 2025-03-04) captures 29,787 intake and outcome records from 2021–2025, sourced from the City of Long Beach Animal Care Services open data portal. It includes 22 fields such as `intake_date`, `outcome_date`, `intake_condition`, `animal_type`, `outcome_type`, `dob`, and geolocation, providing a rich mix of categorical, date, and numeric variables.This project visualizes which intake scenarios and animal characteristics predict different outcomes, and how quickly animals find homes over time. By looking at a variety of visualizations, we hope to provide insight into how intake conditions and animal types affect the animal's outcome and then examine year-by-year shifts in both the number of adoptions and the speed with which animals find homes. This information could deliver actionable insights for shelter staff on resource allocation and policy planning.### Data CleaningBefore diving into our analyses, we perform several key data‐wrangling steps to ensure consistency and create the variables we need. First, we standardize the `intake_condition` text by trimming extra whitespace, replacing slashes with spaces, and converting to lowercase. Next, we collapse the many values of `animal_type` into a three-level factor—Dog, Cat, and Other—so we can directly compare these groups. We also calculate each animal’s age at intake (in years) from its date of birth, flagging missing values as “Unknown.” Finally, we derive `days_to_adoption` by subtracting `intake_date` from `outcome_date`, which sets us up to explore adoption timelines.```{r}#| label: data-cleaninglongbeach_clean <- longbeach |># title‐case intake_condition mutate(intake_condition = intake_condition |>str_squish() |>str_replace_all("/", " ") |>str_to_lower() |>str_to_title() ) |># title‐case animal_type for consistency mutate(animal_type = animal_type |>str_to_lower() |>str_to_title() ) |># species_group mutate(species_group =case_when( animal_type =="Dog"~"Dog", animal_type =="Cat"~"Cat",TRUE~"Other" ) |>factor(levels =c("Dog", "Cat", "Other")) ) |># age_at_intake & flag missing mutate(age_at_intake =as.numeric(intake_date - dob) /365,age_unknown =is.na(age_at_intake) ) |># days to adoption mutate(days_to_adoption =as.integer(outcome_date - intake_date) ) |># intake_year as a factor for plotting mutate(intake_year =factor(lubridate::year(intake_date), levels =2017:2024) )```#### Analysis of DataTo establish the rationale for combining `animal_type` into Dog, Cat, and Other, horizontal bar chart of the various values of `animal_type` are shown with color highlighting the grouping.```{r}#| label: data-analysis#| fig-width: 10#| fig-height: 7#| fig-retina: 1# clean datalongbeach_clean |>count(animal_type, species_group, sort =TRUE) |># plotggplot(aes(x = n, y =reorder(animal_type, n), fill = species_group)) +geom_col() +geom_text(aes(label = scales::comma(n)), # comma‐format the countshjust =-0.2,size =4 ) +scale_x_continuous(expand =expansion(mult =c(0, 0.082)),labels = scales::comma_format() ) +labs(title ="Animal Intakes by Type (Dog, Cat, Other)",subtitle ="Shelter intakes, 2017–2024",x ="Number of Intakes",y ="Animal Type",fill ="Species Group",caption ="Source: City of Long Beach Animal Care Services (TidyTuesday 2025-03-04)" ) +scale_fill_discrete(breaks =c("Cat", "Dog", "Other") ) +theme_minimal() +# themetheme(plot.title.position ="plot",plot.title =element_text(face ="bold", hjust =0.025, size =17),plot.subtitle =element_text(hjust =0.02, size =13),axis.text =element_text(size =12),axis.title =element_text(size =14),plot.caption =element_text(margin =margin(t =10), size =12),legend.position ="inside",legend.position.inside =c(0.87, 0.6),legend.background =element_rect(fill ="white", color ="grey80" ,linewidth =0.25),panel.grid.major =element_line(color ="grey95", linewidth =0.1),panel.grid.minor =element_line(color ="grey97", linewidth =0.05), )```## Question 1: How do intake conditions and animal types affect the animal's outcome?### Introduction:Animal shelters frequently intake a wide range of animals with different conditions. From scenarios such as healthy surrenders, injured or ill, or stray pickups. Understanding how these intake conditions affect the final outcomes across the three categorized animal types (dogs, cats, and others) is crucial. This analysis provides insights into which species may be underrepresented or disproportionately affected, helping shelter management and policymakers make informed decisions to improve animal care and resource allocation.### Approach:We will examine how `intake_condition` and `species_group` influence the likelihood of different outcomes for animals in the Long Beach shelter system. To simplify interpretation, the original `animal_type` variable has been recoded into a more general `species_group` category consisting of dogs, cats, and other species. This distinction allows us to focus on how outcomes differ not only by individual condition but also across species that historically experience different adoption rates and shelter outcomes.The outcome variable, originally containing 19 unique `outcome_type` values, has been consolidated into a new `outcome_category` with three meaningful groups: **adopted**, **death**, and **non-death**. This categorization captures critical differences in outcomes while reducing complexity. Through this approach, we aim to uncover patterns that reveal which species and intake conditions are associated with better or worse outcomes, providing actionable insights for shelter management and animal welfare efforts.### Analysis:```{r}#| label: q1-top-intake-conditions#| fig-width: 10#| fig-height: 7#| fig-retina: 1# top 6 intake conditions by count for each outcome categorytop_6_intake <- longbeach_clean |>mutate(outcome_category =case_when( outcome_type %in%c("adoption", "foster to adopt", "homefirst") ~"Adopted", outcome_type %in%c("euthanasia", "died", "disposal") ~"Death", outcome_type %in%c("rescue", "transfer", "return to owner", "shelter, neuter, return", "return to rescue", "transport", "community cat", "return to wild habitat", "foster", "trap, neuter, release", "missing", "NA", "duplicate") ~"Non-death",TRUE~"Non-death" )) |>filter(!is.na(intake_condition)) |>group_by(outcome_category, intake_condition) |>summarise(n =n(), .groups ="drop") |>group_by(outcome_category) |>slice_max(n, n =6) # plotggplot(top_6_intake, aes(x =reorder(intake_condition, n), y = n, fill = intake_condition)) +geom_col(show.legend =FALSE) +facet_wrap(~ outcome_category, scales ="free_y") +coord_flip() +scale_fill_brewer(palette ="Dark2") +labs(title ="Paths Begin at Intake: Which Conditions Influence Shelter Outcomes?",subtitle ="Top 6 Intake Conditions by Outcome Category",x ="Intake Condition",y ="Count",caption ="Source: City of Long Beach, CA Animal Care Services (TidyTuesday 2025-03-04)" ) +theme_minimal() +# themetheme(plot.title.position ="plot",plot.title =element_text(face ="bold", hjust =0.068, size =17),plot.subtitle =element_text(hjust =0.023, size =13),axis.text =element_text(size =11),axis.title.y =element_text(size =13),axis.title.x =element_text(margin =margin(t =9), size =13),strip.text =element_text(size =13,),plot.caption =element_text(margin =margin(t =10), size =12),panel.grid.major =element_line(color ="grey95", linewidth =0.1),panel.grid.minor =element_blank() )``````{r}#| label: q1-proportion-outcomes-per-animal#| fig-width: 10#| fig-height: 7#| fig-retina: 1# clean datalongbeach_clean |># mutate to Adopted, Death, Non-deathmutate(outcome_category =case_when( outcome_type %in%c("adoption", "foster to adopt", "homefirst") ~"Adopted", outcome_type %in%c("euthanasia", "died", "disposal") ~"Death", outcome_type %in%c("rescue", "transfer", "return to owner", "shelter, neuter, return", "return to rescue", "transport", "community cat", "return to wild habitat", "foster", "trap, neuter, release", "missing", "NA", "duplicate") ~"Non-death",TRUE~"Non-death" )) |>group_by(species_group, outcome_category) |>summarise(n =n(), .groups ="drop") |>group_by(species_group) |>mutate(prop = n /sum(n)) |># plotggplot(aes(x = outcome_category, y = prop, fill = species_group)) +geom_col(position =position_dodge(width =0.82),width =0.8,color ="white" ) +scale_y_continuous(labels =percent_format()) +scale_fill_brewer(palette ="Dark2") +# labelslabs(title ="A Stark Divide: The Uneven Landscape of Shelter Adoptions and Deaths",subtitle ="Proportion of Outcomes by Animal Type in California",y ="Proportion of Outcomes",x ="Outcomes",fill ="Species",caption ="Source: City of Long Beach, CA Animal Care Services (TidyTuesday 2025-03-04)" ) +theme_minimal() +# themetheme(plot.title.position ="plot",plot.caption.position ="plot", plot.title =element_text(face ="bold", hjust =0.1, size =17),plot.subtitle =element_text(hjust =0.025, size =12),axis.text =element_text(size =14),axis.title.y =element_text(margin =margin(r =15), size =14),axis.title.x =element_text(margin =margin(t =9), size =14),strip.text =element_text(size =13,),plot.caption =element_text(margin =margin(t =15), size =12),panel.grid.major =element_line(color ="grey95", linewidth =0.1),panel.grid.minor =element_blank(),legend.text =element_text(size =13),legend.title =element_text(size =14) )```### Discussion:The shelter outcome data reveals a clear disparity in how different species fare once admitted. Dogs and cats make up the majority of the shelter population, they are significantly more likely to be adopted compared to other species. This disproportionate rate of adoptions suggests that dogs and cats dominate intake numbers and benefit from greater public interest and adoption opportunities.Conversely, animals categorized outside of dogs and cats, such as rabbits, birds, reptiles, and other small animals—experience far fewer adoptions and notably higher death rates. Despite representing a smaller share of shelter intakes, these species face worse outcomes, highlighting an underrepresented group that is more vulnerable within the shelter system.Furthermore, intake conditions play a critical role in shaping these outcomes. As seen in the "Paths Begin at Intake:.." plot, animals arriving in favorable conditions, such as mild or moderate illness or injury, often translate into higher adoption rates. Meanwhile, when arriving in moderate or severe conditions, face greater barriers to positive outcomes. These patterns emphasize the need for more targeted intervention and outreach to improve the fate of non-dog and non-cat species within the shelter environment.## Question 2: How Have Adoption Volumes and Timelines Evolved (2017–2024) Across Dogs, Cats, and Other Species?### Introduction:Understanding how both the volume of adoptions and the speed at which animals leave the shelter have shifted from 2017 through 2024 is important for effective capacity planning and resource management. Looking at these trends out by Dogs, Cats, and Other species groups also lets us assess the impact of recent outreach and medical initiatives and inform future program investments.### Approach:The first plot shows, for each species group, how adoption volumes and delay distributions have shifted annually from 2017 through 2024. The grey bars (right‐axis scale) represent the total count of adoptions each year (scaled to the 95th percentile), while the blue violins (left‐axis scale) depict the full distribution of days-to-adoption, with dark points marking the median.The second visualization consists of bubble chart plots, for each species group, the year‐to‐year relationship between the speed of adoptions (median days to adoption on the y-axis) and the volume of adoptions (bubble size). By faceting Dogs, Cats, and Other vertically, you can see how median wait times and total placements have moved in tandem from 2017 through 2024.### Analysis:```{r}#| label: q2-violin-plot#| fig-width: 10#| fig-height: 7#| fig-retina: 1adopt_df <- longbeach_clean |>filter(outcome_type =="adoption", !is.na(days_to_adoption)) |>mutate(intake_year =year(intake_date))# adoption data for 2017–2024adopt_df_full <- longbeach_clean |>filter( outcome_type =="adoption",!is.na(days_to_adoption), days_to_adoption >=0 ) |># derive a numeric year for filteringmutate(intake_year_num =year(intake_date)) |>filter(intake_year_num >=2017, intake_year_num <=2024) |># then turn it into a factor for the x-axismutate(intake_year =factor(intake_year_num, levels =2017:2024)) # compute the 95th percentile of days_to_adoptionp95 <-quantile(adopt_df_full$days_to_adoption, 0.95, na.rm =TRUE)# compute counts per year & species for bar fillscount_df <- adopt_df_full |>count(species_group, intake_year, name ="n_adopt")# scaling factorscaleFact <- p95 /max(count_df$n_adopt)# plotggplot() +# bgeom_col(data = count_df,aes(x = intake_year, y = n_adopt * scaleFact, fill ="Number of adoptions"),width =0.6,alpha =0.7 ) +# violinsgeom_violin(data = adopt_df_full,aes(x = intake_year, y = days_to_adoption, fill ="Days to adoption"),trim =FALSE, color =NA,alpha =0.5 ) +# mediansstat_summary(data = adopt_df_full,aes(x = intake_year, y = days_to_adoption, color ="Median days"),fun = median,geom ="point",size =3 ) +facet_wrap(~ species_group, ncol =1, scales ="fixed") +scale_x_discrete(drop =FALSE) +scale_fill_manual(name =NULL,values =c("Days to adoption"="skyblue","Number of adoptions"="grey80" ),breaks =c("Days to adoption", "Number of adoptions"),guide =guide_legend(order =1) ) +scale_color_manual(values =c("Median days"="darkblue"),guide =guide_legend(order =2, override.aes =list(size =4)),name =NULL ) +scale_y_continuous(name ="Days to Adoption",labels =comma_format(),expand =c(0, 0),sec.axis =sec_axis(~ . / scaleFact,name ="Number of Adoptions",labels =comma_format() ) ) +coord_cartesian(ylim =c(0, p95)) +# labelslabs(title ="Adoption Delays and Counts by Year and Species Group",subtitle ="Violin = full days-to-adoption distribution; dots = median (2017–2024), zoomed to the 95th percentile",x ="Intake Year",caption ="Source: City of Long Beach, CA Animal Care Services (TidyTuesday 2025-03-04)" ) +theme_minimal() +# themetheme(plot.title.position ="plot",plot.caption.position ="plot", panel.spacing.y =unit(0.8, "lines"),panel.grid.major =element_line(color ="grey95", linewidth =0.1),panel.grid.minor =element_blank(),legend.position ="top",legend.direction ="horizontal",legend.text =element_text(size =12),plot.title =element_text(face ="bold", hjust =0.03, size =18),plot.subtitle =element_text(hjust =0.09, size =14),plot.caption =element_text(margin =margin(t =15), size =12),strip.text =element_text(size =13),axis.title.y =element_text(margin =margin(r =15), size =14),axis.title.x =element_text(margin =margin(t =9), size =14),axis.title.y.right =element_text(margin =margin(l =15)),axis.text =element_text(size =12), )``````{r}#| label: q2-timeseries-plot#| fig-width: 10#| fig-height: 7#| fig-retina: 1# clean databubble_df <- longbeach_clean |>filter(outcome_type =="adoption", !is.na(days_to_adoption)) |>mutate(intake_year =year(intake_date)) |>filter(intake_year >=2017, intake_year <=2024) |>group_by(species_group, intake_year) |>summarise(median_days =median(days_to_adoption, na.rm =TRUE),n_adopt =n(),.groups ="drop" )# plotggplot(bubble_df, aes(x = intake_year, y = median_days)) +geom_line(aes(group =1), color ="grey50", linewidth =0.5) +geom_point(aes(size = n_adopt),fill ="skyblue",color ="#6BAED6",shape =21,alpha =0.8) +facet_wrap(~ species_group, ncol =1, scales ="free_y") +scale_x_continuous(breaks =2017:2024) +scale_y_continuous(name ="Median Days to Adoption",expand =expansion(add =c(5, 5)) # 5-day padding below ) +scale_size_area(name ="Volume", # rename legend titlebreaks =c(200, 400, 600), # show just a few reference sizesmax_size =12 ) +labs(title ="Adoption Speed vs. Volume Over Time",subtitle ="Median days-to-adoption & adoption count by species group (2017–2024)",x ="Intake Year",caption ="Source: City of Long Beach, CA Animal Care Services (TidyTuesday 2025-03-04)" ) +theme_minimal() +# themetheme(plot.title.position ="plot",plot.caption.position ="plot", plot.title =element_text(face ="bold", hjust =0.03, size =18),plot.subtitle =element_text(hjust =0.045, size =14),panel.grid.major =element_line(color ="grey95", linewidth =0.1),panel.grid.minor =element_blank(),plot.caption =element_text(margin =margin(t =15), size =12),strip.text =element_text(size =13),axis.title.y =element_text(margin =margin(r =15), size =14),axis.title.x =element_text(margin =margin(t =9), size =14),axis.title.y.right =element_text(margin =margin(l =15)),axis.text =element_text(size =12), )```### Discussion:The plots show a clear pandemic‐era dip in adoptions, followed by a strong post‐2020 rebound. Dog adoptions surged from roughly 100 in 2020 to over 600 by 2023–24, with cats exhibiting a similar rebound and “Other” species peaking around 200 placements.Despite these volume swings, median wait times held steady or improved compared to pre-pandemic levels, representing a true dual gain for the shelter: higher throughput and faster turnover. Dogs remain the quickest to re-home, cats exhibit a broader distribution with some long-stay outliers, and “Other” species continue to show the greatest year-to-year variability. The broader distribution for cats is not surprising as more adoptions suggest a broader variety of time to adoption–it is impressive that dogs did not show the same increase even though their adoption numbers increased as well.These improvements speak to the shelter's focus on improving outcomes for their animals. It is a reflection of staff, volunteer, and supporter dedication to the lives of pets and their owners.## CitationsAI was used for assistance in this project. It was used for code clarification, exception explanations, and discussions on how lubridate, scales, and other packages operate. Code snippets were used only when unable to resolve an issue independently. All text is written exclusively by the team.