Nearshore โ offshore sections, automatically drawn for every line and cruise
A transect is one CalCOFI line, ordered by station number ascending โ nearshore to offshore. No start and end station to pick, which is what lets every line ร cruise be drawn automatically. Deliberately not the order stations were occupied: that is the ship's track, so its direction is whichever way the ship steamed, and it is missing on roughly half the database's cast records.
Values are averaged into 5 m depth bins to 500 m. CTD sensors sample continuously, so binning is not merely compression โ grouping by exact depth would deduplicate almost nothing, and the native-resolution jaggedness is sensor precision rather than signal. The colour field between stations is interpolated by the plotting library for legibility; only the station columns are measurements.
By default the x-axis measures between the stations this cruise actually occupied, so the section fills the plot and the data is as large as it can be. Comparable x-axis instead measures each station's distance along the full line, so two cruises that sampled different extents are directly comparable in width โ at the cost of blank space where a cruise stopped short.
This is not cosmetic. Line 93.3 has not been sampled past station 90 since January 2025, though 113 of the 130 cruises before that reached station 120. Under the default ruler a recent section is drawn the same width as a historical one covering far more ocean, and comparing the two by eye overstates recent gradients.
The climatology is a plain mean per station, 5 m depth bin and calendar month across the baseline years โ the finest grouping CalCOFI's sampling design supports, since quarterly-ish cruises over decades give many years per calendar month at a station but only a handful of days. The anomaly is the measured value minus that mean.
Rudnick et al. (2017) fit annual and semiannual harmonics for the CUGN glider climatology, which suits near-continuous glider sampling. CalCOFI's is episodic and unevenly spaced, so a monthly mean is used instead: defensible, and legible enough that a reader can say exactly what the anomaly is a departure from.
A cell whose baseline has fewer than the minimum number of observations is left blank, not zero. An unsampled baseline is not a zero anomaly, and colouring it "normal" would claim knowledge of somewhere never measured. Blank areas in the anomaly view are therefore gaps in the baseline, not in this cruise.
Each cruise carries the stage of the CTD product it came from. The two preliminary tiers are different in a way that matters: a CTD-only cruise has not been through the bottle merge, so the bottle-corrected salinity, oxygen and chlorophyll do not exist for it and the uncorrected sensor series are shown instead. A CTD & bottle cruise has been merged but may still change after post-cruise calibration.
Everything above is built by two scripts, run weekly and on each database
release:
build_sections.sql
(extraction, binning, climatology, anomaly) and
build_sections.py
(reshaping to the matrices this page draws). The same definitions are
available in R as
calcofi4r's
cc_transect_section(), cc_climatology() and
cc_anomaly(), for anyone who would rather work from the
database directly.