Peregrine Falcons

code
Author

Nikhita Purohit, Ihina Purohit, Rishi Joseph

Published

October 20, 2025

Peregrine Falcons

Studying Migration Patterns of Peregrine Falcons from 1973-75

1. Setting up R Packages

library(rnaturalearth)
library(rnaturalearthdata)

# Run this in your console first
# devtools::install_github("ropensci/rnaturalearthhires")
library(rnaturalearthhires)

# Plotting Maps
library(tidyverse) # Maps using ggplot() + geom_sf()
library(ggformula) # Maps using gf_sf()
library(tmap) # Thematic Maps, static and interactive
library(tmaptools)
library(tmap.mapgl)
library(osmdata) # Fetch map data from osmdata.org
library(sfheaders) # Handcrafted Map data
## Interactive Maps
library(leaflet) # interactive Maps
library(leaflet)
library(leaflet.providers)
library(leaflet.extras)
library(threejs) # Globe maps in R. Part of the htmlwidgets family of packages

# For Spatial Data Frame Processing
library(sf)
library(sfheaders)

2. Reading the data

lines <- st_read("C:/Users/puron/OneDrive/Documents/Project Blog/posts/data/peregrine_data/lines.shp")
Reading layer `lines' from data source 
  `C:\Users\puron\OneDrive\Documents\Project Blog\posts\data\peregrine_data\lines.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 3 features and 1 field
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: -88.70584 ymin: 26.96268 xmax: -81.91663 ymax: 43.65758
Geodetic CRS:  WGS 84
points <- st_read("C:/Users/puron/OneDrive/Documents/Project Blog/posts/data/peregrine_data/points.shp")
Reading layer `points' from data source 
  `C:\Users\puron\OneDrive\Documents\Project Blog\posts\data\peregrine_data\points.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 169 features and 11 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -88.70584 ymin: 26.96268 xmax: -81.91663 ymax: 43.65758
Geodetic CRS:  WGS 84
head(lines)
Simple feature collection with 3 features and 1 field
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: -88.70584 ymin: 26.96268 xmax: -81.91663 ymax: 43.65758
Geodetic CRS:  WGS 84
                                         name                       geometry
1 Peregrine #1 Lafayette Sept 73-Peregrine #1 LINESTRING (-87.78953 43.56...
2 Peregrine #4 Fort Knox Sept 75-Peregrine #4 LINESTRING (-87.77338 43.60...
3    Peregrine #5 Florida Oct 75-Peregrine #5 LINESTRING (-87.83723 43.43...
head(points)
Simple feature collection with 6 features and 11 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -87.87108 ymin: 43.41047 xmax: -87.78953 ymax: 43.56768
Geodetic CRS:  WGS 84
            timestamp      long      lat
1 1973-09-20 14:35:00 -87.78953 43.56768
2 1973-09-20 14:40:00 -87.79876 43.54291
3 1973-09-20 14:45:00 -87.80587 43.49956
4 1973-09-20 14:52:00 -87.80594 43.49399
5 1973-09-20 14:56:00 -87.83079 43.49853
6 1973-09-20 15:00:00 -87.87108 43.41047
                                                                                                        comments
1 Release location Peregrine #1:Immature male 587 g:Trapped in Cedar Grove Hawk Research Station:Wind N at 5 MPH
2                                                                                                           <NA>
3                        Altitude 120 m above ground:Soaring - gains altitude:Circling and then gliding ro south
4                                                                                                           <NA>
5                                                                      20/9/1973 10:58 bird losing altitude fast
6                                                  Bird is 160 degrees magnetic compass direction:Gaining height
         sensor_typ       individual    tag_ident
1 radio-transmitter Falco peregrinus Peregrine #1
2 radio-transmitter Falco peregrinus Peregrine #1
3 radio-transmitter Falco peregrinus Peregrine #1
4 radio-transmitter Falco peregrinus Peregrine #1
5 radio-transmitter Falco peregrinus Peregrine #1
6 radio-transmitter Falco peregrinus Peregrine #1
                       ind_ident
1 Peregrine #1 Lafayette Sept 73
2 Peregrine #1 Lafayette Sept 73
3 Peregrine #1 Lafayette Sept 73
4 Peregrine #1 Lafayette Sept 73
5 Peregrine #1 Lafayette Sept 73
6 Peregrine #1 Lafayette Sept 73
                                       study_name date time
1 Bill Cochran Peregrine falcon migration 1973-75 <NA> <NA>
2 Bill Cochran Peregrine falcon migration 1973-75 <NA> <NA>
3 Bill Cochran Peregrine falcon migration 1973-75 <NA> <NA>
4 Bill Cochran Peregrine falcon migration 1973-75 <NA> <NA>
5 Bill Cochran Peregrine falcon migration 1973-75 <NA> <NA>
6 Bill Cochran Peregrine falcon migration 1973-75 <NA> <NA>
                    geometry
1 POINT (-87.78953 43.56768)
2 POINT (-87.79876 43.54291)
3 POINT (-87.80587 43.49956)
4 POINT (-87.80594 43.49399)
5 POINT (-87.83079 43.49853)
6 POINT (-87.87108 43.41047)
st_geometry_type(lines)
[1] LINESTRING LINESTRING LINESTRING
18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE
st_geometry_type(points)
  [1] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
 [13] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
 [25] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
 [37] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
 [49] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
 [61] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
 [73] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
 [85] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
 [97] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
