Fraser River Discharge Data

Andrew Edwards

Last rendered on 15 July, 2025

library(pacea)
library(dplyr)
library(tibble)  # Else prints all of a tibble
library(ggplot2)

Fraser River discharge data sets

The Fraser River is the longest river in British Columbia and one of the most important waterways in western Canada. Fraser River discharge is particularly significant for salmon populations, as it is an important determinant of survival for Fraser River Sockeye Salmon during juvenile migration from freshwater to the ocean, and during return migration back to the spawning grounds.

In pacea we include two Fraser River discharge data sets, both measured at Hope, British Columbia:

  1. fraser_discharge_mean - monthly mean discharge data
  2. fraser_discharge_peak - monthly peak discharge data

Both data sets are derived from measurements at the Hope station and provide monthly time series from 1912 onwards, downloaded from Environment and Climate Change Canada. The data are of class pacea_index and contain measurements in cubic meters per second (m³/s). See ?fraser_discharge_mean for further details.

Mean discharge data

The mean discharge values are the monthly averages:

fraser_discharge_mean
#> # A tibble: 1,360 × 3
#>     year month value
#>    <dbl> <dbl> <dbl>
#>  1  1912     3  485.
#>  2  1912     4 1154.
#>  3  1912     5 4989.
#>  4  1912     6 6128 
#>  5  1912     7 4781.
#>  6  1912     8 3961.
#>  7  1912     9 2162.
#>  8  1912    10 1531.
#>  9  1912    11 1065.
#> 10  1912    12  761.
#> # ℹ 1,350 more rows
tail(fraser_discharge_mean)
#> # A tibble: 6 × 3
#>    year month value
#>   <dbl> <dbl> <dbl>
#> 1  2025     1 1131.
#> 2  2025     2  802.
#> 3  2025     3 1141.
#> 4  2025     4 2354 
#> 5  2025     5 3959.
#> 6  2025     6 5224.

The columns are year and month (1-12), and value, which is the mean over the month of the daily means (calculated from measurements throughout the day), in m³/s.

summary(fraser_discharge_mean)
#>       year          month            value        
#>  Min.   :1912   Min.   : 1.000   Min.   :  482.2  
#>  1st Qu.:1940   1st Qu.: 3.750   1st Qu.: 1045.8  
#>  Median :1968   Median : 6.000   Median : 1938.2  
#>  Mean   :1968   Mean   : 6.494   Mean   : 2710.7  
#>  3rd Qu.:1997   3rd Qu.: 9.000   3rd Qu.: 3914.5  
#>  Max.   :2025   Max.   :12.000   Max.   :10752.3

Built-in plotting functions are included in pacea, with automatic axis labelling:

plot(fraser_discharge_mean)

This plot shows the long-term patterns in monthly mean discharge, revealing both seasonal cycles and inter-annual variability.

Peak discharge data

The peak discharge data are monthly peaks calculated from daily mean values:

fraser_discharge_peak
#> # A tibble: 1,360 × 3
#>     year month value
#>    <dbl> <dbl> <int>
#>  1  1912     3   578
#>  2  1912     4  2070
#>  3  1912     5  6850
#>  4  1912     6  7420
#>  5  1912     7  6340
#>  6  1912     8  4390
#>  7  1912     9  3000
#>  8  1912    10  2030
#>  9  1912    11  1270
#> 10  1912    12   864
#> # ℹ 1,350 more rows
tail(fraser_discharge_peak)
#> # A tibble: 6 × 3
#>    year month value
#>   <dbl> <dbl> <int>
#> 1  2025     1  1470
#> 2  2025     2  1050
#> 3  2025     3  1360
#> 4  2025     4  2900
#> 5  2025     5  5590
#> 6  2025     6  6950

The columns are year and month (1-12), and value, which is the peak over the month of the daily means (calculated from measurements thoughout the day), in m³/s.

