library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.2
## Warning: package 'tibble' was built under R version 4.5.2
## Warning: package 'tidyr' was built under R version 4.5.2
## Warning: package 'readr' was built under R version 4.5.2
## Warning: package 'purrr' was built under R version 4.5.2
## Warning: package 'dplyr' was built under R version 4.5.2
## Warning: package 'forcats' was built under R version 4.5.2
## Warning: package 'lubridate' was built under R version 4.5.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.6
## ✔ forcats   1.0.1     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.2     ✔ tibble    3.3.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.2
## ✔ purrr     1.2.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.5.2
library(dplyr)
library(sf)
## Warning: package 'sf' was built under R version 4.5.2
## Linking to GEOS 3.13.1, GDAL 3.11.4, PROJ 9.7.0; sf_use_s2() is TRUE
library(rgbif)
## Warning: package 'rgbif' was built under R version 4.5.2
library(elevatr)
## Warning: package 'elevatr' was built under R version 4.5.2
## elevatr v0.99.0 NOTE: Version 0.99.0 of 'elevatr' uses 'sf' and 'terra'.  Use 
## of the 'sp', 'raster', and underlying 'rgdal' packages by 'elevatr' is being 
## deprecated; however, get_elev_raster continues to return a RasterLayer.  This 
## will be dropped in future versions, so please plan accordingly.
library(raster)
## Warning: package 'raster' was built under R version 4.5.2
## Loading required package: sp
## Warning: package 'sp' was built under R version 4.5.2
## 
## Attaching package: 'raster'
## 
## The following object is masked from 'package:dplyr':
## 
##     select
library(climateR)
## 
## Attaching package: 'climateR'
## 
## The following object is masked from 'package:readr':
## 
##     parse_date
## 
## The following object is masked from 'package:graphics':
## 
##     plot
## 
## The following object is masked from 'package:base':
## 
##     plot
library(terra)
## Warning: package 'terra' was built under R version 4.5.2
## terra 1.8.93
## 
## Attaching package: 'terra'
## 
## The following object is masked from 'package:tidyr':
## 
##     extract

Data Preparation

bunting <- occ_download_get(key = "0014611-260226173443078", overwrite = TRUE) %>% 
    occ_download_import(bunting_download, na.strings = c("", NA))
## Download file size: 41.36 MB
## On disk at C:\Users\deird\Downloads\0014611-260226173443078.zip
bunting_clear <- bunting %>%
  rename(latitude = decimalLatitude, longitude = decimalLongitude)
bunting_clear$season <- ifelse(bunting_clear$month %in% c('5','6','7','8','9'), "Summer", "Winter")

Leaflet Mapping

#Smaller section of data used, full dataset caused RStudio to freeze
test_bunting <- bunting_clear %>%
  sample_n(2000)
winter_bunting <- test_bunting %>%
  filter(season == "Winter")
summer_bunting <- test_bunting %>%
  filter(season == "Summer")

temp_rast <- rast("temp_f.nc")

test_map <- leaflet() %>% 
  addTiles() %>% 
  addProviderTiles(providers$OpenTopoMap) %>%
  addCircleMarkers(data = winter_bunting, ~longitude, ~latitude,
                   color = "blue", fillOpacity = 1, radius = 2, group = "Winter") %>%
  addCircleMarkers(data = summer_bunting, ~longitude, ~latitude,
                   color = "darkgreen", fillOpacity = 1, radius = 2, group = "Summer") %>%
  addRasterImage(temp_rast, colors = "inferno", opacity = 0.8, group = "Temperature") %>%
  addLayersControl(
    overlayGroups = c("Summer","Winter","Temperature"),
    options = layersControlOptions(collapsed = FALSE)) %>%
  addLegend("bottomleft", title = "Elevation",
            pal = colorNumeric(palette = c("lightgreen", "green", "darkgreen", "yellow", "orange", "red"), domain = c(0, 2000)),
            values = c(0, 2000),
            labels = c("0-200m", "201-400m", "401-600m", "601-800m", "801-1000m", "1001-2000m"),opacity = 1)%>%
  addMarkers(ln = -77.0369, lat = 38.9073, label = "Washington DC") %>%
  addMarkers(ln = -75.1652, lat = 39.9526, label = "Philadelphia") %>%
  addMarkers(ln = -74.0060, lat = 40.7128, label = "New York")
test_map

I made the winter and summer observations different colors and grouped them so they could be viewed separately, which makes the change in range because of seasonal migration clear. A smaller subset of the total data was used as using the whole dataset caused RStudio to freeze and become unusable.