[109] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
[121] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
[133] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
[145] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
[157] POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT POINT
[169] POINT
18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE

3. Plotting the migration patterns

ggplot() +
  geom_sf(data = lines, color = "black", 
          linewidth = 0.025) +  
  geom_sf(data = points, color = 'palevioletred', linewidth = 0.5) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

4. Migration patterns of 3 peregrine falcons

ggplot() +
  geom_sf(data = lines,aes(color = name),  
          linewidth = 1) +
  labs(color = "Peregrines") +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

Inferences

All three falcons follow a general north-to-south migration pattern through central North America.The clustering of points suggests that there are multiple stopover sites where falcons remained stationary for extended periods.

Peregrine #5 shows the longest and most extensive migration, traveling the farthest south. Peregrine #1 has a much shorter route, primarily clustered in the northern portion around. Peregrine #4 shows an intermediate pattern with looping behaviour, this suggests that the bird was flying within a relatively small area rather than continuing its southward migration.

Assumptions: - There were favourable hunting grounds - Energy conservation - It was waiting for favorable migration conditions

5. Plotting the migration patterns on the world map

ggplot() +
  geom_sf(data = World, fill = "grey90", color = "black") +
  geom_sf(data = lines, color = "black", linewidth = 0.5) +
  geom_sf(data = points, color = "palevioletred", size = 0.2) +
  coord_sf() +
  labs(title = "Peregrine Falcon Migration (1973–75)",
       subtitle = "Bill Cochran Study | Source: Movebank") +
  theme_minimal()

ggplot() +
  geom_sf(data = World, fill = "grey90", color = "black") +
  geom_sf(data = lines,aes(color = name),  
          linewidth = 0.5) +
  labs(color = "Peregrines") +
  coord_sf() +
  labs(title = "Peregrine Falcon Migration (1973–75)",
       subtitle = "Bill Cochran Study | Source: Movebank") +
  theme_minimal()

6. Plotting the migration patterns on the United States of America

ggplot() +
  geom_sf(data = World %>% filter(name=="United States of America"),
          fill = "grey90", color = "black") +
  geom_sf(data = lines, color = "black", linewidth = 0.5) +
  geom_sf(data = points, color = "palevioletred", size = 0.3) +
  coord_sf() +
  labs(title = "Peregrine Falcon Migration (1973–75)",
       subtitle = "Bill Cochran Study | Source: Movebank") +
  theme_minimal()

ggplot() +
  geom_sf(data = World %>% filter(name=="United States of America"),
          fill = "grey90", color = "black") +
  geom_sf(data = lines,aes(color = name),  
          linewidth = 0.6) +
  labs(color = "Peregrines") +
  coord_sf() +
  labs(title = "Peregrine Falcon Migration (1973–75)",
       subtitle = "Bill Cochran Study | Source: Movebank") +
  theme_minimal()

Inferences

This shows us that all migration occurs within the central United States. The migration corridor appears to avoid both coasts, staying inland.

7. Plotting the migration patterns on the United States of America for each year

points_modified <- points %>%
  mutate(
    year = year(ymd_hms(timestamp)),
    year_category = case_when(
      year == 1973 ~ "Year_73",
      year == 1974 ~ "Year_74",
      year == 1975 ~ "Year_75",
      TRUE ~ "Other"
    )
  )

Migration patterns in 1973

ggplot() +
  geom_sf(data = World %>% filter(name=="United States of America"),
          fill = "grey90", color = "black") +
  geom_sf(data = points_modified %>% filter(year==1973),
          aes(color = tag_ident), size = 0.5) +
  labs(color = "Peregrines") +
 theme(
    axis.text.x = element_text(angle = 45, hjust =2 )
  ) +
  coord_sf() +
  labs(title = "Peregrine Falcon Migration (1973)",
       subtitle = "Bill Cochran Study | Source: Movebank") +
  theme_minimal()

Migration patterns in 1974

ggplot() +
  geom_sf(data = World %>% filter(name=="United States of America"),
          fill = "grey90", color = "black") +
  geom_sf(data = points_modified %>% filter(year==1974),
          aes(color = tag_ident), size = 0.5) +
  labs(color = "Peregrines") +
 theme(
    axis.text.x = element_text(angle = 45, hjust =2 )
  ) +
  coord_sf() +
  labs(title = "Peregrine Falcon Migration (1974)",
       subtitle = "Bill Cochran Study | Source: Movebank") +
  theme_minimal()

Migration patterns in 1975

ggplot() +
  geom_sf(data = World %>% filter(name=="United States of America"),
          fill = "grey90", color = "black") +
  geom_sf(data = points_modified %>% filter(year==1975),
          aes(color = tag_ident), size = 0.5) +
  labs(color = "Peregrines") +
 theme(
    axis.text.x = element_text(angle = 45, hjust =2 )
  ) +
  coord_sf() +
  labs(title = "Peregrine Falcon Migration (1975)",
       subtitle = "Bill Cochran Study | Source: Movebank") +
  theme_minimal()

Inferences

Only plotted points (resting locations) and not lines (movement) as there is no time stamp for it.

1973: Only one falcon rested, concentrated in a small area in the central United States. Assumption: It completed its migration.

1974: No falcons rested?? Or no falcons tracked?

1975: Both birds showed multiple rest stops along the migration corridor, indicating staged migration strategy. We can assume that bird 1 has completed its migration in 1973 itself.

The spacing between points suggest that falcons migrate in stages rather than continuously.