summary(fraser_discharge_peak)
#>       year          month            value      
#>  Min.   :1912   Min.   : 1.000   Min.   :  538  
#>  1st Qu.:1940   1st Qu.: 3.750   1st Qu.: 1440  
#>  Median :1968   Median : 6.000   Median : 2800  
#>  Mean   :1968   Mean   : 6.494   Mean   : 3643  
#>  3rd Qu.:1997   3rd Qu.: 9.000   3rd Qu.: 5320  
#>  Max.   :2025   Max.   :12.000   Max.   :15200
plot(fraser_discharge_peak)

The peak discharge plot shows the variability in monthly maximum flows, which is important for understanding flood conditions and extreme hydrological events.

Example analyses

That desribes the two data objects. The rest of this vignette provides example analyses that can be conducted.

Seasonal patterns

The Fraser River exhibits strong seasonal discharge patterns due to its snowmelt-dominated hydrological regime:

Calculate long-term statistics of monthly means and then monthly peaks:

monthly_mean_stats <- fraser_discharge_mean %>%
  group_by(month) %>%
  summarise(
    avg = mean(value),
    min = min(value),
    max = max(value)) %>%
  ungroup() %>%
  mutate(month_name = month.name[month])

monthly_mean_stats
#> # A tibble: 12 × 5
#>    month   avg   min    max month_name
#>    <dbl> <dbl> <dbl>  <dbl> <chr>     
#>  1     1  952.  516.  1855. January   
#>  2     2  898.  497.  2201. February  
#>  3     3  900.  482.  2563. March     
#>  4     4 1878.  676.  3807. April     
#>  5     5 5007. 2694.  9107. May       
#>  6     6 6940. 4209. 10752. June      
#>  7     7 5477. 2547.  9601. July      
#>  8     8 3445. 2014.  6437. August    
#>  9     9 2302. 1289   4456  September 
#> 10    10 1924.  924.  3458. October   
#> 11    11 1632.  727.  2933  November  
#> 12    12 1138.  540.  2416. December

monthly_peak_stats <- fraser_discharge_peak %>%
  group_by(month) %>%
  summarise(
    avg = mean(value),
    min = min(value),
    max = max(value)) %>%
  ungroup() %>%
  mutate(month_name = month.name[month])

monthly_peak_stats
#> # A tibble: 12 × 5
#>    month   avg   min   max month_name
#>    <dbl> <dbl> <int> <int> <chr>     
#>  1     1 1313.   555  3870 January   
#>  2     2 1167.   555  3210 February  
#>  3     3 1182.   538  5160 March     
#>  4     4 3293.   917  8240 April     
#>  5     5 7251.  3840 15200 May       
#>  6     6 8408.  4570 14800 June      
#>  7     7 6873.  3170 11100 July      
#>  8     8 4441.  2290  7650 August    
#>  9     9 3030.  1610  6260 September 
#> 10    10 2660.  1180  5320 October   
#> 11    11 2393.   912  5370 November  
#> 12    12 1651.   694  4210 December

Now plot the average seasonal cycle

par(mfrow = c(2, 1))

y_lim = c(0,
          max(c(monthly_mean_stats$avg, monthly_peak_stats$avg)))

plot(monthly_mean_stats$month,
     monthly_mean_stats$avg,
     type = "l",
     lwd = 2,
     xlab = "Month",
     ylab = "Average daily mean discharge (m³/s)",
     ylim = y_lim,
     main = "Average seasonal cycle - mean discharge",
     xaxt = "n")
axis(1, at = 1:12, labels = month.abb)

plot(monthly_peak_stats$month,
     monthly_peak_stats$avg,
     type = "l",
     lwd = 2,
     col = "red",
     xlab = "Month",
     ylab = "Average peak discharge (m³/s)",
     main = "Average seasonal cycle - peak discharge",
     ylim = y_lim,
     xaxt = "n")
axis(1, at = 1:12, labels = month.abb)

Months with highest mean or highest peak discharge:

fraser_discharge_mean %>%
  arrange(desc(value))
