q45·intermediate

Is a sargassum seaweed mat drifting toward my beaches?

oceanbiospherepublic-healthtourism Datasets: 3 30–60 min

Sargassum is a free-floating brown seaweed that drifts across the open ocean in huge mats. Every year a giant belt of it crosses the tropical Atlantic and washes onto Caribbean and Gulf beaches, where it piles up, rots, and drives tourists away. Satellites can't reliably see the seaweed itself in a standard ocean-colour product. But they can measure chlorophyll-a, the green pigment in ocean plant life, and water rich in chlorophyll is a useful first hint of whether there's a lot of floating algae out there right now.

Is a sargassum seaweed mat drifting toward my beaches?

Sargassum is a free-floating brown seaweed that drifts across the open ocean in huge mats. Every year a giant belt of it crosses the tropical Atlantic and washes onto Caribbean and Gulf beaches, where it piles up, rots, and drives tourists away. Satellites can’t reliably see the seaweed itself in a standard ocean-colour product. But they can measure chlorophyll-a, the green pigment in ocean plant life, and water rich in chlorophyll is a useful first hint of whether there’s a lot of floating algae out there right now.

Which data to use, and how

Use this dataset: MODIS-Aqua chlorophyll (short name MODISA_L3m_CHL), which covers 2002 → today. It reports chlor_a, the amount of chlorophyll-a in the water (in milligrams per cubic metre), on a coarse ~9 km grid. It’s the easiest of this file’s datasets to work with: one variable, one free login. Later you can upgrade to PACE OCI (PACE_OCI_L3M), a newer instrument that sees colour in many more wavelengths and is genuinely better at spotting floating algae.

Then do four steps (the runnable code further down does all of this; this is just the idea):

  1. Pick the belt of water, a latitude/longitude box over the open ocean upwind of your coast, and the month you care about.
  2. Read the chlorophyll. Open the dataset and pull the chlor_a values inside your box. Note that the rows run north → south, the opposite of most maps.
  3. Get one number for the belt. Take the median chlorophyll across all the valid pixels in the box (median, not average, because a few extreme pixels can skew an average).
  4. Compare to clear water. Do the same for a clean open-ocean patch to the north and take the ratio. A belt several times richer than clear ocean is the kind of productive water that sargassum rides in on.

That’s the whole method. Below, “How a scientist answers this” names the exact tools, and the Run it cell does it live on synthetic data so you can see each step work.

What you can find out

  • Where the water is biologically “loaded” right now, and every month back to 2002. The chlor_a field is a coarse proxy for productive, algae-friendly water.
  • How the belt compares to open ocean. Contrast the belt’s median chlorophyll against a clearer reference patch to see how unusual a given month is. (Verified locally: over the belt (10–18 °N, 65–50 °W), MODIS-Aqua read a median of 0.136 mg/m³, about 2.7× higher than a clear patch to the north at 0.051 mg/m³, with the top 10% of belt pixels above 0.38 mg/m³.)
  • The seasonal march of the belt. Step month-by-month to watch productivity build through spring and peak in summer, the classic sargassum season.
  • Roughly which way conditions favour drift. Pair with MUR SST (sea-surface temperature, which reveals fronts and currents) to reason about whether enriched water is trending toward your coast.
  • A better detection upgrade path. Switch to PACE OCI for sharper floating-algae discrimination than MODIS allows.

What it can’t tell you

  • Whether a mat will actually land on your beach, or when. Chlorophyll shows water condition, not the position or path of a physical mat. Predicting where it drifts and lands needs a drift model fed by winds and currents. Colour alone can’t do it.
  • Floating seaweed vs. a plankton bloom. A high chlor_a reading can come from either. To truly separate floating mats from plankton-rich water you need the Floating Algae Index (FAI / AFAI), a different calculation (see the gotchas below).
  • How thick or heavy the mat is. Ocean colour gives no weight or tonnage, and beach impact depends on how much actually piles up.
  • Day-to-day or right-at-the-shore detail. This dataset is a coarse ~9 km composite. Shallow, cloudy, or muddy (turbid) coastal water is unreliable, and clouds leave gaps.
  • Health or clean-up specifics. Rotting sargassum releases hydrogen sulfide gas, and that risk needs on-the-ground air monitoring, not satellite colour.

Gotchas to watch for

  • Chlorophyll is a proxy, not the seaweed. chlor_a measures green plant pigment in the water, which floating sargassum correlates with but isn’t, so a rich reading might be plankton rather than mats. To pick out floating vegetation specifically, compute the Floating Algae Index (FAI / AFAI) from raw reflectance (the “L2” product) instead of chlorophyll.
  • The grid runs north → south. In this file the lat axis counts down from north, the reverse of what you’d guess. Slice it the wrong way and you’ll silently grab the wrong patch of ocean. Filter by the actual latitude values (lat >= S and lat <= N) rather than by row position.
  • Use the median, not the average. A handful of extreme pixels from cloud edges or sun glint can drag an average way up, throwing off your “belt richness” number. Taking the median of the valid (finite) pixels ignores those outliers.
  • The composite can be a whole-mission cumulative file. A returned granule might be one big average over the entire record instead of your month, leaving you comparing apples to a decade of oranges. Subset to your bounding box and check the time range of the granule you actually open.

