Show Effort

The CalCOFI grid (cc_grid) and centroids (cc_grid_ctrs) show the CalCOFI Station Positions – CalCOFI at varying separation distances of station positions (sta_dpos) in the CalCOFI coordinate system from nearshore (5), to offshore (10) to outside the 113 extended station pattern to historically visited areas (20).

This allows summarization of effort within each station and defining a study area according to these criteria (e.g., sta_dpos).

Grid by Zone

library(calcofi4r)
library(dplyr)
library(mapview)
library(sf)
library(stars)

mapview(cc_grid, zcol="zone_key") +
  mapview(cc_grid_ctrs, cex = 1)

Summarize Temperature from Bottle Data

# show first 6 rows of example data frame with temperature in space as variable
head(cc_bottle)
#> # A tibble: 6 × 10
#>     lon   lat date       quarter depth_m sta_dpos t_degc salinity o2sat       n
#>   <dbl> <dbl> <date>       <int>   <dbl>    <dbl>  <dbl>    <dbl> <dbl> <int64>
#> 1 -134.  42.5 1972-05-16       2       0       20  11.2      32.9  109        1
#> 2 -134.  42.5 1972-05-16       2      10       20  11.2      32.9  109.       1
#> 3 -134.  42.5 1972-05-16       2      20       20  10.9      32.9  110.       1
#> 4 -134.  42.5 1972-05-16       2      30       20  10.6      32.9  110        1
#> 5 -134.  42.5 1972-05-16       2      50       20   9.97     32.9  108.       1
#> 6 -134.  42.5 1972-05-16       2      55       20   9.83     32.9  107.       1

# summarize temperature by location and convert to points
d_t <- cc_bottle %>% 
  filter(
    !is.na(t_degc)) %>% 
  group_by(lon, lat) %>% 
  summarize(
    n = n(),
    v = mean(t_degc),
    .groups = "drop") %>% 
  st_as_sf(
    coords = c("lon", "lat"), remove = F,
    crs = 4326)

Show Effort by Grid Cell

n_ply <- cc_grid %>% 
  st_join(d_t) %>% 
  group_by(sta_key) %>% 
  summarize(
    n = sum(n))
mapview(n_ply, zcol="n", layer.name = "n")

Show Effort by Grid Point

n_pts <- cc_grid_ctrs %>% 
  left_join(
    n_ply %>% 
      st_drop_geometry() %>% 
      select(sta_key, n),
    by = "sta_key")
mapview(n_pts, cex="n", layer.name = "n")

Map contours

You can map the contours of input data using the faster, rougher Inverse-Distance Weighting (IDW; pts_to_rast_idw(), rast_to_contours()) technique or the slower, smoother Generalized Additive Model (GAM; pts_to_contours_gam()).

All Zones

# interpolate points to raster using IDW
r_k_all <- pts_to_rast_idw(d_t, "v", cc_grid_zones)
mapView(st_as_stars(r_k_all))
# generate contour polygons from raster
p_k_all <- rast_to_contours(r_k_all, cc_grid_zones)
mapView(p_k_all, zcol = "z_avg")

Standard and Extended Station Pattern Zones

aoi_ext <- cc_grid_zones |> 
  filter(
    sta_pattern %in% c("standard", "extended"))

# interpolate points to raster using IDW
r_k_ext <- pts_to_rast_idw(d_t, "v", aoi_ext)
mapView(st_as_stars(r_k_ext), layer.name="Temp.(C)")
# generate contour polygons from raster
p_k_ext <- rast_to_contours(r_k_ext, aoi_ext)
mapView(p_k_ext, zcol = "z_avg", layer.name="Temp.(C)")

Standard Nearshore Zone

aoi_stdnr <- cc_grid_zones %>% 
  filter(
    sta_pattern  == "standard",
    sta_shore    == "nearshore")

# interpolate points to raster using IDW
r_k_stdnr <- pts_to_rast_idw(d_t, "v", aoi_stdnr)
mapView(st_as_stars(r_k_stdnr), layer.name="Temp.(C)")
# generate contour polygons from raster
p_k_stdnr <- rast_to_contours(r_k_stdnr, aoi_stdnr)
mapView(p_k_stdnr, zcol = "z_avg", layer.name="Temp.(C)")

Plot Time Series

Plot time series of an oceanographic variable from CTD cast bottle data.

# get variables
(v <- get_variables())
#> # A tibble: 4 × 6
#>   category      table_field       plot_title plot_label plot_color color_palette
#>   <chr>         <chr>             <chr>      <chr>      <chr>      <chr>        
#> 1 Oceanographic ctd_bottles.sali… Salinity   Salinity … purple     Purples      
#> 2 Oceanographic ctd_bottles.o2sat Oxygen Sa… Oxygen pe… blue       Blues        
#> 3 Oceanographic ctd_bottles.t_de… Temperatu… Temperatu… red        Reds         
#> 4 Oceanographic ctd_bottles_dic.… Dissolved… DIC (µmol… brown      YlOrBr

# fetch time series data for the first variable from CalCOFI API
(d <- get_timeseries("ctd_bottles.t_degc"))
#> # A tibble: 71 × 4
#>     year val_avg val_sd n_obs
#>    <dbl>   <dbl>  <dbl> <dbl>
#>  1  1949    9.12   4.68 28081
#>  2  1950    9.12   4.37 38298
#>  3  1951    9.19   4.54 40459
#>  4  1952   10.4    4.03 31690
#>  5  1953   10.6    3.71 29789
#>  6  1954   10.8    4.33 18874
#>  7  1955   10.1    4.71 23248
#>  8  1956   11.2    4.41 14274
#>  9  1957   13.0    5.04 19072
#> 10  1958   12.1    4.71 24324
#> # ℹ 61 more rows

# plot time series with the first variable
with(v[1,],
  plot_timeseries(
    # data and columns (from d)
    d, year, val_avg, val_sd,
    # plot attributes (from v)
    plot_title, plot_label, plot_color))

Plot Depth

Plot depth of an oceanographic variable from CTD cast bottle data.

head(bottle_temp_depth)
#> # A tibble: 6 × 3
#> # Groups:   cast_count [1]
#>   cast_count depth_m     v
#>        <int>   <dbl> <dbl>
#> 1      12874       0  15.5
#> 2      12874       8  14.8
#> 3      12874      10  14.7
#> 4      12874      20  14.2
#> 5      12874      23  14.2
#> 6      12874      30  14.2

# plot depth with the station data
plot_depth(df = bottle_temp_depth, variable = "Temperature")