16 Structure & Function: Fish Community Condition

Data Type: Tabular Data (within eco_indicators)

Spatial Scope: Maritimes

Duration 1970-2022

Source: Bundy et al. 2017

16.1 Introduction to Indicator

Fulton’s Condition factor (TW 1904) is a ratio of body weight to length, or the relative “plumpness” of fish. Fulton’s condition is calculated as condition = 100 * weight / length^3, and is used for a proximal for fish health. Higher condition factors represent fish that are heavier at a given length, and are assumed to be in better condition. However, Fulton’s condition does not always correlate with more precise measures of fish body condition, especially when the assumption of isometric growth is violated.

While comparisons of Fulton’s condition between species or subgroups might be hindered by inherent differences in mass to length ratios between group, comparisons of Fulton’s condition can be made between individuals within a species or in aggregate for a species over time to capture overall trends or indicate resource limitations or excesses (Ricker 1975). Fulton’s condition can also change seasonally, representing variation in nutritional resources available throughout the year in seasonal environments.

Here, condition is presented at the community level. Fulton’s Community Condition index is calculated from the abundance (A) weighted mean weight (W) at length (L) by species (j) from information in the survey as:

\[ \frac{\sum_{j=1}^{l} (K_j \cdot A_j)} {\sum_{j=1}^{l} A_j} \]

where

\[ K_j = \frac{W_j}{L_j^3} \times 100 \]

(Bundy, Gomez, and Cook 2017)

16.2 View Data


library(tidyr)
library(plotly)
library(stringr)

plotly_df <- data@data %>% inner_join(global_cols3)

# function to create plot with dropdown menu ------------------------------
make_biomass_dropdown_plot <- function(df,
                                      year_col   = "year",
                                      region_col = "region",
                                      value_suffix = "_value") {

  # convert to long format
  long <- df %>%
    janitor::clean_names() %>%
    pivot_longer(
      cols = ends_with(value_suffix),
      names_to = "metric",
      values_to = "value"
    ) %>%
    # remove suffix
    mutate(
      metric = str_remove(metric, "_value")
    ) %>%
    # drop NAs (some regions don't have data for some variables or years)
    tidyr::drop_na(value)

  # find all metrics and regions
  metrics <- unique(long$metric)
  regions <- unique(long[[region_col]])

  # clean names for dropdown panels, helper
  pretty_label <- function(x) str_to_title(gsub("_", " ", x)) %>% gsub("Lb","Large B",.) %>% gsub("Mb","Medium B",.) %>% str_replace("C Condition ","")

  # build plot -----------------
  p <- plot_ly()

 # add line traces
  for (metric_i in seq_along(metrics)) {
    m <- metrics[metric_i]
    
    for (region_i in regions) {
      dat <- long %>%
        filter(metric == m, .data[[region_col]] == region_i) 
      
      group_name <- unique(dat$region_group)
      color <- unique(dat$color)
      linetype <- unique(dat$linetype)
      width <- unique(dat$linewidth)
      
      # If a region truly has no data for that metric, add an empty trace
      # (keeps trace indexing stable)
      if (nrow(dat) == 0) {
        dat <- tibble::tibble(!!year_col := integer(0), value = numeric(0))
      }
      
      p <- p %>% add_lines(
        data = dat,
        x = ~.data[[year_col]],
        y = ~value,
        name = as.character(region_i),
        legendgroup = group_name,
        legendgrouptitle = list(
          text = ifelse(group_name == "ESS",
                        "Eastern Scotian Shelf Zones",
                        "Western Scotian Shelf Zones"
          )),
        showlegend = (metric_i == 1),
        visible = (metric_i == 1),
        line = list(color = color, dash = linetype),
        hovertemplate = paste0("<b>", region_i,":</b> ","%{y:.3f}<extra></extra>")      )
      
    }
  }

  n_regions <- length(regions)
  n_traces  <- length(metrics) * n_regions

  buttons <- lapply(seq_along(metrics), function(metric_i) {
    vis <- rep(FALSE, n_traces)
    shl <- rep(FALSE, n_traces)

    idx_start <- (metric_i - 1) * n_regions + 1
    idx_end   <- metric_i * n_regions
    vis[idx_start:idx_end] <- TRUE
    shl[idx_start:idx_end] <- TRUE

    list(
      method = "update",
      args = list(
        list(visible = vis, showlegend = shl),
        list(
          title = pretty_label(metrics[metric_i]),
          yaxis = list(title = "Community Condition")
        )
      ),
      label = pretty_label(metrics[metric_i])
    )
  })

  p %>%
    layout(
      barmode = "stack",
      hovermode = "x unified",
      title = pretty_label(metrics[1]),
      xaxis = list(title = str_to_title(year_col)),  # keep one bar per year
      yaxis = list(title = "Community Condition", fixedrange = TRUE),
      legend = list(
        x = 1.02, xanchor = "left",
        y = 1,    yanchor = "top",
        groupclick = "toggleitem",
        itemdoubleclick = FALSE
      ),
      updatemenus = list(list(
        type = "dropdown",
        x = -.1, xanchor = "left",
        y = 1.15, yanchor = "top",
        buttons = buttons
      )),
      margin = list(r = 180, t = 80),
            # add horizontal line at 1
      shapes = list(
        type = "line",
        xref = "paper", 
        yref = "y",     
        x0 = 0,        
        x1 = 1,        
        y0 = 1,         
        y1 = 1,         
        line = list(color = "black", width = 2, dash = "dash") 
      )
    )
}

# usage:
p <- make_biomass_dropdown_plot(plotly_df)
p <- p %>% config(displayModeBar= F)
  
p

Figure 16.1: Community condition in all NAFO regions and Scotian Shelf regions overall.

16.4 Relevance to Research and Stock Assessments

Fulton’s condition at the scale of fish stocks reveals several insights into stock health. For cod, stocks with higher Fulton’s condition factors have higher recruitment potential, and higher biological management reference points for safe exploitation without collapse (Fmed) (Rätz and Lloret 2003).

16.5 Variable Definitions

Table 16.2: Definitions of eco_indicators CConditions variables.
Variable Description Unit
year Year of trawl surveys
region Region over which data are summarized
CCondition_{taxon}_value Fulton’s Condition Index 100*Weight/Length3

16.6 Additional Data

CCondition (within eco_indicators) contains data for 4VN, 4VS, 4W, 4X, ESS, and WSS. All are shown on this page, but note that NAFO divisions are nested within Scotian Shelf regions.

16.7 Get the Data

library(marea)
data('eco_indicators')
plot(eco_indicators)

References

Bundy, Alida, Catalina Gomez, and Adam M. Cook. 2017. “Guidance Framework for the Selection and Evaluation of Ecological Indicators.” Canadian Technical Report of Fisheries and Aquatic Sciences 3232. Dartmouth, Nova Scotia, Canada: Fisheries; Oceans Canada, Bedford Institute of Oceanography. https://waves-vagues.dfo-mpo.gc.ca/Library/40648886.pdf.
Rätz, Hans-Joachim, and Josep Lloret. 2003. “Variation in Fish Condition Between Atlantic Cod (Gadus Morhua) Stocks, the Effect on Their Productivity and Management Implications.” Fisheries Research 60 (2-3): 369–80.
Ricker, William Edwin. 1975. “Computation and Interpretation of Biological Statistics of Fish Populations.” Fish. Res. Board Can. Bull. 191: 1–382.
TW, FULTON. 1904. “The Rate of Growth of Fishes.” Twenty-Second Annual Report, 141–241.