The real-data code

The Run it cell above runs the method on synthetic data with no login. Below is the whole recipe against the real archive: search, open the NetCDF, read chlor_a, take the belt median, ratio it against clear open ocean, and plot the map. It needs a free Earthdata Login.

import earthaccess, numpy as np, xarray as xr
import matplotlib.pyplot as plt

earthaccess.login(strategy="netrc")          # free Earthdata Login

# 1. The belt of water upwind of the Caribbean, and the month you care about.
W, S, E, N = -65, 10, -50, 18                 # tropical-Atlantic sargassum belt
month = ("2023-06-01", "2023-07-01")          # sargassum season peaks Mar-Aug

# 2. Search OB.DAAC for the MODIS-Aqua chlorophyll composite covering the box.
grans = earthaccess.search_data(
    short_name="MODISA_L3m_CHL", temporal=month, bounding_box=(W, S, E, N))
print(f"found {len(grans)} granule(s)")

# 3. Open the gridded NetCDF and read chlor_a. lat runs NORTH -> SOUTH here, so
#    always filter on the actual lat/lon values, never on row position.
ds = xr.open_dataset(earthaccess.open(grans[:1])[0])
chl, lat, lon = ds["chlor_a"], ds["lat"], ds["lon"]
t = ds.attrs.get("time_coverage_start", "?")          # guard against a whole-mission file
print("granule time coverage starts:", t)

# 4. One number for the belt: MEDIAN over the valid pixels (median ignores the
#    cloud-edge / sun-glint outliers that would drag an average up).
def median_box(w, s, e, n):
    v = chl.where((lat >= s) & (lat <= n) & (lon >= w) & (lon <= e)).values
    v = v[np.isfinite(v)]
    return v, float(np.median(v))

belt, belt_med = median_box(W, S, E, N)
ref,  ref_med  = median_box(-50, 25, -35, 33)         # clear open ocean to the north
ratio = belt_med / ref_med

# 5. Verdict + a map of the belt.
verdict = "loaded — sargassum-friendly water" if ratio >= 2 else "near clear-ocean baseline"
print(f"belt chlor_a median {belt_med:.3f} mg/m3  vs open-ocean {ref_med:.3f} mg/m3"
      f"  -> {ratio:.1f}x  ({verdict})")

belt_grid = chl.where((lat >= S) & (lat <= N) & (lon >= W) & (lon <= E))
belt_grid.plot(norm=plt.matplotlib.colors.LogNorm(vmin=0.03, vmax=1.0), cmap="viridis")
plt.title(f"MODIS-Aqua chlor_a (belt median {belt_med:.3f} mg/m3, {ratio:.1f}x clear ocean)")
plt.tight_layout(); plt.show()

# Trust check: chlor_a is only a PROXY — for true floating mats compute the
# Floating Algae Index (FAI/AFAI) from the L2 reflectance product (see gotchas).

For true sargassum mapping, swap this chlorophyll approach for the FAI / AFAI index computed from the L2 reflectance product rather than chlor_a.

Where the data comes from

All from NASA through one free login (Earthdata Login). MODIS-Aqua chlorophyll and PACE OCI both come from the ocean-colour archive (OB.DAAC), delivered as gridded NetCDF files you can open lazily with xarray. The optional drift context, MUR SST (sea-surface temperature), comes from NASA’s physical-oceanography archive (PO.DAAC) and is free and separate.

Sources

How a scientist answers this
Parameters
MODIS-Aqua Level-3 mapped chlorophyll-a (MODISA_L3m_CHL, chlor_a, mg/m³, 2002–) as a coarse floating-algae/productivity proxy; PACE OCI L3M for better floating-algae discrimination; MUR SST (°C) for drift context. Compare the belt against a clear open-ocean reference patch rather than an absolute threshold.
Method
Compute the area-weighted median chlor_a over the belt box and over a clear reference box, report the belt-to-reference ratio and upper-decile pixels, and track the monthly series to follow the seasonal march; use SST gradients/currents to infer drift direction.
Validation
State plainly that chlorophyll cannot separate floating mats from plankton-rich water — true sargassum mapping uses the Floating Algae Index (FAI/AFAI) from L2 reflectance — and cross-check elevated months against PACE OCI and known belt climatology.
In plain EnglishOcean-color satellites can't see the seaweed directly, but the rich, productive water it rides in shows up as elevated chlorophyll you can compare to clearer open ocean.

Make it yours → Set your belt and reference boxes, the months of interest, and switch from MODIS chlorophyll to PACE OCI for sharper floating-algae detection.

🧪 Virtual Mock Lab stand-in data · runs in your browser · no login

A safe place to practise the method on MODISA_L3m_CHL. The code is the real earthaccess workflow, but we feed it stand-in data shaped like the real product — so you can run it, change the numbers, and break it without an account. When you want the real data, use the recipe under “The real-data code” above, or download the notebook below.

editable · runs in your browser
Recipe ready · not yet run The recipe and the Virtual Mock Lab above are ready to use. We haven't yet run this question end-to-end on real data, so it has no verified answer yet — only the questions we've actually computed carry one. That's the honest line between a method and a result.