Seamounts are basically islands that don’t reach the surface. They tend to attract lots of underwater life, especially when their peak is in shallow enough water to get a lot of sunlight. Because of that, fishermen target seamounts, and many have been overfished.
I wondered whether seamounts in international waters had more diverse ecosystems than seamounts in countries’ exclusive economic zones. Fortunately, there’s some great open data to examine that with.
library(tidyverse)
## -- Attaching packages ------------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.0.0 v purrr 0.2.5
## v tibble 1.4.2 v dplyr 0.7.6
## v tidyr 0.8.1 v stringr 1.3.1
## v readr 1.1.1 v forcats 0.3.0
## -- Conflicts ---------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(readr)
library(maps)
##
## Attaching package: 'maps'
## The following object is masked from 'package:purrr':
##
## map
library(sf)
## Linking to GEOS 3.6.1, GDAL 2.2.3, proj.4 4.9.3
download.file("http://seamounts.sdsc.edu/SeamountsTablesAsCSV.zip", destfile="./testdownload.zip")
filenames <- unzip("./testdownload.zip")
Those files are in a format that requires a lot of joining.
#To get what species were seen where:
#join OBSERVATIONS$NAME_ID to NAMES$NAME_ID to get what species where observed
OBSERVATIONS <- read_csv(filenames[2])
OBSERVATIONS <- select(OBSERVATIONS, OBSERVATION_ID, SAMPLE_ID, NAME_ID, COUNT)
NAMES <- read_csv(filenames[1])
NAMES <- select(NAMES, NAME_ID, KINGDOM, PHYLUM, CLASS, ORDER, FAMILY, GENUS, NAME)
data <- inner_join(OBSERVATIONS, NAMES)
#join OBSERVATIONS$SAMPLE_ID to SAMPLES$SAMPLE_ID
SAMPLES <- read_csv(filenames[6])
SAMPLES <- select(SAMPLES, SAMPLE_ID, SEAMOUNT_ID, START_DATE)
data <- inner_join(data, SAMPLES)
#join SAMPLES$SEAMOUNT_ID to SEAMOUNTS$SEAMOUNT_ID to get location
SEAMOUNTS <- read_csv(filenames[7])
SEAMOUNTS <- select(SEAMOUNTS, SEAMOUNT_ID, LATITUDE, LONGITUDE, SUMMIT_DEPTH)
data <- inner_join(data, SEAMOUNTS)
Once all the data is together, we can see we have 21000 observations of 4665 species at 258 seamounts.
I wonder, is there a relationship between how deep underwater a seamount’s top is and its species diversity?
speciescountdata <- data %>% group_by(SEAMOUNT_ID) %>% summarize(speciescount=n_distinct(NAME))
speciescountdata <- inner_join(speciescountdata, SEAMOUNTS)
#Use the negative of summit depth as the y-axis, to visually show depth underwater.
qplot(speciescountdata$speciescount, -(speciescountdata$SUMMIT_DEPTH))
There are more shallow sites where a lot of species have been found than deep sites where a lot of species have been found. But there are more shallow sites, period. And it doesn’t look like there’s any kind of straight-line relationship between depth and species count.
Important note: the more you look in one place, the more species you’ll find. This is called “sampling effort.” It is easier to look closer to shore and shallower underwater. I have made no attempt to control for sampling effort here or later. Ecologist friends, please do not feed me to bears.
I mentioned exclusive economic zones earlier. The UN keeps track of which waters each country has an exclusive right to mine, fish, etc.
Non-scripted bit: on http://www.marineregions.org/downloads.php, click ‘Maritime Boundaries v10’, click ‘download’ next to the file ‘World EEZ v10 (2018-02-21, 119 MB)’ and fill out the form. Then:
eez_full <- st_read("./World_EEZ_v10_20180221/eez_v10.shp")
## Reading layer `eez_v10' from data source `C:\Users\james\Desktop\Rprogramming\PRACTICE\Seamounts\World_EEZ_v10_20180221\eez_v10.shp' using driver `ESRI Shapefile'
## Simple feature collection with 283 features and 22 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -180 ymin: -85.5625 xmax: 180 ymax: 86.99401
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
speciescountdata_spatial <- speciescountdata %>%
st_as_sf(coords=c("LONGITUDE", "LATITUDE"), crs = "+proj=longlat") %>%
st_transform(crs=st_crs(eez_full))
seamounts_spatial <- speciescountdata %>%
st_as_sf(coords=c("LONGITUDE", "LATITUDE"), crs = "+proj=longlat") %>%
st_transform(crs=st_crs(eez_full))
seamounts_in_eezs <- st_join(eez_full, seamounts_spatial, left=T)
length(unique(seamounts_in_eezs$SEAMOUNT_ID))
## [1] 127
89 Of the 258 seamounts are in country’s EEZs.
seamounts_outside_eezs <- speciescountdata[!speciescountdata$SEAMOUNT_ID %in% seamounts_in_eezs$SEAMOUNT_ID,]
mean(seamounts_in_eezs$speciescount, na.rm=TRUE)
## [1] 45.19841
mean(seamounts_outside_eezs$speciescount, na.rm=TRUE)
## [1] 37.92424
An average of 43.3 species have been observed at each seamount in an EEZ, compared to 37.9 species at each EEZ outside EEZs. But that may reflect sampling effort. It’s easier to look near the coast than in international waters.
Where are the seamounts with the most species?
sovereign_dataframe <- as.data.frame(cbind(as.character(seamounts_in_eezs$Sovereign1), seamounts_in_eezs$speciescount))
sovereign_dataframe$V1 <- as.character(sovereign_dataframe$V1)
sovereign_dataframe$V2 <- as.numeric(sovereign_dataframe$V2)
na.omit(sovereign_dataframe) %>% group_by(V1) %>% summarize(mean=mean(V2)) %>%
ggplot() + geom_bar(aes(x=V1, y=mean), stat="identity") + coord_flip()
geoname_dataframe <- as.data.frame(cbind(as.character(seamounts_in_eezs$GeoName), seamounts_in_eezs$speciescount))
geoname_dataframe$V1 <- as.character(geoname_dataframe$V1)
geoname_dataframe$V1 <- str_replace_all(geoname_dataframe$V1, "Exclusive Economic Zone", "EEZ")
geoname_dataframe$V2 <- as.numeric(geoname_dataframe$V2)
na.omit(geoname_dataframe) %>% group_by(V1) %>% summarize(mean=mean(V2)) %>%
ggplot() + geom_bar(aes(x=V1, y=mean), stat="identity") + coord_flip()
map <- map_data(map="world")
ggplot() +
geom_polygon(data = map, aes(x=long, y = lat, group = group), fill="grey80") +
geom_point(data = speciescountdata, size=5, alpha=0.5, aes(x=LONGITUDE, y = LATITUDE, color=speciescount)) +
geom_sf(data=eez_full, color="violet", alpha=0.5) +
scale_color_distiller(palette="YlGnBu") +
theme_light() + theme(panel.grid=element_blank())