#> # A tibble: 1,360 × 3
#>     year month  value
#>    <dbl> <dbl>  <dbl>
#>  1  1972     6 10752.
#>  2  1948     6 10737 
#>  3  1964     6 10219.
#>  4  1967     6  9962.
#>  5  1920     7  9601.
#>  6  1997     6  9582.
#>  7  2012     6  9400.
#>  8  1921     6  9317 
#>  9  2002     6  9303 
#> 10  2011     6  9166.
#> # ℹ 1,350 more rows

fraser_discharge_peak %>%
  arrange(desc(value))
#> # A tibble: 1,360 × 3
#>     year month value
#>    <dbl> <dbl> <int>
#>  1  1948     5 15200
#>  2  1948     6 14800
#>  3  1972     6 12900
#>  4  1950     6 12500
#>  5  2012     6 11700
#>  6  1964     6 11600
#>  7  1955     6 11300
#>  8  1997     6 11300
#>  9  1921     6 11100
#> 10  1955     7 11100
#> # ℹ 1,350 more rows

Months with lowest mean or lowest peak discharge:

fraser_discharge_mean %>%
  arrange(value)
#> # A tibble: 1,360 × 3
#>     year month value
#>    <dbl> <dbl> <dbl>
#>  1  1917     3  482.
#>  2  1912     3  485.
#>  3  1929     2  497.
#>  4  1919     3  497.
#>  5  1929     3  505.
#>  6  1913     1  516.
#>  7  1929     1  520.
#>  8  1937     2  528.
#>  9  2001     3  537.
#> 10  1928    12  540.
#> # ℹ 1,350 more rows

fraser_discharge_peak %>%
  arrange(value)
#> # A tibble: 1,360 × 3
#>     year month value
#>    <dbl> <dbl> <int>
#>  1  1917     3   538
#>  2  1929     1   555
#>  3  1929     2   555
#>  4  1917     2   558
#>  5  1937     2   566
#>  6  1929     3   575
#>  7  1912     3   578
#>  8  1927     3   592
#>  9  1919     3   612
#> 10  2023     3   624
#> # ℹ 1,350 more rows

Annual statistics

Annual statistics based on the monthly means, and also the annual peak (being the maximum monthly peak each year):

annual_mean_stats <- fraser_discharge_mean %>%
  group_by(year) %>%
  summarise(
    annual_mean = mean(value),
    annual_min = min(value),
    annual_max = max(value)) %>%
  ungroup()

# Calculate annual peaks
annual_peak <- fraser_discharge_peak %>%
  group_by(year) %>%
  summarise(
    annual_peak = max(value)) %>%
  ungroup()

annual_summary <- annual_mean_stats %>%
  left_join(annual_peak,
            by = "year")

annual_summary
#> # A tibble: 114 × 5
#>     year annual_mean annual_min annual_max annual_peak
#>    <dbl>       <dbl>      <dbl>      <dbl>       <int>
#>  1  1912       2702.       485.      6128         7420
#>  2  1913       2806.       516.      8282.       10300
#>  3  1914       2910.       787.      7144.        8550
#>  4  1915       2262.       585.      5021.        5800
#>  5  1916       2503.       543.      6582.        8720
#>  6  1917       2702.       482.      7880         8980
#>  7  1918       3046.       837       7971.        9770
#>  8  1919       2628.       497.      6930.        8520
#>  9  1920       3261.       648.      9601.       10800
#> 10  1921       3202.       824.      9317        11100
#> # ℹ 104 more rows
annual_summary %>% tail()
#> # A tibble: 6 × 5
#>    year annual_mean annual_min annual_max annual_peak
#>   <dbl>       <dbl>      <dbl>      <dbl>       <int>
#> 1  2020       3605.       872.      8639.       10600
#> 2  2021       2957.      1157.      7643         9640
#> 3  2022       2941.       589.      8940        10400
#> 4  2023       1943.       579.      7174.        8970
#> 5  2024       2097.       763.      4230         4990
#> 6  2025       2435.       802.      5224.        6950