How observation patterns reveal seasonal stopover behavior (1994-2024)
#TidyTuesday
Author
Aditya Dahiya
Published
October 5, 2025
About the Data
This dataset documents crane observations at Lake Hornborgasjön in Västergötland, Sweden, spanning over 30 years of migration patterns. The data comes from dedicated crane counters at the Hornborgasjön field station, who have systematically recorded crane populations during spring and fall migrations. The timing of peak crane presence varies depending on weather conditions—particularly the arrival of spring and favorable southerly winds that support crane flight. The dataset includes daily observation counts, dates, and important contextual notes from counting officials, such as records of bad weather, canceled counts, seasonal milestones (first and last counts), record observations, severe interference, and uncertain counts. Weather disruptions are specifically flagged when original comments mention conditions like fog, rain, snow, thunder, or other adverse weather. This rich historical record enables analysis of population trends, seasonal patterns, and the relationship between crane migration and weather conditions. More information about crane statistics can be found on the Hornborgasjön website.
Figure 1: Visualization shows mean crane observations by weekday (y-axis), faceted by month (columns) and decade (rows). Bar length represents average observation count for each day-month-decade combination, with numeric labels showing exact values. Spring months (March-April) display comprehensive daily monitoring across all seven weekdays, while autumn months (August-October) show strategic sampling on selected days only. Growing bar lengths across decades indicate increasing observation frequencies. Colors distinguish weekdays using the Ghibli PonyoDark palette. Data: Hornborgasjön field station crane counts (1994-2024). Missing bars indicate no observations recorded for that weekday-month combination.
How I Made This Graphic
Loading required libraries
Code
pacman::p_load( tidyverse, # All things tidy scales, # Nice Scales for ggplot2 fontawesome, # Icons display in ggplot2 ggtext, # Markdown text support for ggplot2 showtext, # Display fonts in ggplot2 colorspace, # Lighten and Darken colours patchwork # Composing Plots)cranes <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-09-30/cranes.csv')
Visualization Parameters
Code
# Font for titlesfont_add_google("Saira",family ="title_font")# Font for the captionfont_add_google("Saira Condensed",family ="body_font")# Font for plot textfont_add_google("Saira Extra Condensed",family ="caption_font")showtext_auto()# A base Colourbg_col <-"white"seecolor::print_color(bg_col)# Colour for highlighted texttext_hil <-"grey40"seecolor::print_color(text_hil)# Colour for the texttext_col <-"grey30"seecolor::print_color(text_col)line_col <-"grey30"# Define Base Text Sizebts <-80# Get the actual colors from chosen paletteday_colors <- paletteer::paletteer_d("ghibli::PonyoDark", n =7)names(day_colors) <-c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")# Caption stuff for the plotsysfonts::font_add(family ="Font Awesome 6 Brands",regular = here::here("docs", "Font Awesome 6 Brands-Regular-400.otf"))github <-""github_username <-"aditya-dahiya"xtwitter <-""xtwitter_username <-"@adityadahiyaias"social_caption_1 <- glue::glue("<span style='font-family:\"Font Awesome 6 Brands\";'>{github};</span> <span style='color: {text_hil}'>{github_username} </span>")social_caption_2 <- glue::glue("<span style='font-family:\"Font Awesome 6 Brands\";'>{xtwitter};</span> <span style='color: {text_hil}'>{xtwitter_username}</span>")plot_caption <-paste0("**Data:** Hornborgasjön field station"," | **Code:** ", social_caption_1," | **Graphics:** ", social_caption_2)rm( github, github_username, xtwitter, xtwitter_username, social_caption_1, social_caption_2)# Add text to plot-------------------------------------------------plot_title <-"Crane Observation Patterns\nLake Hornborgasjön (1994–2024)"plot_subtitle <- glue::glue("Systematic crane monitoring occurs daily (<span style='color:{day_colors['Mon']}'>Mon</span>-<span style='color:{day_colors['Sun']}'>Sun</span>) during the intense <b>March-April</b> spring migration<br>","when thousands gather at this critical stopover. Starting in the 2000s, <b>autumn counts</b> expanded to track southward<br>","migration, but occur selectively—only on <span style='color:{day_colors['Mon']}'>Mon</span>, <span style='color:{day_colors['Tue']}'>Tue</span>, and <span style='color:{day_colors['Thu']}'>Thu</span> in the 2010s, and <span style='color:{day_colors['Mon']}'>Mon</span> and <span style='color:{day_colors['Thu']}'>Thu</span> in the 2020s—<br>","reflecting the more dispersed nature of fall passage. Three decades reveal steadily rising observations.")str_view(plot_subtitle)
# Saving a thumbnaillibrary(magick)# Saving a thumbnail for the webpageimage_read(here::here("data_vizs","tidy_crane_observations.png")) |>image_resize(geometry ="x400") |>image_write( here::here("data_vizs","thumbnails","tidy_crane_observations.png" ) )