Results: Bathymetry

Applying the IF-depth model to the inundation frequency across the middle-lower Amazon, the calculated bathymetry of the floodplain lakes ranges from 1.8m to 6.9m with respect to the high-water season. The shallowest depth starts at 1.8m because data points with IF under 50% were excluded.

Code
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import rasterio as rio
import geopandas as gpd

# Import bathymetry
bathymetry = rio.open("../data/bathymetry.tif")

# Read into a NumPy array (only 1 band)
bathymetry_np = bathymetry.read(1)

# Open hydropoly shapefile
hydropoly_crop = gpd.read_file("../data/Hydropoly/hydropoly_crop.shp")

# Ensure same crs
hydropoly_crop = hydropoly_crop.to_crs(epsg=bathymetry.crs.to_epsg())

# Get the bounds of bathymetry
minx, miny, maxx, maxy = bathymetry.bounds;  # (left, bottom, right, top)

# Define color breaks
breaks2 = [1.763977570002549,
 3.4,
 5.2,
 6.1,
 6.900649783627833];

# Define palette
amazon_palette = ["#F1A790","#DD6F78","#BF6476","#8E6781"];
cmap = mcolors.LinearSegmentedColormap.from_list('custom_cmap', list(zip(np.linspace(0, 1, len(amazon_palette)), amazon_palette)));
norm = mcolors.BoundaryNorm(breaks2, cmap.N);

# Plot
fig, ax = plt.subplots(figsize=(12, 8))
img = ax.imshow(bathymetry_np,cmap=cmap, extent=[minx, maxx, miny, maxy],norm=norm);

# Add the river polygon
hydropoly_crop.plot(ax=ax, facecolor="#355B7C", edgecolor="none",zorder=2)

# Set background to beige
fig.patch.set_facecolor("#F9F8F2")
ax.set_facecolor("#F9F8F2")

# Create an inset axes for the colorbar in the bottom right
cax = ax.inset_axes([0.8, 0.05, 0.15, 0.03])  # [x, y, width, height]

# Colorbar
cbar = fig.colorbar(img, cax=cax, orientation='horizontal', shrink=0.3)
cbar.ax.set_title("Depth (m)", fontsize=10, fontname='Raleway', pad=4) # Title
cbar.outline.set_linewidth(0) # Remove the black outline
cbar.ax.tick_params(size=0) # Remove ticks
cbar.set_ticklabels(['1.8','','','','6.9']) # Custom tick labels
cbar.ax.xaxis.set_tick_params(pad=4) # Tick labels

# Define Avenir font properties
avenir_font = fm.FontProperties(family='Avenir',size=15)

# Change tick label font and size
for label in cbar.ax.get_xticklabels():
    label.set_fontproperties(avenir_font)

# Title and layout
plt.title("The Amazon River's floodplain lakes", fontsize=18, fontweight="bold", loc="left", pad = 10, x=0.05,y=0.85, fontname='Raleway')

# Remove axes for clean aesthetics
ax.axis("off")

plt.rcParams['figure.dpi'] = 300 

plt.show()

Figure 1: Bathymetry of middle-lower Amazon

Zooming into the 12 lakes of interest, they have varying depths. Most lakes lie on the alluvial plain, the flat surface along the river banks formed from deposition of sediments over time. These lakes are large, round, and more shallow (lakes 1, 2, 5, 6, 9, 10, 11). However, some lakes are incised in valleys, lying near the foot of the upland rocks, hence are generally deeper (lakes 3, 8, 12). Interestingly, lakes 4 and 7 are divided into half by a thick ridge, where the lower half nearer to the alluvial plain is shallower, while the upper half nearer to the valleys is deeper.

Figure 2: Bathymetry of individual lakes